]> code.citadel.org Git - citadel.git/blobdiff - citadel/sysdep.c
* Removed the built-in memory leak checker. It wasn't threadsafe and
[citadel.git] / citadel / sysdep.c
index 061b9fee7937d751bf09f7cb758645ab9e7bfc35..4dc376679a317f00b89cbb2a08b9d9a228da2f12 100644 (file)
 #include "snprintf.h"
 #endif
 
-#ifdef DEBUG_MEMORY_LEAKS
-struct TheHeap *heap = NULL;
-#endif
-
 pthread_mutex_t Critters[MAX_SEMAPHORES];      /* Things needing locking */
 pthread_key_t MyConKey;                                /* TSD key for MyContext() */
 
@@ -135,18 +131,37 @@ void lprintf(enum LogLevel loglevel, const char *format, ...) {
                 * %03ld to %06ld and remove " / 1000" after tv.tv_usec.
                 */
                if (CC && CC->cs_pid) {
+#if 0
+                       /* Millisecond display */
                        fprintf(stderr,
                                "%04d/%02d/%02d %2d:%02d:%02d.%03ld [%3d] %s",
                                tim->tm_year + 1900, tim->tm_mon + 1,
                                tim->tm_mday, tim->tm_hour, tim->tm_min,
                                tim->tm_sec, (long)tv.tv_usec / 1000,
                                CC->cs_pid, buf);
+#endif
+                       /* Microsecond display */
+                       fprintf(stderr,
+                               "%04d/%02d/%02d %2d:%02d:%02d.%06ld [%3d] %s",
+                               tim->tm_year + 1900, tim->tm_mon + 1,
+                               tim->tm_mday, tim->tm_hour, tim->tm_min,
+                               tim->tm_sec, (long)tv.tv_usec,
+                               CC->cs_pid, buf);
                } else {
+#if 0
+                       /* Millisecond display */
                        fprintf(stderr,
                                "%04d/%02d/%02d %2d:%02d:%02d.%03ld %s",
                                tim->tm_year + 1900, tim->tm_mon + 1,
                                tim->tm_mday, tim->tm_hour, tim->tm_min,
                                tim->tm_sec, (long)tv.tv_usec / 1000, buf);
+#endif
+                       /* Microsecond display */
+                       fprintf(stderr,
+                               "%04d/%02d/%02d %2d:%02d:%02d.%06ld %s",
+                               tim->tm_year + 1900, tim->tm_mon + 1,
+                               tim->tm_mday, tim->tm_hour, tim->tm_min,
+                               tim->tm_sec, (long)tv.tv_usec, buf);
                }
                fflush(stderr);
        }
