2 * threaded.c -- A simple multi-threaded FastCGI application.
6 static const char rcsid[] = "$Id: threaded.c,v 1.3 1999/07/30 19:09:46 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;
32 FCGX_Stream *in, *out, *err;
36 FCGX_InitRequest(&request);
40 static pthread_mutex_t accept_mutex = PTHREAD_MUTEX_INITIALIZER;
41 static pthread_mutex_t counts_mutex = PTHREAD_MUTEX_INITIALIZER;
43 pthread_mutex_lock(&accept_mutex);
44 rc = FCGX_Accept_r(&in, &out, &err, &envp, &request);
45 pthread_mutex_unlock(&accept_mutex);
50 server_name = FCGX_GetParam("SERVER_NAME", envp);
53 "Content-type: text/html\r\n"
55 "<title>FastCGI Hello! (multi-threaded C, fcgiapp library)</title>"
56 "<h1>FastCGI Hello! (multi-threaded C, fcgiapp library)</h1>"
58 "Request counts for %d threads running on host <i>%s</i><p><code>",
59 thread_id, THREAD_COUNT, server_name ? server_name : "?");
61 pthread_mutex_lock(&counts_mutex);
63 for (i = 0; i < THREAD_COUNT; i++)
64 FCGX_FPrintF(out, "%5d " , counts[i]);
65 pthread_mutex_unlock(&counts_mutex);
67 FCGX_Finish_r(&request);
76 pthread_t id[THREAD_COUNT];
80 for (i = 1; i < THREAD_COUNT; i++)
81 pthread_create(&id[i], NULL, doit, (void*)i);