From: Danny Mayer Date: Sun, 27 Nov 2005 23:33:06 +0000 (-0500) Subject: Upgrade recvbuf and transmitbuf to use ISC_LIST_* lists X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ea52ff8679597b0d2a2f20af720c4f294b4291df;p=thirdparty%2Fntp.git Upgrade recvbuf and transmitbuf to use ISC_LIST_* lists bk: 438a4232tC43NiF-M91Ra_Z66_UPTQ --- diff --git a/include/recvbuff.h b/include/recvbuff.h index 544ef5cfb0..e38fc7f2e4 100644 --- a/include/recvbuff.h +++ b/include/recvbuff.h @@ -9,6 +9,8 @@ #include "ntp_fp.h" #include "ntp_types.h" +#include + /* * recvbuf memory management */ @@ -45,8 +47,11 @@ extern HANDLE get_recv_buff_event P((void)); */ #define RX_BUFF_SIZE 1000 /* hail Mary */ + +typedef struct recvbuf recvbuf_t; + struct recvbuf { - struct recvbuf *next; /* next buffer in chain */ + ISC_LINK(recvbuf_t) link; union { struct sockaddr_storage X_recv_srcadr; caddr_t X_recv_srcclock; @@ -80,9 +85,6 @@ extern void init_recvbuff P((int)); */ extern void freerecvbuf P((struct recvbuf *)); - -extern struct recvbuf * getrecvbufs P((void)); - /* Get a free buffer (typically used so an async * read can directly place data into the buffer * diff --git a/libntp/recvbuff.c b/libntp/recvbuff.c index 2e2fc79488..3f0a480778 100644 --- a/libntp/recvbuff.c +++ b/libntp/recvbuff.c @@ -11,17 +11,18 @@ #include "recvbuff.h" #include "iosignal.h" +#include /* * Memory allocation */ -static u_long volatile full_recvbufs; /* number of recvbufs on fulllist */ -static u_long volatile free_recvbufs; /* number of recvbufs on freelist */ -static u_long volatile total_recvbufs; /* total recvbufs currently in use */ +static u_long volatile full_recvbufs; /* number of recvbufs on fulllist */ +static u_long volatile free_recvbufs; /* number of recvbufs on freelist */ +static u_long volatile total_recvbufs; /* total recvbufs currently in use */ static u_long volatile lowater_adds; /* number of times we have added memory */ -static struct recvbuf *volatile freelist; /* free buffers */ -static struct recvbuf *volatile fulllist; /* lifo buffers with data */ -static struct recvbuf *volatile beginlist; /* fifo buffers with data */ + +static ISC_LIST(recvbuf_t) full_list; /* Currently used recv buffers */ +static ISC_LIST(recvbuf_t) free_list; /* Currently unused buffers */ #if defined(HAVE_IO_COMPLETION_PORT) @@ -63,9 +64,9 @@ lowater_additions(void) } static void -initialise_buffer(struct recvbuf *buff) +initialise_buffer(recvbuf_t *buff) { - memset((char *) buff, 0, sizeof(struct recvbuf)); + memset((char *) buff, 0, sizeof(recvbuf_t)); #if defined HAVE_IO_COMPLETION_PORT buff->wsabuff.len = RX_BUFF_SIZE; @@ -74,123 +75,52 @@ initialise_buffer(struct recvbuf *buff) } static void -create_buffers(void) +create_buffers(int nbufs) { - register struct recvbuf *buf; + register recvbuf_t *buf; int i; - buf = (struct recvbuf *) - emalloc(RECV_INC*sizeof(struct recvbuf)); - for (i = 0; i < RECV_INC; i++) + buf = (recvbuf_t *) + emalloc(nbufs*sizeof(recvbuf_t)); + for (i = 0; i < nbufs; i++) { initialise_buffer(buf); - buf->next = (struct recvbuf *) freelist; - freelist = buf; + ISC_LIST_APPEND(free_list, buf, link); buf++; + free_recvbufs++; + total_recvbufs++; } - - free_recvbufs += RECV_INC; - total_recvbufs += RECV_INC; lowater_adds++; } void init_recvbuff(int nbufs) { - register struct recvbuf *buf; - int i; /* * Init buffer free list and stat counters */ - freelist = 0; - - buf = (struct recvbuf *) - emalloc(nbufs*sizeof(struct recvbuf)); - for (i = 0; i < nbufs; i++) - { - initialise_buffer(buf); - buf->next = (struct recvbuf *) freelist; - freelist = buf; - buf++; - } - - fulllist = 0; - free_recvbufs = total_recvbufs = nbufs; + ISC_LIST_INIT(full_list); + ISC_LIST_INIT(free_list); + free_recvbufs = total_recvbufs = 0; full_recvbufs = lowater_adds = 0; + create_buffers(nbufs); + #if defined(HAVE_IO_COMPLETION_PORT) InitializeCriticalSection(&RecvLock); #endif } - -/* - * getrecvbufs - get receive buffers which have data in them - * - * - */ - -struct recvbuf * -getrecvbufs(void) -{ - struct recvbuf *rb = NULL; /* nothing has arrived */; - - LOCK(); - if (full_recvbufs == 0) - { -#ifdef DEBUG - if (debug > 4) - printf("getrecvbufs called, no action here\n"); -#endif - } - else { - - /* - * Get the fulllist chain and mark it empty - */ -#ifdef DEBUG - if (debug > 4) - printf("getrecvbufs returning %ld buffers\n", full_recvbufs); -#endif - rb = beginlist; - fulllist = 0; - full_recvbufs = 0; - - /* - * Check to see if we're below the low water mark. - */ - if (free_recvbufs <= RECV_LOWAT) - { - if (total_recvbufs >= RECV_TOOMANY) - msyslog(LOG_ERR, "too many recvbufs allocated (%ld)", - total_recvbufs); - else - { - create_buffers(); - } - } - } - UNLOCK(); - - /* - * Return the chain - */ - return rb; -} - /* * freerecvbuf - make a single recvbuf available for reuse */ void -freerecvbuf( - struct recvbuf *rb - ) +freerecvbuf(recvbuf_t *rb) { LOCK(); BLOCKIO(); - rb->next = (struct recvbuf *) freelist; - freelist = rb; + ISC_LIST_APPEND(free_list, rb, link); free_recvbufs++; UNBLOCKIO(); UNLOCK(); @@ -198,67 +128,48 @@ freerecvbuf( void -add_full_recv_buffer( - struct recvbuf *rb - ) +add_full_recv_buffer(recvbuf_t *rb) { LOCK(); - if (full_recvbufs == 0) - { - beginlist = rb; - rb->next = 0; - } - else - { - rb->next = fulllist->next; - fulllist->next = rb; - } - fulllist = rb; + ISC_LIST_APPEND(full_list, rb, link); full_recvbufs++; - UNLOCK(); } -struct recvbuf * +recvbuf_t * get_free_recv_buffer(void) { - struct recvbuf * buffer = NULL; + recvbuf_t * buffer = NULL; LOCK(); - if (free_recvbufs <= RECV_LOWAT) - { - if (total_recvbufs >= RECV_TOOMANY) { - msyslog(LOG_ERR, "too many recvbufs allocated (%ld)", - total_recvbufs); - } - else - { - create_buffers(); - } - } - - if (free_recvbufs > 0) + if (free_recvbufs <= 0) { - buffer = freelist; - freelist = buffer->next; - buffer->next = NULL; - --free_recvbufs; + create_buffers(RECV_INC); + } + buffer = ISC_LIST_HEAD(free_list); + if (buffer == NULL) + { + msyslog(LOG_ERR, "free recvbufs was incorrect (%ld)", + free_recvbufs); + } + else + { + ISC_LIST_DEQUEUE(free_list, buffer, link); } - UNLOCK(); - return buffer; + return (buffer); } -struct recvbuf * +recvbuf_t * get_full_recv_buffer(void) { - struct recvbuf * buffer = NULL; + recvbuf_t *rbuf; LOCK(); - if (full_recvbufs > 0) { + rbuf = ISC_LIST_HEAD(full_list); + if (rbuf != NULL) + { + ISC_LIST_DEQUEUE(full_list, rbuf, link); --full_recvbufs; - buffer = beginlist; - beginlist = buffer->next; - buffer->next = NULL; } UNLOCK(); - return buffer; + return (rbuf); } diff --git a/ntpd/ntpd.c b/ntpd/ntpd.c index 64739a4912..bc0d5b2746 100644 --- a/ntpd/ntpd.c +++ b/ntpd/ntpd.c @@ -412,7 +412,7 @@ ntpdmain( ) { l_fp now; - struct recvbuf *rbuflist; + int tot_full_recvbufs; struct recvbuf *rbuf; #ifdef _AIX /* HMS: ifdef SIGDANGER? */ struct sigaction sa; @@ -449,15 +449,6 @@ ntpdmain( } #endif -#ifdef OPENSSL - if ((SSLeay() ^ OPENSSL_VERSION_NUMBER) & ~0xff0L) { - msyslog(LOG_ERR, - "ntpd: OpenSSL version mismatch. Built against %lx, you have %lx\n", - OPENSSL_VERSION_NUMBER, SSLeay()); - exit(1); - } -#endif - #ifdef SYS_WINNT /* * Initialize the time structures and variables @@ -620,18 +611,6 @@ ntpdmain( "Cannot adjust stack limit for mlockall: %m"); } } -# ifdef RLIMIT_MEMLOCK - /* - * The default RLIMIT_MEMLOCK is very low on Linux systems. - * Unless we increase this limit malloc calls are likely to - * fail if we drop root privlege. To be useful the value - * has to be larger than the largest ntpd resident set size. - */ - rl.rlim_cur = rl.rlim_max = 32*1024*1024; - if (setrlimit(RLIMIT_MEMLOCK, &rl) == -1) { - msyslog(LOG_ERR, "Cannot set RLIMIT_MEMLOCK: %m"); - } -# endif /* RLIMIT_MEMLOCK */ } # endif /* HAVE_SETRLIMIT */ /* @@ -873,11 +852,10 @@ getgroup: #if defined(HAVE_IO_COMPLETION_PORT) for (;;) { - rbuflist = GetReceivedBuffers(); + tot_full_recvbufs = GetReceivedBuffers(); #else /* normal I/O */ was_alarmed = 0; - rbuflist = (struct recvbuf *)0; for (;;) { # if !defined(HAVE_SIGNALED_IO) @@ -890,14 +868,14 @@ getgroup: block_io_and_alarm(); # endif - rbuflist = getrecvbufs(); /* get received buffers */ + tot_full_recvbufs = full_recvbuffs(); /* get received buffers */ if (alarm_flag) /* alarmed? */ { was_alarmed = 1; alarm_flag = 0; } - if (!was_alarmed && rbuflist == (struct recvbuf *)0) + if (!was_alarmed && tot_full_recvbufs > 0) { /* * Nothing to do. Wait for something. @@ -940,7 +918,7 @@ getgroup: was_alarmed = 1; alarm_flag = 0; } - rbuflist = getrecvbufs(); /* get received buffers */ + tot_full_recvbufs = full_recvbuffs(); /* get received buffers */ } # ifdef HAVE_SIGNALED_IO unblock_io_and_alarm(); @@ -961,18 +939,13 @@ getgroup: * Call the data procedure to handle each received * packet. */ - while (rbuflist != (struct recvbuf *)0) + rbuf = get_full_recv_buffer(); + while (rbuf != NULL) { - rbuf = rbuflist; - rbuflist = rbuf->next; (rbuf->receiver)(rbuf); freerecvbuf(rbuf); + rbuf = get_full_recv_buffer(); } -#if defined DEBUG && defined SYS_WINNT - if (debug > 4) - printf("getrecvbufs: %ld handler interrupts, %ld frames\n", - handler_calls, handler_pkts); -#endif /* * Go around again diff --git a/ntpd/refclock_parse.c b/ntpd/refclock_parse.c index 0a9623e530..cb96886242 100644 --- a/ntpd/refclock_parse.c +++ b/ntpd/refclock_parse.c @@ -2182,7 +2182,6 @@ local_input( buf.srcadr = rbufp->srcadr; buf.dstadr = rbufp->dstadr; buf.fd = rbufp->fd; - buf.next = 0; buf.X_from_where = rbufp->X_from_where; rbufp->receiver(&buf); } diff --git a/ntpdate/ntpdate.c b/ntpdate/ntpdate.c index fab1578c67..96546644ab 100644 --- a/ntpdate/ntpdate.c +++ b/ntpdate/ntpdate.c @@ -331,7 +331,7 @@ ntpdatemain ( ) { int was_alarmed; - struct recvbuf *rbuflist; + int tot_recvbufs; struct recvbuf *rbuf; l_fp tmp; int errflg; @@ -592,7 +592,6 @@ ntpdatemain ( initializing = 0; was_alarmed = 0; - rbuflist = (struct recvbuf *)0; while (complete_servers < sys_numservers) { #ifdef HAVE_POLL_H @@ -607,9 +606,9 @@ ntpdatemain ( was_alarmed = 1; alarm_flag = 0; } - rbuflist = getrecvbufs(); /* get received buffers */ + tot_recvbufs = full_recvbuffs(); /* get received buffers */ - if (!was_alarmed && rbuflist == (struct recvbuf *)0) { + if (!was_alarmed && tot_recvbufs > 0) { /* * Nothing to do. Wait for something. */ @@ -651,18 +650,19 @@ ntpdatemain ( was_alarmed = 1; alarm_flag = 0; } - rbuflist = getrecvbufs(); /* get received buffers */ + tot_recvbufs = full_recvbuffs(); /* get received buffers */ } /* * Out here, signals are unblocked. Call receive * procedure for each incoming packet. */ - while (rbuflist != (struct recvbuf *)0) { - rbuf = rbuflist; - rbuflist = rbuf->next; + rbuf = get_full_recv_buffer(); + while (rbuf != NULL) + { receive(rbuf); freerecvbuf(rbuf); + rbuf = get_full_recv_buffer(); } /* diff --git a/ntpdate/ntptimeset.c b/ntpdate/ntptimeset.c index 0ee4e10a72..2485aadb6b 100644 --- a/ntpdate/ntptimeset.c +++ b/ntpdate/ntptimeset.c @@ -402,7 +402,7 @@ ntptimesetmain( ) { int was_alarmed; - struct recvbuf *rbuflist; + int tot_recvbufs; struct recvbuf *rbuf; l_fp tmp; int errflg; @@ -645,7 +645,6 @@ ntptimesetmain( * yet to learn about anything else that is. */ was_alarmed = 0; - rbuflist = (struct recvbuf *)0; while (finish_time > current_time) { #if !defined(HAVE_SIGNALED_IO) fd_set rdfdes; @@ -654,7 +653,7 @@ ntptimesetmain( block_io_and_alarm(); #endif - rbuflist = getrecvbufs(); /* get received buffers */ + tot_recvbufs = full_recvbuffs(); /* get received buffers */ if (printmsg) { printmsg = 0; analysis(0); @@ -664,7 +663,7 @@ ntptimesetmain( alarm_flag = 0; } - if (!was_alarmed && rbuflist == (struct recvbuf *)0) { + if (!was_alarmed && tot_recvbufs > 0) { /* * Nothing to do. Wait for something. */ @@ -704,7 +703,7 @@ ntptimesetmain( was_alarmed = 1; alarm_flag = 0; } - rbuflist = getrecvbufs(); /* get received buffers */ + tot_recvbufs = full_recvbuffs(); /* get received buffers */ } #ifdef HAVE_SIGNALED_IO unblock_io_and_alarm(); @@ -724,18 +723,13 @@ ntptimesetmain( * Call the data procedure to handle each received * packet. */ - while (rbuflist != (struct recvbuf *)0) + rbuf = get_full_recv_buffer(); + while (rbuf != NULL) { - rbuf = rbuflist; - rbuflist = rbuf->next; receive(rbuf); freerecvbuf(rbuf); + rbuf = get_full_recv_buffer(); } -#if defined DEBUG && defined SYS_WINNT - if (debug > 4) - printf("getrecvbufs: %ld handler interrupts, %ld frames\n", - handler_calls, handler_pkts); -#endif /* * Do we have enough information to stop now? diff --git a/ports/winnt/include/transmitbuff.h b/ports/winnt/include/transmitbuff.h index 33487c26e7..2a4e906588 100644 --- a/ports/winnt/include/transmitbuff.h +++ b/ports/winnt/include/transmitbuff.h @@ -5,14 +5,17 @@ #if defined HAVE_IO_COMPLETION_PORT # include "ntp_iocompletionport.h" #endif +#include /* * Format of a transmitbuf. These are used by the asynchronous receive - * routine to store incoming packets and related information. + * routine to store outgoing packets and related information. */ +typedef struct transmitbuf transmitbuf_t; + typedef struct transmitbuf { - struct transmitbuf *next; /* next buffer in chain */ + ISC_LINK(transmitbuf_t) link; WSABUF wsabuf; time_t ts; /* Time stamp for the request */ @@ -33,7 +36,7 @@ extern void init_transmitbuff P((void)); /* freetransmitbuf - make a single transmitbuf available for reuse */ -extern void free_transmit_buffer P((transmitbuf *)); +extern void free_transmit_buffer P((transmitbuf_t *)); /* Get a free buffer (typically used so an async * read can directly place data into the buffer @@ -41,7 +44,7 @@ extern void free_transmit_buffer P((transmitbuf *)); * The buffer is removed from the free list. Make sure * you put it back with freetransmitbuf() or */ -extern transmitbuf *get_free_transmit_buffer P((void)); +extern transmitbuf_t *get_free_transmit_buffer P((void)); #endif /* defined __transmitbuff_h */ diff --git a/ports/winnt/libntp/transmitbuff.c b/ports/winnt/libntp/transmitbuff.c index ec3093c6c1..8a0789a6dc 100644 --- a/ports/winnt/libntp/transmitbuff.c +++ b/ports/winnt/libntp/transmitbuff.c @@ -14,49 +14,27 @@ /* * transmitbuf memory management */ -#define TRANSMIT_INIT 10 /* 10 buffers initially */ -#define TRANSMIT_LOWAT 3 /* when we're down to three buffers get more */ -#define TRANSMIT_INC 5 /* get 5 more at a time */ +#define TRANSMIT_INIT 10 /* 10 buffers initially */ +#define TRANSMIT_LOWAT 3 /* when we're down to three buffers get more */ +#define TRANSMIT_INC 5 /* get 5 more at a time */ #define TRANSMIT_TOOMANY 40 /* this is way too many buffers */ -/* - * Maximum time in seconds to allow transmit request to complete - * After that we are free to delete it if we need the buffer - */ - -#define MAX_TRANSMIT_SEND_TIME 60.0 - /* * Memory allocation */ -static volatile u_long full_transmitbufs = 0; /* number of transmitbufs on fulllist */ -static volatile u_long free_transmitbufs = 0; /* number of transmitbufs on freelist */ - -typedef struct transmitb transmitb_t; +static volatile u_long full_transmitbufs = 0; /* number of transmitbufs on fulllist */ +static volatile u_long free_transmitbufs = 0; /* number of transmitbufs on freelist */ -struct transmitb { - transmitbuf *tb; - ISC_LINK(transmitb_t) link; -}; - -ISC_LIST(transmitb_t) fulllist; /* Currently used transmit buffers */ - -static transmitbuf *volatile freelist = NULL; /* free buffers */ -static transmitbuf *volatile beginlist = NULL; /* fifo buffers with data */ +ISC_LIST(transmitbuf_t) free_list; /* Currently used transmit buffers */ +ISC_LIST(transmitbuf_t) full_list; /* Currently used transmit buffers */ static u_long total_transmitbufs = 0; /* total transmitbufs currently in use */ -static u_long lowater_additions = 0; /* number of times we have added memory */ - -static transmitbuf initial_bufs[TRANSMIT_INIT]; /* initial allocation */ - +static u_long lowater_additions = 0; /* number of times we have added memory */ static CRITICAL_SECTION TransmitLock; # define LOCK(lock) EnterCriticalSection(lock) # define UNLOCK(lock) LeaveCriticalSection(lock) -static struct transmitbuf initial_bufs[TRANSMIT_INIT]; /* initial allocation */ -static int eventid = 0; - static void initialise_buffer(transmitbuf *buff) { @@ -66,121 +44,70 @@ initialise_buffer(transmitbuf *buff) buff->wsabuf.buf = (char *) &buff->pkt; } +static void +add_buffer_to_freelist(transmitbuf *tb) +{ + ISC_LIST_APPEND(free_list, tb, link); + free_transmitbufs++; +} + +static void +create_buffers(int nbufs) +{ + transmitbuf_t *buf; + int i; + + buf = (transmitbuf_t *) emalloc(nbufs*sizeof(transmitbuf_t)); + for (i = 0; i < nbufs; i++) + { + initialise_buffer(buf); + add_buffer_to_freelist(buf); + total_transmitbufs++; + buf++; + } + + lowater_additions++; +} extern void init_transmitbuff(void) { - int i; /* * Init buffer free list and stat counters */ - freelist = NULL; - for (i = 0; i < TRANSMIT_INIT; i++) - { - initialise_buffer(&initial_bufs[i]); - initial_bufs[i].next = (transmitbuf *) freelist; - freelist = &initial_bufs[i]; - } - - ISC_LIST_INIT(fulllist); - free_transmitbufs = total_transmitbufs = TRANSMIT_INIT; + ISC_LIST_INIT(full_list); + ISC_LIST_INIT(free_list); + free_transmitbufs = total_transmitbufs = 0; full_transmitbufs = lowater_additions = 0; + create_buffers(TRANSMIT_INIT); InitializeCriticalSection(&TransmitLock); } static void -add_buffer_to_freelist(transmitbuf *tb) -{ - tb->next = freelist; - freelist = tb; - free_transmitbufs++; -} - -static void -delete_buffer_from_full_list(transmitbuf *tb) { +delete_buffer_from_full_list(transmitbuf_t *tb) { - transmitb_t *next; - transmitb_t *lbuf = ISC_LIST_HEAD(fulllist); + transmitbuf_t *next = NULL; + transmitbuf_t *lbuf = ISC_LIST_HEAD(full_list); - while(lbuf != NULL) { + while (lbuf != NULL) { next = ISC_LIST_NEXT(lbuf, link); - if(lbuf->tb == tb) { - ISC_LIST_DEQUEUE_TYPE(fulllist, lbuf, link, transmitb_t); - free(lbuf); + if (lbuf == tb) { + ISC_LIST_DEQUEUE(full_list, lbuf, link); break; } else lbuf = next; } + full_transmitbufs--; } -/* - * routine to free up any buffer that has not been freed up - * after MAX_TRANSMIT_SEND_TIME seconds. Note that we are not being - * too careful here about the correct value of time since we just need - * and approximate measure of how much time has elapsed since the - * packet was sent and this routine is only called if we run out - * of tranmit buffers. - */ -static int -free_unsent_buffers() -{ - int tot_freed = 0; - double elapsed_time; - time_t ct; - transmitbuf *buf; - transmitb_t *next; - transmitb_t *lbuf = ISC_LIST_HEAD(fulllist); - - time(&ct); /* Current Time */ - - LOCK(&TransmitLock); - while(lbuf != NULL) { - next = ISC_LIST_NEXT(lbuf, link); - elapsed_time = difftime(ct, lbuf->tb->ts); - if (elapsed_time > MAX_TRANSMIT_SEND_TIME) { - ISC_LIST_DEQUEUE_TYPE(fulllist, lbuf, link, transmitb_t); - free(lbuf); - add_buffer_to_freelist(lbuf->tb); - tot_freed++; - } - else - lbuf = next; - } - UNLOCK(&TransmitLock); - return (tot_freed); -} - -static void -create_buffers(void) -{ - transmitbuf *buf; - int i; - if (free_unsent_buffers() > 0) - return; - - buf = (transmitbuf *) emalloc(TRANSMIT_INC*sizeof(transmitbuf)); - for (i = 0; i < TRANSMIT_INC; i++) - { - initialise_buffer(buf); - buf->next = (transmitbuf *) freelist; - freelist = buf; - buf++; - } - - free_transmitbufs += TRANSMIT_INC; - total_transmitbufs += TRANSMIT_INC; - lowater_additions++; -} - - extern void -free_transmit_buffer(transmitbuf *rb) +free_transmit_buffer(transmitbuf_t *rb) { LOCK(&TransmitLock); - add_buffer_to_freelist(rb); delete_buffer_from_full_list(rb); + add_buffer_to_freelist(rb); UNLOCK(&TransmitLock); } @@ -188,21 +115,21 @@ free_transmit_buffer(transmitbuf *rb) extern transmitbuf * get_free_transmit_buffer(void) { - transmitb_t *lbuf = (transmitb_t *)malloc(sizeof(transmitb_t)); - transmitbuf * buffer = NULL; + transmitbuf_t * buffer = NULL; LOCK(&TransmitLock); if (free_transmitbufs <= 0) { - create_buffers(); + create_buffers(TRANSMIT_INC); + } + buffer = ISC_LIST_HEAD(free_list); + if (buffer != NULL) + { + ISC_LIST_DEQUEUE(free_list, buffer, link); + free_transmitbufs--; + ISC_LIST_APPEND(full_list, buffer, link); + full_transmitbufs++; } - buffer = freelist; - freelist = buffer->next; - buffer->next = NULL; - time(&buffer->ts); /* Time we gave out the transmit buffer */ - lbuf->tb = buffer; - ISC_LIST_APPEND(fulllist, lbuf, link); - --free_transmitbufs; UNLOCK(&TransmitLock); - return buffer; + return (buffer); } diff --git a/ports/winnt/ntpd/ntp_iocompletionport.c b/ports/winnt/ntpd/ntp_iocompletionport.c index 75aa8b0c18..d92843aa54 100644 --- a/ports/winnt/ntpd/ntp_iocompletionport.c +++ b/ports/winnt/ntpd/ntp_iocompletionport.c @@ -101,6 +101,12 @@ iocompletionthread(void *NotUsed) #endif break; } + /* Clear the allocated memory */ + if (lpo != NULL) + { + HeapFree(hHeapHandle, 0, lpo); + lpo = NULL; + } } } @@ -116,6 +122,12 @@ init_io_completion_port( * Create a handle to the Heap */ hHeapHandle = HeapCreate(0, 20*sizeof(IoCompletionInfo), 0); + if (hHeapHandle == NULL) + { + msyslog(LOG_ERR, "Can't initialize Heap: %m"); + exit(1); + } + /* Create the event used to signal an IO event */ @@ -168,10 +180,16 @@ static int QueueIORead( struct refclockio *rio ) { lpo = (IoCompletionInfo *) HeapAlloc(hHeapHandle, HEAP_ZERO_MEMORY, sizeof(IoCompletionInfo)); + if (lpo == NULL) + return 0; + buff = get_free_recv_buffer(); - + if (buff == NULL) + { + HeapFree(hHeapHandle, 0, lpo); return 0; + } lpo->request_type = CLOCK_READ; lpo->buff = buff; @@ -228,10 +246,6 @@ OnIoReadComplete(DWORD i, IoCompletionInfo *lpo, DWORD Bytes) else freerecvbuf(buff); - /* Clear the heap */ - if (lpo != NULL) - HeapFree(hHeapHandle, 0, lpo); - QueueIORead( rio ); return 1; } @@ -263,8 +277,17 @@ static unsigned long QueueSocketRecv(SOCKET s) { lpo = (IoCompletionInfo *) HeapAlloc(hHeapHandle, HEAP_ZERO_MEMORY, sizeof(IoCompletionInfo)); + if (lpo == NULL) + return 0; + buff = get_free_recv_buffer(); + if (buff == NULL) + { + HeapFree(hHeapHandle, 0, lpo); + return 0; + } + lpo->request_type = SOCK_RECV; lpo->buff = buff; @@ -284,7 +307,7 @@ static unsigned long QueueSocketRecv(SOCKET s) { case WSA_IO_INCOMPLETE : case WSA_WAIT_IO_COMPLETION : case WSA_IO_PENDING : - break ; + break ; case WSAENOTSOCK : netsyslog(LOG_ERR, "Can't read from socket, because it isn't a socket: %m"); @@ -348,9 +371,6 @@ OnSocketRecv(DWORD i, IoCompletionInfo *lpo, DWORD Bytes) else { freerecvbuf(buff); } - /* Clear the heap */ - if (lpo != NULL) - HeapFree(hHeapHandle, 0, lpo); QueueSocketRecv(inter->fd); return 1; @@ -378,16 +398,13 @@ io_completion_port_add_socket(SOCKET fd, struct interface *inter) static int OnWriteComplete(DWORD Key, IoCompletionInfo *lpo, DWORD Bytes) { - transmitbuf *buff = NULL; + transmitbuf_t *buff; (void) Bytes; (void) Key; - buff = (struct transmitbuf *) lpo->buff; + buff = (transmitbuf_t *) lpo->buff; free_transmit_buffer(buff); - /* Clear the heap */ - if (lpo != NULL) - HeapFree(hHeapHandle, 0, lpo); return 1; } @@ -399,7 +416,7 @@ io_completion_port_sendto( int len, struct sockaddr_storage* dest) { - transmitbuf *buff = NULL; + transmitbuf_t *buff = NULL; DWORD Result = ERROR_SUCCESS; int errval; int AddrLen; @@ -409,6 +426,9 @@ io_completion_port_sendto( HEAP_ZERO_MEMORY, sizeof(IoCompletionInfo)); + if (lpo == NULL) + return ERROR_OUTOFMEMORY; + if (len <= sizeof(buff->pkt)) { buff = get_free_transmit_buffer(); if (buff != NULL) { @@ -454,12 +474,13 @@ io_completion_port_sendto( if (debug) printf("No more transmit buffers left - data discarded\n"); #endif + HeapFree(hHeapHandle, 0, lpo); return ERROR_OUTOFMEMORY; } } else { #ifdef DEBUG - if (debug) printf("Packet too large\n"); + if (debug) printf("Packet too large: %d Bytes\n", len); #endif return ERROR_INSUFFICIENT_BUFFER; } @@ -476,7 +497,7 @@ io_completion_port_write( int len) { DWORD errval; - transmitbuf *buff = NULL; + transmitbuf_t *buff = NULL; DWORD lpNumberOfBytesWritten; DWORD Result = ERROR_INSUFFICIENT_BUFFER; IoCompletionInfo *lpo; @@ -485,6 +506,9 @@ io_completion_port_write( HEAP_ZERO_MEMORY, sizeof(IoCompletionInfo)); + if (lpo == NULL) + return ERROR_OUTOFMEMORY; + if (len <= sizeof(buff->pkt)) { buff = get_free_transmit_buffer(); if (buff != NULL) { @@ -525,12 +549,12 @@ io_completion_port_write( if (debug) printf("No more transmit buffers left - data discarded\n"); #endif - + HeapFree(hHeapHandle, 0, lpo); } } else { #ifdef DEBUG - if (debug) printf("Packet too large\n"); + if (debug) printf("Packet too large: %d Bytes\n", len); #endif } return Result; @@ -541,7 +565,7 @@ io_completion_port_write( * Note that this is in effect the main loop for processing requests * both send and receive. This should be reimplemented */ -struct recvbuf *GetReceivedBuffers() +int GetReceivedBuffers() { DWORD Index = WaitForMultipleObjectsEx(MAXHANDLES, WaitHandles, FALSE, INFINITE, TRUE); switch (Index) { @@ -575,7 +599,7 @@ struct recvbuf *GetReceivedBuffers() } /* switch */ - return (getrecvbufs()); /* get received buffers */ + return (full_recvbuffs()); /* get received buffers */ } #else