diff src/c/queue.c @ 859:60240acd15b9

Successfully starting FastCGI sessions with Apache
author Adam Chlipala <adamc@hcoop.net>
date Sat, 27 Jun 2009 12:38:23 -0400
parents
children 236dc296c32d
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/c/queue.c	Sat Jun 27 12:38:23 2009 -0400
@@ -0,0 +1,58 @@
+#include <stdlib.h>
+
+#include <pthread.h>
+
+typedef struct node {
+  int fd;
+  struct node *next;
+} *node;
+
+static node front = NULL, back = NULL;
+
+static int empty() {
+  return front == NULL;
+}
+
+static void enqueue(int fd) {
+  node n = malloc(sizeof(struct node));
+
+  n->fd = fd;
+  n->next = NULL;
+  if (back)
+    back->next = n;
+  else
+    front = n;
+  back = n;
+}
+
+static int dequeue() {
+  int ret = front->fd;
+
+  front = front->next;
+  if (!front)
+    back = NULL;
+
+  return ret;
+}
+
+static pthread_mutex_t queue_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t queue_cond = PTHREAD_COND_INITIALIZER;
+
+int uw_dequeue() {
+  int sock;
+
+  pthread_mutex_lock(&queue_mutex);
+  while (empty())
+    pthread_cond_wait(&queue_cond, &queue_mutex);
+  sock = dequeue();
+  pthread_mutex_unlock(&queue_mutex);
+
+  return sock;
+}
+
+void uw_enqueue(int new_fd) {
+  pthread_mutex_lock(&queue_mutex);
+  enqueue(new_fd);
+  pthread_cond_broadcast(&queue_cond);
+  pthread_mutex_unlock(&queue_mutex);
+}