annotate src/c/queue.c @ 1099:118ab9641a64

ctextarea; s/header/include in the manual
author Adam Chlipala <adamc@hcoop.net>
date Tue, 29 Dec 2009 13:34:03 -0500
parents 60240acd15b9
children 236dc296c32d
rev   line source
adamc@859 1 #include <stdlib.h>
adamc@859 2
adamc@859 3 #include <pthread.h>
adamc@859 4
adamc@859 5 typedef struct node {
adamc@859 6 int fd;
adamc@859 7 struct node *next;
adamc@859 8 } *node;
adamc@859 9
adamc@859 10 static node front = NULL, back = NULL;
adamc@859 11
adamc@859 12 static int empty() {
adamc@859 13 return front == NULL;
adamc@859 14 }
adamc@859 15
adamc@859 16 static void enqueue(int fd) {
adamc@859 17 node n = malloc(sizeof(struct node));
adamc@859 18
adamc@859 19 n->fd = fd;
adamc@859 20 n->next = NULL;
adamc@859 21 if (back)
adamc@859 22 back->next = n;
adamc@859 23 else
adamc@859 24 front = n;
adamc@859 25 back = n;
adamc@859 26 }
adamc@859 27
adamc@859 28 static int dequeue() {
adamc@859 29 int ret = front->fd;
adamc@859 30
adamc@859 31 front = front->next;
adamc@859 32 if (!front)
adamc@859 33 back = NULL;
adamc@859 34
adamc@859 35 return ret;
adamc@859 36 }
adamc@859 37
adamc@859 38 static pthread_mutex_t queue_mutex = PTHREAD_MUTEX_INITIALIZER;
adamc@859 39 static pthread_cond_t queue_cond = PTHREAD_COND_INITIALIZER;
adamc@859 40
adamc@859 41 int uw_dequeue() {
adamc@859 42 int sock;
adamc@859 43
adamc@859 44 pthread_mutex_lock(&queue_mutex);
adamc@859 45 while (empty())
adamc@859 46 pthread_cond_wait(&queue_cond, &queue_mutex);
adamc@859 47 sock = dequeue();
adamc@859 48 pthread_mutex_unlock(&queue_mutex);
adamc@859 49
adamc@859 50 return sock;
adamc@859 51 }
adamc@859 52
adamc@859 53 void uw_enqueue(int new_fd) {
adamc@859 54 pthread_mutex_lock(&queue_mutex);
adamc@859 55 enqueue(new_fd);
adamc@859 56 pthread_cond_broadcast(&queue_cond);
adamc@859 57 pthread_mutex_unlock(&queue_mutex);
adamc@859 58 }