#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() */
* %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);
}
-#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
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;
if (CC->buffering == 0) {
CC->buffering = 1;
CC->buffer_len = 0;
- CC->output_buffer = mallok(SIZ);
+ CC->output_buffer = malloc(SIZ);
}
}
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;
}
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;
}
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;
if ((*node)->tid == self) {
tmp = *node;
*node = (*node)->next;
- phree(tmp);
+ free(tmp);
break;
}
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;
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))
* 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);