Annotation of embedaddon/ntp/ports/winnt/libntp/transmitbuff.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * DEAD CODE ALERT  --  for whatever reason all this wonderful stuff is
        !             3:  *                     unused.  The initialization was the only code
        !             4:  *                     exercised as of May 2009 when that was nipped.
        !             5:  */
        !             6: 
        !             7: 
        !             8: #ifdef HAVE_CONFIG_H
        !             9: # include <config.h>
        !            10: #endif
        !            11: 
        !            12: #include <stdio.h>
        !            13: #include "ntp_machine.h"
        !            14: #include "ntp_fp.h"
        !            15: #include "ntp_stdlib.h"
        !            16: #include "ntp_syslog.h"
        !            17: 
        !            18: #include <isc/list.h>
        !            19: #include "transmitbuff.h"
        !            20: 
        !            21: /*
        !            22:  * transmitbuf memory management
        !            23:  */
        !            24: #define TRANSMIT_INIT          10      /* 10 buffers initially */
        !            25: #define TRANSMIT_LOWAT          3      /* when we're down to three buffers get more */
        !            26: #define TRANSMIT_INC            5      /* get 5 more at a time */
        !            27: #define TRANSMIT_TOOMANY       40      /* this is way too many buffers */
        !            28: 
        !            29: /*
        !            30:  * Memory allocation
        !            31:  */
        !            32: static volatile u_long full_transmitbufs = 0;  /* number of transmitbufs on fulllist */
        !            33: static volatile u_long free_transmitbufs = 0;  /* number of transmitbufs on freelist */
        !            34: 
        !            35: ISC_LIST(transmitbuf_t)        free_transmit_list;     /* Currently used transmit buffers */
        !            36: ISC_LIST(transmitbuf_t)        full_transmit_list;     /* Currently used transmit buffers */
        !            37: 
        !            38: static u_long total_transmitbufs = 0;          /* total transmitbufs currently in use */
        !            39: static u_long lowater_additions = 0;           /* number of times we have added memory */
        !            40: 
        !            41: static CRITICAL_SECTION TransmitLock;
        !            42: # define LOCK(lock)    EnterCriticalSection(lock)
        !            43: # define UNLOCK(lock)  LeaveCriticalSection(lock)
        !            44: 
        !            45: static inline void 
        !            46: initialise_buffer(transmitbuf *buff)
        !            47: {
        !            48:        memset(buff, 0, sizeof(*buff));
        !            49: }
        !            50: 
        !            51: static void
        !            52: add_buffer_to_freelist(transmitbuf *tb)
        !            53: {
        !            54:        ISC_LIST_APPEND(free_transmit_list, tb, link);
        !            55:        free_transmitbufs++;
        !            56: }
        !            57: 
        !            58: static void
        !            59: create_buffers(int nbufs)
        !            60: {
        !            61:        transmitbuf_t *buf;
        !            62:        int i;
        !            63: 
        !            64:        buf = emalloc(nbufs * sizeof(*buf));
        !            65:        for (i = 0; i < nbufs; i++)
        !            66:        {
        !            67:                initialise_buffer(buf);
        !            68:                add_buffer_to_freelist(buf);
        !            69:                total_transmitbufs++;
        !            70:                buf++;
        !            71:        }
        !            72: 
        !            73:        lowater_additions++;
        !            74: }
        !            75: 
        !            76: extern void
        !            77: init_transmitbuff(void)
        !            78: {
        !            79:        /*
        !            80:         * Init buffer free list and stat counters
        !            81:         */
        !            82:        ISC_LIST_INIT(full_transmit_list);
        !            83:        ISC_LIST_INIT(free_transmit_list);
        !            84:        free_transmitbufs = total_transmitbufs = 0;
        !            85:        full_transmitbufs = lowater_additions = 0;
        !            86:        create_buffers(TRANSMIT_INIT);
        !            87: 
        !            88:        InitializeCriticalSection(&TransmitLock);
        !            89: }
        !            90: 
        !            91: static void
        !            92: delete_buffer_from_full_list(transmitbuf_t *tb) {
        !            93: 
        !            94:        transmitbuf_t *next = NULL;
        !            95:        transmitbuf_t *lbuf = ISC_LIST_HEAD(full_transmit_list);
        !            96: 
        !            97:        while (lbuf != NULL) {
        !            98:                next = ISC_LIST_NEXT(lbuf, link);
        !            99:                if (lbuf == tb) {
        !           100:                        ISC_LIST_DEQUEUE(full_transmit_list, lbuf, link);
        !           101:                        break;
        !           102:                }
        !           103:                else
        !           104:                        lbuf = next;
        !           105:        }
        !           106:        full_transmitbufs--;
        !           107: }
        !           108: 
        !           109: extern void
        !           110: free_transmit_buffer(transmitbuf_t *rb)
        !           111: {
        !           112:        LOCK(&TransmitLock);
        !           113:        delete_buffer_from_full_list(rb);
        !           114:        add_buffer_to_freelist(rb);
        !           115:        UNLOCK(&TransmitLock);
        !           116: }
        !           117: 
        !           118: 
        !           119: extern transmitbuf *
        !           120: get_free_transmit_buffer(void)
        !           121: {
        !           122: 
        !           123:        transmitbuf_t * buffer = NULL;
        !           124:        LOCK(&TransmitLock);
        !           125:        if (free_transmitbufs <= 0) {
        !           126:                create_buffers(TRANSMIT_INC);
        !           127:        }
        !           128:        buffer = ISC_LIST_HEAD(free_transmit_list);
        !           129:        if (buffer != NULL)
        !           130:        {
        !           131:                ISC_LIST_DEQUEUE(free_transmit_list, buffer, link);
        !           132:                free_transmitbufs--;
        !           133:                ISC_LIST_APPEND(full_transmit_list, buffer, link);
        !           134:                full_transmitbufs++;
        !           135:        }
        !           136:        UNLOCK(&TransmitLock);
        !           137:        return (buffer);
        !           138: }
        !           139: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>