The battle against bit rot continues!
[citadel.git] / citadel / threads.h
index 65c5689fac86c639e3e7a23458a6244a0a5dad85..28f73b520f5dc2278d6e36557a230b356a8d5968 100644 (file)
@@ -1,4 +1,3 @@
-/* $Id:$ */
 
 #ifndef THREADS_H
 #define THREADS_H
 
 #ifdef HAVE_DB_H
 #include <db.h>
-#elif defined(HAVE_DB4_DB_H)
-#include <db4/db.h>
-#else
-#error Neither <db.h> nor <db4/db.h> was found by configure. Install db4-devel.
+#error <db.h> was not found by configure. Install the Berkeley DB development package.
 #endif
 
 #include "server.h"
 #include "sysdep_decls.h"
 
-// #define THREADS_USESIGNALS
-
 /*
- * Thread stuff
+ * Things we need to keep track of per-thread instead of per-session
  */
-
-enum CtdlThreadState {
-       CTDL_THREAD_INVALID,
-       CTDL_THREAD_VALID,
-       CTDL_THREAD_CREATE,
-       CTDL_THREAD_CANCELLED,
-       CTDL_THREAD_EXITED,
-       CTDL_THREAD_STOPPING,
-       CTDL_THREAD_STOP_REQ,   /* Do NOT put any running states before this state */
-       CTDL_THREAD_SLEEPING,
-       CTDL_THREAD_BLOCKED,
-       CTDL_THREAD_RUNNING,
-       CTDL_THREAD_LAST_STATE
+struct thread_tsd {
+       DB_TXN *tid;            /* Transaction handle */
+       DBC *cursors[MAXCDB];   /* Cursors, for traversals... */
 };
-typedef struct CtdlThreadNode CtdlThreadNode;
-
-struct CtdlThreadNode{
-       citthread_t tid;                                /* id as returned by citthread_create() */
-       pid_t pid;                              /* pid, as best the OS will let us determine */
-       time_t when;                            /* When to start a scheduled thread */
-       struct CitContext *Context;             /* The session context that this thread mught be working on or NULL if none */
-       long number;                            /* A unigue number for this thread (not implimented yet) */
-       int wakefd_recv;                        /* An fd that this thread can sleep on (not implimented yet) */
-       int wakefd_send;                        /* An fd that this thread can send out on (Not implimented yet) */
-       int signal;                             /* A field to store a signal we caught. */
-       const char *name;                       /* A name for this thread */
-       void *(*thread_func) (void *arg);       /* The actual function that does this threads work */
-       void *user_args;                        /* Arguments passed to this threads work function */
-       long flags;                             /* Flags that describe this thread */
-       enum CtdlThreadState state;             /* Flag to show state of this thread */
-       time_t stop_ticker;                     /* A counter to determine how long it has taken for this thread to exit */
-       citthread_mutex_t ThreadMutex;          /* A mutex to sync this thread to others if this thread allows (also used for sleeping) */
-       citthread_cond_t ThreadCond;            /* A condition variable to sync this thread with others */
-       citthread_mutex_t SleepMutex;           /* A mutex for sleeping */
-       citthread_cond_t SleepCond;             /* A condition variable for sleeping */
-       citthread_attr_t attr;                  /* Attributes of this thread */
-       struct timeval start_time;              /* Time this thread was started */
-       struct timeval last_state_change;       /* Time when this thread last changed state */
-       double avg_sleeping;                    /* Average sleeping time */
-       double avg_running;                     /* Average running time */
-       double avg_blocked;                     /* Average blocked time */
-       double load_avg;                        /* Load average for this thread */
-       CtdlThreadNode *prev;           /* Previous thread in the thread table */
-       CtdlThreadNode *next;           /* Next thread in the thread table */
-} ;
-extern CtdlThreadNode *CtdlThreadList;
-
-typedef struct ThreadTSD ThreadTSD;
 
-struct ThreadTSD {
-       DB_TXN *tid;            /* Transaction handle */
-       DBC *cursors[MAXCDB];   /* Cursors, for traversals... */
-       CtdlThreadNode *self;   /* Pointer to this threads control structure */
-} ;
+extern struct thread_tsd masterTSD;
+#define TSD MyThread()
 
-extern double CtdlThreadLoadAvg;
-extern double CtdlThreadWorkerAvg;
-extern citthread_key_t ThreadKey;
+extern int num_workers;
+extern int active_workers;
+extern int server_shutting_down;
 
-void ctdl_thread_internal_init_tsd(void);
-void ctdl_internal_thread_gc (void);
-void ctdl_thread_internal_init(void);
-void ctdl_thread_internal_cleanup(void);
-void ctdl_thread_internal_calc_loadavg(void);
-void ctdl_thread_internal_free_tsd(void);
-CtdlThreadNode *ctdl_internal_create_thread(char *name, long flags, void *(*thread_func) (void *arg), void *args);
-void ctdl_thread_internal_check_scheduled(void);
-
-void InitialiseSemaphores(void);
+struct thread_tsd *MyThread(void);
 int try_critical_section (int which_one);
 void begin_critical_section (int which_one);
 void end_critical_section (int which_one);
 void go_threading(void);
+void InitializeMasterTSD(void);
+void CtdlThreadCreate(void *(*start_routine)(void*));
+
+
+extern pthread_mutex_t ThreadCountMutex;;
 
 #endif // THREADS_H