@@ -156,89 +171,6 @@ void lprintf(enum LogLevel loglevel, const char *format, ...) {
 
 
 
-#ifdef DEBUG_MEMORY_LEAKS
-void *tracked_malloc(size_t tsize, char *tfile, int tline) {
-       void *ptr;
-       struct TheHeap *hptr;
-
-       ptr = malloc(tsize);
-       if (ptr == NULL) {
-               lprintf(CTDL_ALERT, "DANGER!  mallok(%d) at %s:%d failed!\n",
-                       tsize, tfile, tline);
-               return(NULL);
-       }
-
-       hptr = (struct TheHeap *) malloc(sizeof(struct TheHeap));
-       strcpy(hptr->h_file, tfile);
-       hptr->h_line = tline;
-       hptr->next = heap;
-       hptr->h_ptr = ptr;
-       heap = hptr;
-       return ptr;
-}
-
-char *tracked_strdup(const char *orig, char *tfile, int tline) {
-       char *s;
-
-       s = tracked_malloc( (strlen(orig)+1), tfile, tline);
-       if (s == NULL) return NULL;
-
-       strcpy(s, orig);
-       return s;
-}
-
-void tracked_free(void *ptr) {
-       struct TheHeap *hptr, *freeme;
-
-       if (heap->h_ptr == ptr) {
-               hptr = heap->next;
-               free(heap);
-               heap = hptr;
-       }
-       else {
-               for (hptr=heap; hptr->next!=NULL; hptr=hptr->next) {
-                       if (hptr->next->h_ptr == ptr) {
-                               freeme = hptr->next;
-                               hptr->next = hptr->next->next;
-                               free(freeme);
-                       }
-               }
-       }
-
-       free(ptr);
-}
-
-void *tracked_realloc(void *ptr, size_t size) {
-       void *newptr;
-       struct TheHeap *hptr;
-       
-       newptr = realloc(ptr, size);
-
-       for (hptr=heap; hptr!=NULL; hptr=hptr->next) {
-               if (hptr->h_ptr == ptr) hptr->h_ptr = newptr;
-       }
-
-       return newptr;
-}
-
-
-void dump_tracked() {
-       struct TheHeap *hptr;
-
-       cprintf("%d Here's what's allocated...\n", LISTING_FOLLOWS);    
-       for (hptr=heap; hptr!=NULL; hptr=hptr->next) {
-               cprintf("%20s %5d\n",
-                       hptr->h_file, hptr->h_line);
-       }
-#ifdef __GNUC__
-        malloc_stats();
-#endif
-
-       cprintf("000\n");
-}
-#endif
-
-
 /*
  * We used to use master_cleanup() as a signal handler to shut down the server.
  * however, master_cleanup() and the functions it calls do some things that
@@ -442,7 +374,7 @@ INLINE struct CitContext *MyContext(void) {
 struct CitContext *CreateNewContext(void) {
        struct CitContext *me, *ptr;
 
-       me = (struct CitContext *) mallok(sizeof(struct CitContext));
+       me = (struct CitContext *) malloc(sizeof(struct CitContext));
        if (me == NULL) {
                lprintf(CTDL_ALERT, "citserver: can't allocate memory!!\n");
                return NULL;
@@ -505,7 +437,7 @@ void buffer_output(void) {
        if (CC->buffering == 0) {
                CC->buffering = 1;
                CC->buffer_len = 0;
-               CC->output_buffer = mallok(SIZ);
+               CC->output_buffer = malloc(SIZ);
        }
 }
 
@@ -516,7 +448,7 @@ void unbuffer_output(void) {
        if (CC->buffering == 1) {
                CC->buffering = 0;
                client_write(CC->output_buffer, CC->buffer_len);
-               phree(CC->output_buffer);
+               free(CC->output_buffer);
                CC->output_buffer = NULL;
                CC->buffer_len = 0;
        }
@@ -550,7 +482,7 @@ void client_write(char *buf, int nbytes)
        if (CC->buffering) {
                old_buffer_len = CC->buffer_len;
                CC->buffer_len += nbytes;
-               CC->output_buffer = reallok(CC->output_buffer, CC->buffer_len);
+               CC->output_buffer = realloc(CC->output_buffer, CC->buffer_len);
                memcpy(&CC->output_buffer[old_buffer_len], buf, nbytes);
                return;
        }
@@ -786,7 +718,7 @@ void create_worker(void) {
        struct worker_node *n;
        pthread_attr_t attr;
 
-       n = mallok(sizeof(struct worker_node));
+       n = malloc(sizeof(struct worker_node));
        if (n == NULL) {
                lprintf(CTDL_EMERG, "can't allocate worker_node, exiting\n");
                time_to_die = -1;
@@ -888,7 +820,7 @@ void dead_session_purge(void) {
                        if ((*node)->tid == self) {
                                tmp = *node;
                                *node = (*node)->next;
-                               phree(tmp);
+                               free(tmp);
                                break;
                        }
 
@@ -980,6 +912,8 @@ void *worker_thread(void *arg) {
        int i;
        char junk;
        int highest;
+       /* This is synchronized below; it helps implement round robin mode */
+       static struct CitContext* next_session = NULL;
        struct CitContext *ptr;
        struct CitContext *bind_me = NULL;
        fd_set readfds;
@@ -1115,7 +1049,16 @@ SETUP_FD:        memcpy(&readfds, &masterfds, sizeof masterfds);
                else {
                        bind_me = NULL;
                        begin_critical_section(S_SESSION_TABLE);
-                       for (ptr = ContextList;
+                       /*
+                        * We start where we left off.  If we get to the end
+                        * we'll start from the beginning again, then give up
+                        * if we still don't find anything.  This ensures
+                        * that all contexts get a more-or-less equal chance
+                        * to run. And yes, I did add a goto to the code. -IO
+                        */
+find_session:          if (next_session == NULL)
+                               next_session = ContextList;
+                       for (ptr = next_session;
                            ( (ptr != NULL) && (bind_me == NULL) );
                            ptr = ptr->next) {
                                if ( (FD_ISSET(ptr->client_socket, &readfds))
@@ -1128,6 +1071,13 @@ SETUP_FD:        memcpy(&readfds, &masterfds, sizeof masterfds);
                                 * letting anyone else touch the context list.
                                 */
                                bind_me->state = CON_EXECUTING;
+                               next_session = bind_me->next;
+                       } else if (next_session == ContextList) {
+                               next_session = NULL;
+                       }
+                       if (bind_me == NULL && next_session != NULL) {
+                               next_session = NULL;
+                               goto find_session;
                        }
 
                        end_critical_section(S_SESSION_TABLE);