]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
Fix Bug #596 and #572 to deal with polling restrictions
authorDanny Mayer <mayer@ntp.org>
Sat, 15 Apr 2006 22:33:29 +0000 (18:33 -0400)
committerDanny Mayer <mayer@ntp.org>
Sat, 15 Apr 2006 22:33:29 +0000 (18:33 -0400)
bk: 444174b9TTyWWE-XnrUHbaXO_JSwiw

libntp/recvbuff.c

index 2c274d4c8bae3b6f6b898ab367bc2189540334a4..468fc54a0291395d5912e8e3c7748eda40d9d932 100644 (file)
  */
 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);
 }