On Tue, Dec 21, 2010 at 2:17 PM, AJ ONeal <coola...@gmail.com> wrote:
> I have a function to process data on a DSP which blocks
> and a network socket which gives data to process.

Not knowing the rest of the details, my first stab would probably be
to continue with your model of having a separate thread for handling
the blocking DSP interactions (1 thread per DSP if there's more than
one DSP).  You could implement a work queue that's locked with a
pthread mutex and has a pthread condition variable for signaling
readiness.  Might be interesting to track average workqueue length to
know if the DSP stuff is bottlenecking too.  Very rough pseudocode for
the lock/cond interaction (ignoring many complexities of any real
implementation, threads are tricky, you have to be careful about who
owns what data at any given time):

pthread_mutex_t workqueue_mutex;
pthread_cond_t workqueue_cond;

// main thread, libev callback for client socket data
client_data_recv() {
    // ... put received network data in some buffer ...
    pthread_lock(&workqueue_mutex);
    add_buffer_ptr_to_workqueue(mybufptr, workqueue);
    pthread_cond_signal(&workqueue_cond);
    pthread_unlock(&workqueue_mutex);
}

// DSP thread
mainloop() {
    while(1) {
        pthread_mutex_lock(&workqueue_mutex);
        if(queue_is_empty(workqueue))
            pthread_cond_wait(&workqueue_cond);
        remove_buffer_ptr_from_workqueue(mybufptr, workqueue);
        pthread_mutex_unlock(&workqueue_mutex);
        // ... process work item from mybufptr ...
    }
}

_______________________________________________
libev mailing list
libev@lists.schmorp.de
http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev

Reply via email to