Annotation of embedaddon/ntp/ports/winnt/libntp/transmitbuff.c, revision 1.1.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>