/** * Waits for data objects to be pushed onto the incoming data queue. Pops a data object off the * queue and passes it to the 'feed' callback. Sleeps until more data is available. Repeat. * */ void* __datastream_thread (datastream_t *datastream) { int error; dataobject_t *dataobject; flist_t *queue; void *context; void *data; uint32_t size; if (unlikely(datastream == NULL)) LOG_ERROR_AND_RETURN(NULL, "null datastream_t"); dataobject = NULL; data = datastream->data; context = datastream->context; queue = &datastream->queue; while (!datastream->stop) { if (unlikely(0 != (error = flist_pop(queue, (cobject_t**)&dataobject)))) { LOG_ERROR_AND_RETURN(NULL, " failed to flist_pop(), %d", error); } else if (dataobject == NULL) { usleep(10000); continue; } memcpy(data, dataobject->data, (size = MIN(datastream->size,dataobject->size))); dataobject_release(dataobject); dataobject = NULL; if (likely(datastream->feed != NULL)) if (unlikely(0 != (error = (*datastream->feed)(context, size, data)))) LOG3("failed to datastream->feed, %d", error); } // release any data objects in our queue while (0 == (error = flist_pop(queue, (cobject_t**)&dataobject)) && dataobject != NULL) { dataobject_release(dataobject); dataobject = NULL; } return datastream; }
void *process_thread(void *p) { int rows; int tid; char filename[PATH_MAX]; // lnf_filter_t *filterp = NULL; tid = (int)pthread_self(); /* if (filter[0] != '\0') { switch (filter_type) { case NFDUMPP_FILTER_DEFAULT: lnf_filter_init(&filterp, filter); break; case NFDUMPP_FILTER_NFDUMP: lnf_filter_init_v1(&filterp, filter); break; case NFDUMPP_FILTER_LIBNF: lnf_filter_init_v2(&filterp, filter); break; default: fprintf(stderr, "This should never hapen line: %d\n", __LINE__); exit(1); break; } lnf_filter_init(&filterp, filter); if (filterp == NULL) { fprintf(stderr, "[#%x] Can not initialise filter %s\n", tid, filter); return 0; } } */ for (;;) { /* get next file */ pthread_mutex_lock(&mutex); if (!flist_pop(&flist, filename)) { pthread_mutex_unlock(&mutex); goto DONE; } progress_inc(progressp, 1); pthread_mutex_unlock(&mutex); /* process file */ rows = process_file(filename, filterp); pthread_mutex_lock(&mutex); totalrows += rows; pthread_mutex_unlock(&mutex); } DONE: if ( memp != NULL ) { lnf_mem_merge_threads(memp); } // lnf_filter_free(filterp); return NULL; }