Advertisement
Guest User

Untitled

a guest
Aug 29th, 2014
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 KB | None | 0 0
  1. /*
  2.  * threaded.c -- A simple multi-threaded FastCGI application.
  3.  */
  4.  
  5. #ifndef lint
  6. static const char rcsid[] = "$Id: threaded.c,v 1.9 2001/11/20 03:23:21 robs Exp $";
  7. #endif /* not lint */
  8.  
  9. #include "fcgi_config.h"
  10.  
  11. #include <pthread.h>
  12. #include <sys/types.h>
  13.  
  14. #ifdef HAVE_UNISTD_H
  15. #include <unistd.h>
  16. #endif
  17.  
  18. #include "fcgiapp.h"
  19.  
  20.  
  21. #define THREAD_COUNT 20
  22.  
  23. static int counts[THREAD_COUNT];
  24.  
  25. static void *doit(void *a)
  26. {
  27.     int rc, i, thread_id = (int)a;
  28.     pid_t pid = getpid();
  29.     FCGX_Request request;
  30.     char *server_name;
  31.  
  32.     FCGX_InitRequest(&request, 0, 0);
  33.  
  34.     for (;;)
  35.     {
  36.         static pthread_mutex_t accept_mutex = PTHREAD_MUTEX_INITIALIZER;
  37.         static pthread_mutex_t counts_mutex = PTHREAD_MUTEX_INITIALIZER;
  38.  
  39.         /* Some platforms require accept() serialization, some don't.. */
  40.         pthread_mutex_lock(&accept_mutex);
  41.         rc = FCGX_Accept_r(&request);
  42.         pthread_mutex_unlock(&accept_mutex);
  43.  
  44.         if (rc < 0)
  45.             break;
  46.  
  47.         server_name = FCGX_GetParam("SERVER_NAME", request.envp);
  48.  
  49.         FCGX_FPrintF(request.out,
  50.             "Content-type: text/html\r\n"
  51.             "\r\n"
  52.             "<title>FastCGI Hello! (multi-threaded C, fcgiapp library)</title>"
  53.             "<h1>FastCGI Hello! (multi-threaded C, fcgiapp library)</h1>"
  54.             "Thread %d, Process %ld<p>"
  55.             "Request counts for %d threads running on host <i>%s</i><p><code>",
  56.             thread_id, pid, THREAD_COUNT, server_name ? server_name : "?");
  57.  
  58.         sleep(2);
  59.  
  60.         pthread_mutex_lock(&counts_mutex);
  61.         ++counts[thread_id];
  62.         for (i = 0; i < THREAD_COUNT; i++)
  63.             FCGX_FPrintF(request.out, "%5d " , counts[i]);
  64.         pthread_mutex_unlock(&counts_mutex);
  65.  
  66.         FCGX_Finish_r(&request);
  67.     }
  68.  
  69.     return NULL;
  70. }
  71.  
  72. int main(void)
  73. {
  74.     int i;
  75.     pthread_t id[THREAD_COUNT];
  76.  
  77.     FCGX_Init();
  78.  
  79.     for (i = 1; i < THREAD_COUNT; i++)
  80.         pthread_create(&id[i], NULL, doit, (void*)i);
  81.  
  82.     doit(0);
  83.  
  84.     return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement