|
@@ -328,27 +328,18 @@ static pthread_mutex_t job_mutex;
|
|
|
/* semaphre to trigger job processing */
|
|
/* semaphre to trigger job processing */
|
|
|
static sem_t job_sem;
|
|
static sem_t job_sem;
|
|
|
|
|
|
|
|
-/* list of input sockets */
|
|
|
|
|
-xs_list *job_sockets = NULL;
|
|
|
|
|
|
|
+/* fifo of jobs */
|
|
|
|
|
+xs_list *job_fifo = NULL;
|
|
|
|
|
|
|
|
-/* list of queue items */
|
|
|
|
|
-xs_list *job_qitems = NULL;
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
|
-void job_post(FILE *socket, const xs_dict *q_item)
|
|
|
|
|
-/* posts a job, being an input connection or another queue item */
|
|
|
|
|
|
|
+void job_post(const xs_val *job)
|
|
|
|
|
+/* posts a job for the threads to process it */
|
|
|
{
|
|
{
|
|
|
/* lock the mutex */
|
|
/* lock the mutex */
|
|
|
pthread_mutex_lock(&job_mutex);
|
|
pthread_mutex_lock(&job_mutex);
|
|
|
|
|
|
|
|
- /* add to the appropriate fifo */
|
|
|
|
|
- if (socket != NULL) {
|
|
|
|
|
- xs *d = xs_data_new(&socket, sizeof(FILE *));
|
|
|
|
|
- job_sockets = xs_list_append(job_sockets, d);
|
|
|
|
|
- }
|
|
|
|
|
- else
|
|
|
|
|
- if (q_item != NULL)
|
|
|
|
|
- job_qitems = xs_list_append(job_qitems, q_item);
|
|
|
|
|
|
|
+ /* add to the fifo */
|
|
|
|
|
+ job_fifo = xs_list_append(job_fifo, job);
|
|
|
|
|
|
|
|
/* unlock the mutex */
|
|
/* unlock the mutex */
|
|
|
pthread_mutex_unlock(&job_mutex);
|
|
pthread_mutex_unlock(&job_mutex);
|
|
@@ -358,39 +349,21 @@ void job_post(FILE *socket, const xs_dict *q_item)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
-int job_wait(FILE **socket, xs_dict **q_item)
|
|
|
|
|
-/* waits for an available job; returns 0 if nothing left to do */
|
|
|
|
|
|
|
+void job_wait(xs_val **job)
|
|
|
|
|
+/* waits for an available job */
|
|
|
{
|
|
{
|
|
|
- int done = 1;
|
|
|
|
|
-
|
|
|
|
|
- *socket = NULL;
|
|
|
|
|
- *q_item = NULL;
|
|
|
|
|
|
|
+ *job = NULL;
|
|
|
|
|
|
|
|
if (sem_wait(&job_sem) == 0) {
|
|
if (sem_wait(&job_sem) == 0) {
|
|
|
/* lock the mutex */
|
|
/* lock the mutex */
|
|
|
pthread_mutex_lock(&job_mutex);
|
|
pthread_mutex_lock(&job_mutex);
|
|
|
|
|
|
|
|
- /* try first to get a socket to process */
|
|
|
|
|
- xs *job_socket = NULL;
|
|
|
|
|
- job_sockets = xs_list_shift(job_sockets, &job_socket);
|
|
|
|
|
-
|
|
|
|
|
- /* if empty, try a q_item */
|
|
|
|
|
- if (job_socket == NULL)
|
|
|
|
|
- job_qitems = xs_list_shift(job_qitems, q_item);
|
|
|
|
|
|
|
+ /* dequeue */
|
|
|
|
|
+ job_fifo = xs_list_shift(job_fifo, job);
|
|
|
|
|
|
|
|
/* unlock the mutex */
|
|
/* unlock the mutex */
|
|
|
pthread_mutex_unlock(&job_mutex);
|
|
pthread_mutex_unlock(&job_mutex);
|
|
|
-
|
|
|
|
|
- if (job_socket != NULL) {
|
|
|
|
|
- xs_data_get(job_socket, socket);
|
|
|
|
|
- done = 0;
|
|
|
|
|
- }
|
|
|
|
|
- else
|
|
|
|
|
- if (*q_item != NULL)
|
|
|
|
|
- done = 0;
|
|
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- return done;
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -426,8 +399,7 @@ void httpd(void)
|
|
|
/* initialize the job control engine */
|
|
/* initialize the job control engine */
|
|
|
pthread_mutex_init(&job_mutex, NULL);
|
|
pthread_mutex_init(&job_mutex, NULL);
|
|
|
sem_init(&job_sem, 0, 0);
|
|
sem_init(&job_sem, 0, 0);
|
|
|
- job_sockets = xs_list_new();
|
|
|
|
|
- job_qitems = xs_list_new();
|
|
|
|
|
|
|
+ job_fifo = xs_list_new();
|
|
|
|
|
|
|
|
#ifdef _SC_NPROCESSORS_ONLN
|
|
#ifdef _SC_NPROCESSORS_ONLN
|
|
|
/* get number of CPUs on the machine */
|
|
/* get number of CPUs on the machine */
|
|
@@ -461,8 +433,7 @@ void httpd(void)
|
|
|
/* wait for the background thread to end */
|
|
/* wait for the background thread to end */
|
|
|
pthread_join(threads[0], NULL);
|
|
pthread_join(threads[0], NULL);
|
|
|
|
|
|
|
|
- job_sockets = xs_free(job_sockets);
|
|
|
|
|
- job_qitems = xs_free(job_qitems);
|
|
|
|
|
|
|
+ job_fifo = xs_free(job_fifo);
|
|
|
|
|
|
|
|
srv_log(xs_fmt("httpd stop %s:%d", address, port));
|
|
srv_log(xs_fmt("httpd stop %s:%d", address, port));
|
|
|
}
|
|
}
|