21.03.2013 Views

Problem - Kevin Tafuro

Problem - Kevin Tafuro

Problem - Kevin Tafuro

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

#endif<br />

return 1;<br />

}<br />

int spc_socketpool_setlimit(int limit) {<br />

SPC_ACQUIRE_MUTEX(socketpool_mutex);<br />

if (socketpool_limit > 0 && socketpool_used >= socketpool_limit) {<br />

if (limit socketpool_limit)<br />

SPC_BROADCAST_COND(socketpool_cond);<br />

}<br />

socketpool_limit = limit;<br />

SPC_RELEASE_MUTEX(socketpool_mutex);<br />

return 1;<br />

}<br />

The wrappers for the accept( ) and socket( ) calls are very similar, and they really<br />

differ only in the arguments they accept. Our wrappers add an extra argument that<br />

indicates whether the functions should wait for a socket to become available if one is<br />

not immediately available. Any nonzero value will cause the functions to wait until a<br />

socket becomes available. A value of zero will cause the functions to return immediately<br />

with errno set to EMFILE if there are no available sockets. Should the actual<br />

wrapped functions return any kind of error, the wrapper functions will return that<br />

error immediately without incrementing the socket count.<br />

static void socketpool_cleanup(void *arg) {<br />

SPC_RELEASE_MUTEX(socketpool_mutex);<br />

}<br />

int spc_socketpool_accept(int sd, struct sockaddr *addr, int *addrlen, int block) {<br />

int avail = 1, new_sd = -1;<br />

SPC_ACQUIRE_MUTEX(socketpool_mutex);<br />

SPC_CLEANUP_PUSH(socketpool_cleanup, 0);<br />

if (socketpool_limit > 0 && socketpool_used >= socketpool_limit) {<br />

if (!block) {<br />

avail = 0;<br />

errno = EMFILE;<br />

} else {<br />

while (socketpool_limit > 0 && socketpool_used >= socketpool_limit)<br />

SPC_WAIT_COND(socketpool_cond, socketpool_mutex);<br />

}<br />

}<br />

if (avail && (new_sd = accept(sd, addr, addrlen)) != -1)<br />

socketpool_used++;<br />

SPC_CLEANUP_POP(1);<br />

return new_sd;<br />

}<br />

int spc_socketpool_socket(int domain, int type, int protocol, int block) {<br />

int avail = 1, new_sd = -1;<br />

SPC_ACQUIRE_MUTEX(socketpool_mutex);<br />

SPC_CLEANUP_PUSH(socketpool_cleanup, 0);<br />

726 | Chapter 13: Other Topics<br />

This is the Title of the Book, eMatter Edition<br />

Copyright © 2007 O’Reilly & Associates, Inc. All rights reserved.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!