Commit cb60ae2d authored by Mikhail Karpenko's avatar Mikhail Karpenko
Browse files

Fix open file descriptor check

parent 4d5a1967
Loading
Loading
Loading
Loading
+24 −6
Original line number Original line Diff line number Diff line
@@ -146,6 +146,7 @@ void setGValue(unsigned int port, unsigned long GNumber, unsigned long value);
unsigned int select_port(camogm_state *states);
unsigned int select_port(camogm_state *states);
inline void set_chn_state(camogm_state *s, unsigned int port, unsigned int new_state);
inline void set_chn_state(camogm_state *s, unsigned int port, unsigned int new_state);
inline int is_chn_active(camogm_state *s, unsigned int port);
inline int is_chn_active(camogm_state *s, unsigned int port);
void clean_up(camogm_state *state);


void put_uint16(void *buf, u_int16_t val)
void put_uint16(void *buf, u_int16_t val)
{
{
@@ -216,6 +217,7 @@ void camogm_init(camogm_state *state, char *pipe_name, uint16_t port_num)


	// reading thread has not been started yet, mutex lock is not necessary
	// reading thread has not been started yet, mutex lock is not necessary
	state->prog_state = STATE_STOPPED;
	state->prog_state = STATE_STOPPED;
	state->rawdev.thread_state = STATE_STOPPED;


	// kml stuff
	// kml stuff
	camogm_kml_set_horHalfFov(state, 20.0);
	camogm_kml_set_horHalfFov(state, 20.0);
@@ -812,7 +814,7 @@ void camogm_set_prefix(camogm_state *state, const char * p, path_type type)
			D0(fprintf(debug_file, "WARNING: raw device write initiated\n"));
			D0(fprintf(debug_file, "WARNING: raw device write initiated\n"));
			state->rawdev_op = 1;
			state->rawdev_op = 1;
			/* debug code follows */
			/* debug code follows */
			state->rawdev.end_pos = (uint64_t)4096 * (uint64_t)1048576;
			state->rawdev.end_pos = (uint64_t)128 * (uint64_t)1048576;
			/* end of debug code */
			/* end of debug code */
		}
		}
	}
	}
@@ -1220,6 +1222,7 @@ int parse_cmd(camogm_state *state, FILE* npipe)
	} else if (strcmp(cmd, "exit") == 0) {
	} else if (strcmp(cmd, "exit") == 0) {
		camogm_stop(state);
		camogm_stop(state);
		camogm_free(state);
		camogm_free(state);
		clean_up(state);
		exit(0);
		exit(0);
	} else if (strcmp(cmd, "duration") == 0) {
	} else if (strcmp(cmd, "duration") == 0) {
		if (!(args) || (((d = strtol(args, NULL, 10))) <= 0)) d = DEFAULT_DURATION;
		if (!(args) || (((d = strtol(args, NULL, 10))) <= 0)) d = DEFAULT_DURATION;
@@ -1354,22 +1357,26 @@ int parse_cmd(camogm_state *state, FILE* npipe)
}
}


/**
/**
 * @brief This function closes open files and deletes allocated memory.
 * @brief This function closes open files, terminates reading thread and deletes allocated memory.
 * @param[in]   state   pointer to #camogm_state structure for a particular sensor channel
 * @param[in]   state   pointer to #camogm_state structure for a particular sensor channel
 * return       None
 * return       None
 */
 */
