]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
Upgrade recvbuf and transmitbuf to use ISC_LIST_* lists
authorDanny Mayer <mayer@ntp.org>
Sun, 27 Nov 2005 23:33:06 +0000 (18:33 -0500)
committerDanny Mayer <mayer@ntp.org>
Sun, 27 Nov 2005 23:33:06 +0000 (18:33 -0500)
bk: 438a4232tC43NiF-M91Ra_Z66_UPTQ

include/recvbuff.h
libntp/recvbuff.c
ntpd/ntpd.c
ntpd/refclock_parse.c
ntpdate/ntpdate.c
ntpdate/ntptimeset.c
ports/winnt/include/transmitbuff.h
ports/winnt/libntp/transmitbuff.c
ports/winnt/ntpd/ntp_iocompletionport.c

index 544ef5cfb0d783d5545de8ba5b41cb29162777cb..e38fc7f2e46b2e4d3d3c89235e53f944de8c38d5 100644 (file)
@@ -9,6 +9,8 @@
 #include "ntp_fp.h"
 #include "ntp_types.h"
 
+#include <isc/list.h>
+
 /*
  * 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
  *
index 2e2fc794888f9191b467672ccbe6e88a9ae95750..3f0a480778c21a0ef5916cc6c1b06c275d067b46 100644 (file)
 #include "recvbuff.h"
 #include "iosignal.h"
 
+#include <isc/list.h>
 /*
  * 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);
 }
index 64739a4912025f5ec8731e377c1de125f3a4ddf5..bc0d5b2746ae8f85f3f24127a6e6a32f401db1de 100644 (file)
@@ -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
index 0a9623e530ed3adc9081ec98037b5a50046362e1..cb968862429a2c823db00fe7fb0c04ec4383242b 100644 (file)
@@ -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);
                        }
index fab1578c6790f5a61617b0befe046bbe04db74e6..96546644ab59bf6316956f105c6943026b2ce644 100644 (file)
@@ -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();
                }
 
                /*
index 0ee4e10a723887f7fed8edd56974c7f4e1962375..2485aadb6b05b8c0d23ca5beb2666ebe481c4d98 100644 (file)
@@ -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?
index 33487c26e7c43292f41c0877a9cdaa6fe64ac16e..2a4e906588e405fb673a51534885c1f3e43c49b4 100644 (file)
@@ -5,14 +5,17 @@
 #if defined HAVE_IO_COMPLETION_PORT
 # include "ntp_iocompletionport.h"
 #endif
+#include <isc/list.h>
 
 /*
  * 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 */
 
index ec3093c6c12e19de5f4662c2b1a808aaea566406..8a0789a6dc025304de2a60116cebe0d0014efd6d 100644 (file)
 /*
  * transmitbuf memory management
  */
-#define TRANSMIT_INIT  10      /* 10 buffers initially */
-#define TRANSMIT_LOWAT       /* when we're down to three buffers get more */
-#define TRANSMIT_INC         /* 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);
 }
 
index 75aa8b0c18f96fdde0f7244d014b1e3c53bc02b9..d92843aa541f197eee979af484223e2d7892cb00 100644 (file)
@@ -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