*/
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
{
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
return (0);
for (i = 0; i < nbufs; i++)
{
- initialise_buffer(buf);
ISC_LIST_APPEND(free_list, buf, link);
buf++;
free_recvbufs++;
create_buffers(nbufs);
-#if defined(HAVE_IO_COMPLETION_PORT)
+#if defined(SYS_WINNT)
InitializeCriticalSection(&RecvLock);
#endif
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)
{
msyslog(LOG_ERR, "No more memory for recvufs");
UNLOCK();
+ UNBLOCKIO();
return (NULL);
}
buffer = ISC_LIST_HEAD(free_list);
{
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);
}
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)
}
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);
}