void clean_up(camogm_state *state)
void clean_up(camogm_state *state)
{
{
	for (int port = 0; port < SENSOR_PORTS; port++) {
	for (int port = 0; port < SENSOR_PORTS; port++) {
		if (state->fd_exif[port] > 0)
		if (is_fd_valid(state->fd_exif[port]))
			close(state->fd_exif[port]);
			close(state->fd_exif[port]);
		if (state->fd_head[port] > 0)
		if (is_fd_valid(state->fd_head[port]))
			close(state->fd_head[port]);
			close(state->fd_head[port]);
		if (state->fd_circ[port] > 0)
		if (is_fd_valid(state->fd_circ[port]))
			close(state->fd_circ[port]);
			close(state->fd_circ[port]);
		if (state->fd_fparmsall[port])
		if (is_fd_valid(state->fd_fparmsall[port]))
			close(state->fd_fparmsall[port]);
			close(state->fd_fparmsall[port]);
	}
	}

	if (state->rawdev.thread_state != STATE_STOPPED) {
		pthread_cancel(state->rawdev.tid);
	}
}
}


/**
/**
@@ -1788,3 +1795,14 @@ int isDaemonEnabled(unsigned int port, int daemonBit) // <0 - use default
	if ((daemonBit >= 0) && (daemonBit < 32)) lastDaemonBit[port] = daemonBit;
	if ((daemonBit >= 0) && (daemonBit < 32)) lastDaemonBit[port] = daemonBit;
	return ((framePars[port][GLOBALPARS(port, G_THIS_FRAME) & PARS_FRAMES_MASK].pars[P_DAEMON_EN] & (1 << lastDaemonBit[port])) != 0);
	return ((framePars[port][GLOBALPARS(port, G_THIS_FRAME) & PARS_FRAMES_MASK].pars[P_DAEMON_EN] & (1 << lastDaemonBit[port])) != 0);
}
}

/**
 * @brief Check if file descriptor is valid. This function is used to check if file
 * is opened before closing it.
 * @param[in]   fd   file descriptor to check
 * @return      1 if descriptor is valid and 0 otherwise
 */
