Loading camogm.c +24 −6 Original line number Original line Diff line number Diff line Loading @@ -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) { { Loading Loading @@ -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); Loading Loading @@ -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 */ } } } } Loading Loading @@ -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; Loading Loading @@ -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); } } } /** /** Loading Loading @@ -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; } camogm.h +5 −4 Original line number Original line Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 */ camogm_read.c +11 −34 Original line number Original line Diff line number Diff line Loading @@ -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); Loading Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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 Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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) Loading Loading @@ -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; Loading @@ -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); } } Loading Loading @@ -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) { Loading Loading
camogm.c +24 −6 Original line number Original line Diff line number Diff line Loading @@ -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) { { Loading Loading @@ -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); Loading Loading @@ -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 */ } } } } Loading Loading @@ -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; Loading Loading @@ -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); } } } /** /** Loading Loading @@ -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; }
camogm.h +5 −4 Original line number Original line Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 */
camogm_read.c +11 −34 Original line number Original line Diff line number Diff line Loading @@ -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); Loading Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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 Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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) Loading Loading @@ -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; Loading @@ -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); } } Loading Loading @@ -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) { Loading