cchan
This is a small library that implements a "channel" construct for inter-thread
communication in C programs.
Each channel is a FIFO of fixed-length messages.
The FIFO will grow to make space for unread messages; the write operation will
never block.
Multiple threads can write into one channel at once.
Multiple threads can read from one channel at once - but each message is
received only once. If there are multiple parallel readers, a random reader
will get each message.
There are two versions of the cchan library (with the same API): one for
pthread, and one for SDL.
License
Copyright (C) 2010 Máté Nagy <mnagy@port70.net>
This code is in the public domain.
Downloads
You can download the current version of cchan from the Subversion repository:
$ svn co svn://repo.hu/cchan
There may be some packaged releases as well.
API
#include "cchan_pthread.h"
(or)
#include "cchan_sdl.h"
cchan_t * cchan_new(int valuesize);
/* This call creates a new channel.
* valuesize specifies the message size that the channel will use.
*/
void cchan_free(cchan_t *chan);
/* Destroys the given channel.
* This call is not thread-safe.
*/
void cchan_send(cchan_t *chan, void *value);
/* Writes the given message to the channel.
* The message is copied from the given pointer - as many bytes as specified
* in the parameter of cchan_new.
*/
int cchan_recv(cchan_t *chan, void *output);
/* Tries to receive a message from a channel.
* This call doesn't block.
* If no message is available, it returns 0.
* If a message is available, it is taken from the FIFO and copied to *output;
* the call returns nonzero.
*/
void cchan_wait(cchan_t *chan, void *output);
/* Receives a message from a channel.
* This call blocks indefinitely until a message is available.
* The message is copied to *output.
*/
int cchan_waittime(cchan_t *chan, void *output, int ms);
/* This call waits up to ms milliseconds for a message to arrive on the channel.
* If a message arrives, it is copied to *output and the call returns nonzero.
* If no message arrives, the call returns zero after at least ms milliseconds
* have elapsed.
*/