* The buffer is removed from the free list. Make sure
* you put it back with freerecvbuf() or
*/
-extern struct recvbuf *get_free_recv_buffer P((void));
+extern struct recvbuf *get_free_recv_buffer P((void)); /* signal safe - no malloc */
+extern struct recvbuf *get_free_recv_buffer_alloc P((void)); /* signal unsafe - may malloc */
/* Add a buffer to the full list
*/
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 u_long volatile buffer_shortfall;/* number of missed free receive buffers
+ between replenishments */
static ISC_LIST(recvbuf_t) full_recv_list; /* Currently used recv buffers */
static ISC_LIST(recvbuf_t) free_recv_list; /* Currently unused buffers */
#endif
}
-static int
+static void
create_buffers(int nbufs)
{
register recvbuf_t *bufp;
- int i;
+ int i, abuf;
+
+ abuf = nbufs + buffer_shortfall;
+ buffer_shortfall = 0;
- bufp = (recvbuf_t *) emalloc(nbufs*sizeof(recvbuf_t));
+ bufp = (recvbuf_t *) emalloc(abuf*sizeof(recvbuf_t));
/*
* If no memory available, Bail
*/
if (bufp == NULL)
- return (0);
- for (i = 0; i < nbufs; i++)
+ {
+ msyslog(LOG_ERR, "no more memory for receive buffers");
+ }
+
+ for (i = 0; i < abuf; i++)
{
memset((char *) bufp, 0, sizeof(recvbuf_t));
ISC_LIST_APPEND(free_recv_list, bufp, link);
total_recvbufs++;
}
lowater_adds++;
- return (nbufs);
}
void
initialise_buffer(buffer);
(buffer->used)++;
}
+ else
+ {
+ buffer_shortfall++;
+ }
UNLOCK();
return (buffer);
}
+recvbuf_t *
+get_free_recv_buffer_alloc(void)
+{
+ recvbuf_t * buffer = get_free_recv_buffer();
+ if (buffer != NULL)
+ {
+ create_buffers(RECV_INC);
+ buffer = get_free_recv_buffer();
+ }
+ return (buffer);
+}
+
recvbuf_t *
get_full_recv_buffer(void)
{
/*
* try to get us some more buffers
*/
- if (create_buffers(RECV_INC) <= 0)
- {
- msyslog(LOG_ERR, "No more memory for recvufs");
- }
+ create_buffers(RECV_INC);
}
/*
#ifdef SYS_WINNT
if (!Win32InitSockets())
{
- netsyslog(LOG_ERR, "No useable winsock.dll: %m");
+netsyslog(LOG_ERR, "No useable winsock.dll: %m");
exit(1);
}
init_transmitbuff();
/*
* Add the socket to the completion port
*/
- io_completion_port_add_socket(fd, interf);
+ if (io_completion_port_add_socket(fd, interf))
+ {
+ msyslog(LOG_ERR, "unable to set up io completion port - EXITING");
+ exit(1);
+ }
#endif
return fd;
}