inline int is_fd_valid(int fd)
{
	return fcntl(fd, F_GETFD) != -1 || errno != EBADF;
}
+5 −4
Original line number Original line Diff line number Diff line
@@ -93,16 +93,16 @@ enum state_flags {
 * Current read position in raw device buffer
 * Current read position in raw device buffer
 * @var rawdev_buffer::curr_pos_w
 * @var rawdev_buffer::curr_pos_w
 * Current write position in raw device buffer
 * Current write position in raw device buffer
 * @var rawdevice_buffer::mmap_default_size
 * @var rawdev_buffer::mmap_default_size
 * The default size of memory mapped disk region
 * The default size of memory mapped disk region
 * @var rawdevice_buffer::mmap_current_size
 * @var rawdev_buffer::mmap_current_size
 * The size of currently memory mapped disk region. Can be less then #mmap_default_size
 * The size of currently memory mapped disk region. Can be less then #mmap_default_size
 * @var rawdevice_buffer::mmap_offset
 * @var rawdev_buffer::mmap_offset
 * Current offset (in bytes) from the beginning of raw device buffer
 * Current offset (in bytes) from the beginning of raw device buffer
 * @var rawdev_buffer::file_start
 * @var rawdev_buffer::file_start
 * Pointer to the beginning of current file. This pointer is set during raw device reading and
 * Pointer to the beginning of current file. This pointer is set during raw device reading and
 * updated every time new file is found.
 * updated every time new file is found.
 * @var rawdevice_buffer::tid
 * @var rawdev_buffer::tid
 * The ID of raw device reading thread
 * The ID of raw device reading thread
 * @var rawdev_buffer::thread_state
 * @var rawdev_buffer::thread_state
 * The state of the reading thread. Used to interrupt current operation
 * The state of the reading thread. Used to interrupt current operation
@@ -229,5 +229,6 @@ unsigned long getGPValue(unsigned int port, unsigned long GPNumber);
void setGValue(unsigned int port, unsigned long GNumber, unsigned long value);
void setGValue(unsigned int port, unsigned long GNumber, unsigned long value);
int waitDaemonEnabled(unsigned int port, int daemonBit);
int waitDaemonEnabled(unsigned int port, int daemonBit);
int isDaemonEnabled(unsigned int port, int daemonBit);
int isDaemonEnabled(unsigned int port, int daemonBit);
int is_fd_valid(int fd);


#endif /* _CAMOGM_H */
#endif /* _CAMOGM_H */
+11 −34
Original line number Original line Diff line number Diff line
@@ -461,7 +461,7 @@ static int read_index(rawdev_buffer *rawdev, struct disk_index **indx)
				node->port = (uint32_t)ifd_page_num.offset;
				node->port = (uint32_t)ifd_page_num.offset;
			}
			}
			if (ifd_date_time.len != 0) {
			if (ifd_date_time.len != 0) {
				struct tm tm;
				struct tm tm = {0};
				exif_get_text(rawdev, &ifd_date_time, str_buff);
				exif_get_text(rawdev, &ifd_date_time, str_buff);
				strptime(str_buff, EXIF_DATE_TIME_FORMAT, &tm);
				strptime(str_buff, EXIF_DATE_TIME_FORMAT, &tm);
				node->rawtime = mktime(&tm);
				node->rawtime = mktime(&tm);
@@ -883,7 +883,6 @@ static int find_in_window(rawdev_buffer *rawdev, const struct range *wnd, struct
	int pos_start, pos_stop;
	int pos_start, pos_stop;


	if (mmap_disk(rawdev, (const struct range *)wnd) == 0) {
	if (mmap_disk(rawdev, (const struct range *)wnd) == 0) {
		fprintf(debug_file, "Searching in mmapped window: from 0x%llx, to 0x%llx\n", wnd->from, wnd->from + rawdev->mmap_current_size);
		pos_start = find_marker(rawdev->disk_mmap, rawdev->mmap_current_size, elphel_st.iov_base, elphel_st.iov_len, 0);
		pos_start = find_marker(rawdev->disk_mmap, rawdev->mmap_current_size, elphel_st.iov_base, elphel_st.iov_len, 0);
		if (pos_start >= 0) {
		if (pos_start >= 0) {
			rawdev->file_start = rawdev->mmap_offset + pos_start;
			rawdev->file_start = rawdev->mmap_offset + pos_start;
@@ -894,10 +893,9 @@ static int find_in_window(rawdev_buffer *rawdev, const struct range *wnd, struct
				ret = 0;
				ret = 0;
			}
			}
		}
		}
		fprintf(debug_file, "\t%s: pos_start = %d, pos_stop = %d\n", __func__, pos_start, pos_stop);
		munmap_disk(rawdev);
		munmap_disk(rawdev);
	} else {
	} else {
		fprintf(debug_file, "Error mmaping region from 0x%llx to 0x%llx\n", wnd->from, wnd->to);
		D0(fprintf(debug_file, "ERROR: can not memory map region from 0x%llx to 0x%llx\n", wnd->from, wnd->to));
	}
	}


	return ret;
	return ret;
@@ -913,9 +911,8 @@ static int find_in_window(rawdev_buffer *rawdev, const struct range *wnd, struct
 * @return      A pointer to disk index node found or NULL if there were no close
 * @return      A pointer to disk index node found or NULL if there were no close
 * index candidates
 * index candidates
 */
 */
static struct disk_index *find_disk_index(rawdev_buffer *rawdev, struct disk_idir *idir, uint64_t *rawtime)
static struct disk_index *find_disk_index(rawdev_buffer *rawdev, struct disk_idir *idir, time_t *rawtime)
{
{
	bool indx_appended = false;
	bool process = true;
	bool process = true;
	struct range range;
	struct range range;
	struct range search_window;
	struct range search_window;
@@ -923,15 +920,6 @@ static struct disk_index *find_disk_index(rawdev_buffer *rawdev, struct disk_idi
	struct disk_index *indx_ret = NULL;
	struct disk_index *indx_ret = NULL;
	struct disk_index *nearest_indx = find_nearest_by_time((const struct disk_idir *)idir, *rawtime);
	struct disk_index *nearest_indx = find_nearest_by_time((const struct disk_idir *)idir, *rawtime);


	/* debug code follows */
	struct tm *tm = gmtime(rawtime);
	fprintf(debug_file, "%s: looking for offset near %04d-%02d-%02d %02d:%02d:%02d\n", __func__,
			tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
	uint64_t nr;
	nr = (nearest_indx == NULL) ? 0 : nearest_indx->f_offset;
	fprintf(debug_file, "Nearest index offset: 0x%llx\n", nr);
	/* end of debug code */

	// define disk offsets where search will be performed
	// define disk offsets where search will be performed
	if (nearest_indx == NULL) {
	if (nearest_indx == NULL) {
		range.from = rawdev->start_pos;
		range.from = rawdev->start_pos;
@@ -952,16 +940,12 @@ static struct disk_index *find_disk_index(rawdev_buffer *rawdev, struct disk_idi
		}
		}
	}
	}


	fprintf(debug_file, "Starting search in range: from 0x%llx, to 0x%llx\n", range.from, range.to);
	D6(fprintf(debug_file, "Starting search in range: from 0x%llx, to 0x%llx\n", range.from, range.to));


	while (process && get_search_window(&range, &search_window) == 0) {
	while (process && get_search_window(&range, &search_window) == 0) {
		indx_found = NULL;
		indx_found = NULL;
		indx_appended = false;
		fprintf(debug_file, "Search window: from 0x%llx, to 0x%llx\n", search_window.from, search_window.to);
		if (find_in_window(rawdev, &search_window, &indx_found) == 0) {
		if (find_in_window(rawdev, &search_window, &indx_found) == 0) {
			double time_diff = difftime(indx_found->rawtime, *rawtime);
			double time_diff = difftime(indx_found->rawtime, *rawtime);
			fprintf(debug_file, "Index found: time diff %f, file offset 0x%llx, rawtime found %ld, rawtime given %ld\n",
					time_diff, indx_found->f_offset, indx_found->rawtime, *rawtime);
			if (fabs(time_diff) > SEARCH_TIME_WINDOW) {
			if (fabs(time_diff) > SEARCH_TIME_WINDOW) {
				// the index found is not within search time window, update sparse index directory and
				// the index found is not within search time window, update sparse index directory and
				// define a new search window
				// define a new search window
@@ -980,10 +964,9 @@ static struct disk_index *find_disk_index(rawdev_buffer *rawdev, struct disk_idi
			// index is not found in the search window, move toward the start of the range
			// index is not found in the search window, move toward the start of the range
			range.to = search_window.from;
			range.to = search_window.from;
		}
		}
		fprintf(debug_file, "Updating range, new range: from 0x%llx, to 0x%llx\n", range.from, range.to);
	}
	}


	fprintf(debug_file, "\nSparse index directory dump, %d nodes:\n", idir->size);
	D6(fprintf(debug_file, "\nSparse index directory dump, %d nodes:\n", idir->size));
	dump_index_dir(idir);
	dump_index_dir(idir);


	return indx_ret;
	return indx_ret;
@@ -1014,7 +997,6 @@ void *reader(void *arg)
	size_t file_cntr;
	size_t file_cntr;
	camogm_state *state = (camogm_state *)arg;
	camogm_state *state = (camogm_state *)arg;
	rawdev_buffer *rawdev = &state->rawdev;
	rawdev_buffer *rawdev = &state->rawdev;
	struct stat stat_buff;
	struct range mmap_range;
	struct range mmap_range;
	struct disk_index *disk_indx, *cross_boundary_indx;
	struct disk_index *disk_indx, *cross_boundary_indx;
	struct disk_idir index_dir;
	struct disk_idir index_dir;
@@ -1160,7 +1142,6 @@ void *reader(void *arg)
						rng.from = index_sparse.curr_indx->f_offset + index_sparse.curr_indx->f_size;
						rng.from = index_sparse.curr_indx->f_offset + index_sparse.curr_indx->f_size;
						rng.to = rawdev->end_pos;
						rng.to = rawdev->end_pos;
					}
					}
					fprintf(debug_file, "Searching next file in rage from 0x%llx to 0x%llx\n", rng.from, rng.to);
					if (indx_ptr == NULL) {
					if (indx_ptr == NULL) {
						rng.from &= PAGE_BOUNDARY_MASK;
						rng.from &= PAGE_BOUNDARY_MASK;
						if (rng.to - rng.from > rawdev->mmap_default_size)
						if (rng.to - rng.from > rawdev->mmap_default_size)
@@ -1238,7 +1219,7 @@ void *reader(void *arg)
				D0(fprintf(debug_file, "Unrecognized command is skipped\n"));
				D0(fprintf(debug_file, "Unrecognized command is skipped\n"));
			}
			}
		}
		}
		if (fstat(fd, &stat_buff) != EBADF)
		if (is_fd_valid(fd))
			close(fd);
			close(fd);
		pthread_mutex_lock(&state->mutex);
		pthread_mutex_lock(&state->mutex);
		state->prog_state = STATE_STOPPED;
		state->prog_state = STATE_STOPPED;
@@ -1260,21 +1241,18 @@ void *reader(void *arg)
static inline void exit_thread(void *arg)
static inline void exit_thread(void *arg)
{
{
	struct exit_state *s = (struct exit_state *)arg;
	struct exit_state *s = (struct exit_state *)arg;
	struct stat buff;


	if (fstat(s->state->rawdev.rawdev_fd, &buff) != EBADF) {
	if (s->state->rawdev.disk_mmap != NULL)
	if (s->state->rawdev.disk_mmap != NULL)
		munmap(s->state->rawdev.disk_mmap, s->state->rawdev.mmap_current_size);
		munmap(s->state->rawdev.disk_mmap, s->state->rawdev.mmap_current_size);
	if (is_fd_valid(s->state->rawdev.rawdev_fd))
		close(s->state->rawdev.rawdev_fd);
		close(s->state->rawdev.rawdev_fd);
		s->state->rawdev.rawdev_fd = -1;
	}
	if (s->idir->size != 0)
	if (s->idir->size != 0)
		delete_idir(s->idir);
		delete_idir(s->idir);
	if (s->sparse_idir-> size != 0)
	if (s->sparse_idir-> size != 0)
		delete_idir(s->sparse_idir);
		delete_idir(s->sparse_idir);
	if (fstat(*s->sockfd_const, &buff) != EBADF)
	if (is_fd_valid(*s->sockfd_const))
		close(*s->sockfd_const);
		close(*s->sockfd_const);
	if (fstat(*s->sockfd_temp, &buff) != EBADF)
	if (is_fd_valid(*s->sockfd_temp))
		close(*s->sockfd_temp);
		close(*s->sockfd_temp);
}
}


@@ -1372,7 +1350,6 @@ static void build_index(camogm_state *state, struct disk_idir *idir)
				if (pos_start == MATCH_NOT_FOUND && pos_stop == MATCH_NOT_FOUND) {
				if (pos_start == MATCH_NOT_FOUND && pos_stop == MATCH_NOT_FOUND) {
					// normal condition, search in progress
					// normal condition, search in progress
					buff_processed = 1;
					buff_processed = 1;
//					D6(fprintf(debug_file, "State 'skip data'\n"));
				} else if (pos_start >= 0 && pos_stop >= 0 && pos_start > pos_stop) {
				} else if (pos_start >= 0 && pos_stop >= 0 && pos_start > pos_stop) {
					// normal condition, start marker following stop marker found - this indicates a new file
					// normal condition, start marker following stop marker found - this indicates a new file
					if (search_state == SEARCH_FILE_DATA) {
					if (search_state == SEARCH_FILE_DATA) {