diff options
author | Rainer Gerhards <rgerhards@adiscon.com> | 2008-01-03 09:44:54 +0000 |
---|---|---|
committer | Rainer Gerhards <rgerhards@adiscon.com> | 2008-01-03 09:44:54 +0000 |
commit | 29d9729292d44d2827054a1aef27278f3dadd57e (patch) | |
tree | dcede7f015fd4c4d1ef7ccd311a505bfdc79e1c2 /threads.c | |
parent | a05de60a5670c759b5dbe6e60bbac8fe9332420d (diff) | |
download | rsyslog-29d9729292d44d2827054a1aef27278f3dadd57e.tar.gz rsyslog-29d9729292d44d2827054a1aef27278f3dadd57e.tar.xz rsyslog-29d9729292d44d2827054a1aef27278f3dadd57e.zip |
moved queue code to its own module (finally)
Diffstat (limited to 'threads.c')
-rw-r--r-- | threads.c | 88 |
1 files changed, 0 insertions, 88 deletions
@@ -41,10 +41,6 @@ #include "linkedlist.h" #include "threads.h" -/* static data */ -int iMainMsgQueueSize; -msgQueue *pMsgQueue = NULL; - /* linked list of currently-known threads */ static linkedList_t llThrds; @@ -263,90 +259,6 @@ thrdSleep(thrdInfo_t *pThis, int iSeconds, int iuSeconds) } -/* queue functions (may be migrated to some other file...) - */ - - -msgQueue *queueInit (void) -{ - msgQueue *q; - - q = (msgQueue *)malloc(sizeof(msgQueue)); - if (q == NULL) return (NULL); - if((q->pbuf = malloc(sizeof(void *) * iMainMsgQueueSize)) == NULL) { - free(q); - return NULL; - } - - q->empty = 1; - q->full = 0; - q->head = 0; - q->tail = 0; - q->mut = (pthread_mutex_t *) malloc (sizeof (pthread_mutex_t)); - pthread_mutex_init (q->mut, NULL); - q->notFull = (pthread_cond_t *) malloc (sizeof (pthread_cond_t)); - pthread_cond_init (q->notFull, NULL); - q->notEmpty = (pthread_cond_t *) malloc (sizeof (pthread_cond_t)); - pthread_cond_init (q->notEmpty, NULL); - - return (q); -} - -void queueDelete (msgQueue *q) -{ - pthread_mutex_destroy (q->mut); - free (q->mut); - pthread_cond_destroy (q->notFull); - free (q->notFull); - pthread_cond_destroy (q->notEmpty); - free (q->notEmpty); - free(q->pbuf); - free (q); -} - - -/* In queueAdd() and queueDel() we have a potential race condition. If a message - * is dequeued and at the same time a message is enqueued and the queue is either - * full or empty, the full (or empty) indicator may be invalidly updated. HOWEVER, - * this does not cause any real problems. No queue pointers can be wrong. And even - * if one of the flags is set invalidly, that does not pose a real problem. If - * "full" is invalidly set, at mose one message might be lost, if we are already in - * a timeout situation (this is quite acceptable). And if "empty" is accidently set, - * the receiver will not continue the inner loop, but break out of the outer. So no - * harm is done at all. For this reason, I do not yet use a mutex to guard the two - * flags - there would be a notable performance hit with, IMHO, no gain in stability - * or functionality. But anyhow, now it's documented... - * rgerhards, 2007-09-20 - * NOTE: this comment does not really apply - the callers handle the mutex, so it - * *is* guarded. - */ -void queueAdd (msgQueue *q, void* in) -{ - q->pbuf[q->tail] = in; - q->tail++; - if (q->tail == iMainMsgQueueSize) - q->tail = 0; - if (q->tail == q->head) - q->full = 1; - q->empty = 0; - - return; -} - -void queueDel(msgQueue *q, void **out) -{ - *out = (void*) q->pbuf[q->head]; - - q->head++; - if (q->head == iMainMsgQueueSize) - q->head = 0; - if (q->head == q->tail) - q->empty = 1; - q->full = 0; - - return; -} - /* * vi:set ai: */ |