コード例 #1
0
ファイル: datastream.c プロジェクト: senojsitruc/Static
/**
 * 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;
}
コード例 #2
0
ファイル: nfdumpp.c プロジェクト: Lukas955/nf-tools
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;
}