2 * threaded.c -- A simple multi-threaded FastCGI application.
6 static const char rcsid[] = "$Id: threaded.c,v 1.4 1999/08/02 18:11:50 roberts Exp $";
9 #include "fcgi_config.h"
24 #define THREAD_COUNT 20
26 static int counts[THREAD_COUNT];
28 static void *doit(void *a)
30 int rc, i, thread_id = (int)a;
33 FCGX_Stream *in, *out, *err;
37 FCGX_InitRequest(&request);
41 static pthread_mutex_t accept_mutex = PTHREAD_MUTEX_INITIALIZER;
42 static pthread_mutex_t counts_mutex = PTHREAD_MUTEX_INITIALIZER;
44 /* Some platforms require accept() serialization, some don't.. */
45 pthread_mutex_lock(&accept_mutex);
46 rc = FCGX_Accept_r(&in, &out, &err, &envp, &request);
47 pthread_mutex_unlock(&accept_mutex);
52 server_name = FCGX_GetParam("SERVER_NAME", envp);
55 "Content-type: text/html\r\n"
57 "<title>FastCGI Hello! (multi-threaded C, fcgiapp library)</title>"
58 "<h1>FastCGI Hello! (multi-threaded C, fcgiapp library)</h1>"
59 "Thread %d, Process %ld<p>"
60 "Request counts for %d threads running on host <i>%s</i><p><code>",
61 thread_id, pid, THREAD_COUNT, server_name ? server_name : "?");
65 pthread_mutex_lock(&counts_mutex);
67 for (i = 0; i < THREAD_COUNT; i++)
68 FCGX_FPrintF(out, "%5d " , counts[i]);
69 pthread_mutex_unlock(&counts_mutex);
71 FCGX_Finish_r(&request);
80 pthread_t id[THREAD_COUNT];
84 for (i = 1; i < THREAD_COUNT; i++)
85 pthread_create(&id[i], NULL, doit, (void*)i);