From: Danny Mayer Date: Sat, 15 Apr 2006 22:33:29 +0000 (-0400) Subject: Fix Bug #596 and #572 to deal with polling restrictions X-Git-Tag: NTP_4_2_1P248_RC~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f03a6d2873297ce40c86b4c5d46a8fbfabfe8d18;p=thirdparty%2Fntp.git Fix Bug #596 and #572 to deal with polling restrictions bk: 444174b9TTyWWE-XnrUHbaXO_JSwiw --- diff --git a/libntp/recvbuff.c b/libntp/recvbuff.c index 2c274d4c8..468fc54a0 100644 --- a/libntp/recvbuff.c +++ b/libntp/recvbuff.c @@ -17,14 +17,14 @@ */ 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; /* number of recvbufs available */ -static u_long volatile lowater_adds; /* number of times we have added recvbufs */ +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 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) +#if defined(SYS_WINNT) /* * For Windows we need to set up a lock to manipulate the @@ -68,7 +68,7 @@ initialise_buffer(recvbuf_t *buff) { memset((char *) buff, 0, sizeof(recvbuf_t)); -#if defined HAVE_IO_COMPLETION_PORT +#if defined SYS_WINNT buff->wsabuff.len = RX_BUFF_SIZE; buff->wsabuff.buf = (char *) buff->recv_buffer; #endif @@ -87,7 +87,6 @@ create_buffers(int nbufs) return (0); for (i = 0; i < nbufs; i++) { - initialise_buffer(buf); ISC_LIST_APPEND(free_list, buf, link); buf++; free_recvbufs++; @@ -111,7 +110,7 @@ init_recvbuff(int nbufs) create_buffers(nbufs); -#if defined(HAVE_IO_COMPLETION_PORT) +#if defined(SYS_WINNT) InitializeCriticalSection(&RecvLock); #endif @@ -123,26 +122,35 @@ init_recvbuff(int nbufs) void freerecvbuf(recvbuf_t *rb) { + BLOCKIO(); LOCK(); ISC_LIST_APPEND(free_list, rb, link); +#if defined SYS_WINNT + rb->wsabuff.len = RX_BUFF_SIZE; + rb->wsabuff.buf = (char *) rb->recv_buffer; +#endif free_recvbufs++; UNLOCK(); + UNBLOCKIO(); } void add_full_recv_buffer(recvbuf_t *rb) { + BLOCKIO(); LOCK(); ISC_LIST_APPEND(full_list, rb, link); full_recvbufs++; UNLOCK(); + UNBLOCKIO(); } recvbuf_t * get_free_recv_buffer(void) { recvbuf_t * buffer = NULL; + BLOCKIO(); LOCK(); buffer = ISC_LIST_HEAD(free_list); if (buffer == NULL) @@ -154,6 +162,7 @@ get_free_recv_buffer(void) { msyslog(LOG_ERR, "No more memory for recvufs"); UNLOCK(); + UNBLOCKIO(); return (NULL); } buffer = ISC_LIST_HEAD(free_list); @@ -161,12 +170,15 @@ get_free_recv_buffer(void) { msyslog(LOG_ERR, "Failed to obtain more memory for recvbufs"); UNLOCK(); + UNBLOCKIO(); return (NULL); } } ISC_LIST_DEQUEUE(free_list, buffer, link); free_recvbufs--; + initialise_buffer(buffer); UNLOCK(); + UNBLOCKIO(); return (buffer); } @@ -174,16 +186,7 @@ recvbuf_t * get_full_recv_buffer(void) { recvbuf_t *rbuf; - - if (0 == full_recvbufs) - return 0; - -#ifdef DEBUG - if (debug > 1 && full_recvbufs) - printf("get_full_recv_buffer() called and full_recvbufs is %lu\n", full_recvbufs); -#endif - if (0 == full_recvbufs) - msyslog(LOG_ERR, "get_full_recv_buffer() called but full_recvbufs is 0!"); + BLOCKIO(); LOCK(); rbuf = ISC_LIST_HEAD(full_list); if (rbuf != NULL) @@ -193,14 +196,13 @@ get_full_recv_buffer(void) } else { - if (full_recvbufs) - msyslog(LOG_ERR, "get_full_recv_buffer: full_list is empty but full_recvbufs is %lu!", full_recvbufs); /* * Make sure we reset the full count to 0 */ full_recvbufs = 0; } UNLOCK(); + UNBLOCKIO(); return (rbuf); }