Fixes for GNU threads (not working yet).
[yaz-moved-to-github.git] / server / statserv.c
index 18382ed..60fc8d3 100644 (file)
@@ -7,7 +7,19 @@
  *   Chas Woodfield, Fretwell Downing Informatics.
  *
  * $Log: statserv.c,v $
- * Revision 1.71  2001-03-21 12:43:36  adam
+ * Revision 1.75  2001-10-04 00:37:58  adam
+ * Fixes for GNU threads (not working yet).
+ *
+ * Revision 1.74  2001/10/03 23:55:18  adam
+ * GNU threads support.
+ *
+ * Revision 1.73  2001/06/28 09:27:06  adam
+ * Number of started sessions logged.
+ *
+ * Revision 1.72  2001/03/25 21:55:13  adam
+ * Added odr_intdup. Ztest server returns TaskPackage for ItemUpdate.
+ *
+ * Revision 1.71  2001/03/21 12:43:36  adam
  * Implemented cs_create_host. Better error reporting for SSL comstack.
  *
  * Revision 1.70  2001/02/01 08:52:26  adam
 #include <direct.h>
 #include "service.h"
 #else
+
+#ifdef _REENTRANT
 #if HAVE_PTHREAD_H
 #include <pthread.h>
+#elif HAVE_PTH_H
+#include <pth.h>
+#endif
 #endif
+
 #include <unistd.h>
 #include <pwd.h>
 #endif
@@ -587,6 +605,7 @@ void sigterm(int sig)
 }
 
 static void *new_session (void *vp);
+static int no_sessions = 0;
 
 /* UNIX listener */
 static void listener(IOCHAN h, int event)
@@ -602,6 +621,7 @@ static void listener(IOCHAN h, int event)
        {
            int res;
 
+            ++no_sessions;
            if (pipe(hand) < 0)
            {
                yaz_log(LOG_FATAL|LOG_ERRNO, "pipe");
@@ -694,8 +714,11 @@ static void listener(IOCHAN h, int event)
            close(hand[1]);
        }
        else
+       {
            iochan_setflags(h, EVENT_INPUT | EVENT_EXCEPT); /* reset listener */
-
+           ++no_sessions;
+       }
+#ifdef _REENTRANT
 #if HAVE_PTHREAD_H
        if (control_block.threads)
        {
@@ -705,6 +728,26 @@ static void listener(IOCHAN h, int event)
        }
        else
            new_session(new_line);
+#elif HAVE_PTH_H
+       if (control_block.threads)
+       {
+           pth_attr_t attr;
+           pth_t child_thread;
+
+            attr = pth_attr_new ();
+            pth_attr_set (attr, PTH_ATTR_JOINABLE, FALSE);
+            pth_attr_set (attr, PTH_ATTR_STACK_SIZE, 32*1024);
+            pth_attr_set (attr, PTH_ATTR_NAME, "session");
+            yaz_log (LOG_LOG, "pth_spawn");
+           child_thread = pth_spawn (attr, new_session, new_line);
+#if 0
+            pth_attr_destroy (attr);
+#endif
+       }
+       else
+           new_session(new_line);
+#endif
+
 #else
        new_session(new_line);
 #endif
@@ -755,7 +798,7 @@ static void *new_session (void *vp)
     iochan_setdata(new_chan, newas);
     iochan_settimeout(new_chan, control_block.idle_timeout * 60);
     a = cs_addrstr(new_line);
-    yaz_log(LOG_LOG, "Accepted connection from %s", a ? a : "[Unknown]");
+    yaz_log(LOG_LOG, "Starting session %d from %s", no_sessions, a ? a : "[Unknown]");
     
     if (control_block.threads)
     {
@@ -816,6 +859,17 @@ static void add_listener(char *where, int what)
     COMSTACK l;
     void *ap;
     IOCHAN lst = NULL;
+    const char *mode;
+
+    if (control_block.dynamic)
+       mode = "dynamic";
+    else if (control_block.threads)
+       mode = "threaded";
+    else
+       mode = "static";
+
+    yaz_log(LOG_LOG, "Adding %s %s listener on %s", mode,
+           what == PROTO_SR ? "SR" : "Z3950", where);
 
     l = cs_create_host(where, 0, &ap);
     if (!l)
@@ -968,7 +1022,7 @@ int check_options(int argc, char **argv)
            control_block.dynamic = 0;
            break;
        case 'T':
-#if HAVE_PTHREAD_H
+#if _REENTRANT
            control_block.dynamic = 0;
            control_block.threads = 1;
 #else