diff --git a/src/backend.c b/src/backend.c index 7e1b218eafb3290ada5d2225e98ae072ab8e22ed..5038c0260ecd5b00431188c74d0dc7fa90e87f12 100644 --- a/src/backend.c +++ b/src/backend.c @@ -4,7 +4,7 @@ ||| See the files COPYING and DISCLAIMER for more information. \*/ #include "global.h" -RCSID("$Id: backend.c,v 1.33 1998/06/13 21:16:51 grubba Exp $"); +RCSID("$Id: backend.c,v 1.34 1998/07/09 01:35:12 hubbe Exp $"); #include "fdlib.h" #include "backend.h" #include <errno.h> @@ -33,16 +33,23 @@ RCSID("$Id: backend.c,v 1.33 1998/06/13 21:16:51 grubba Exp $"); #define SELECT_READ 1 #define SELECT_WRITE 2 -file_callback read_callback[MAX_OPEN_FILEDESCRIPTORS]; -void *read_callback_data[MAX_OPEN_FILEDESCRIPTORS]; -file_callback write_callback[MAX_OPEN_FILEDESCRIPTORS]; -void *write_callback_data[MAX_OPEN_FILEDESCRIPTORS]; + + +struct cb_data +{ + file_callback callback; + void * data; +}; + +struct fd_datum +{ + struct cb_data read, write; #ifdef WITH_OOB -file_callback read_oob_callback[MAX_OPEN_FILEDESCRIPTORS]; -void *read_oob_callback_data[MAX_OPEN_FILEDESCRIPTORS]; -file_callback write_oob_callback[MAX_OPEN_FILEDESCRIPTORS]; -void *write_oob_callback_data[MAX_OPEN_FILEDESCRIPTORS]; -#endif /* WITH_OOB */ + struct cb_data read_oob, write_oob; +#endif +}; + +struct fd_datum fds[MAX_OPEN_FILEDESCRIPTORS]; #ifndef HAVE_AND_USE_POLL #undef HAVE_POLL @@ -233,14 +240,14 @@ void cleanup_backend(void) void set_read_callback(int fd,file_callback cb,void *data) { #ifdef HAVE_POLL - int was_set = (read_callback[fd]!=0); + int was_set = (fds[fd].read.callback!=0); #endif #ifdef DEBUG if(fd<0 || fd>=MAX_OPEN_FILEDESCRIPTORS) fatal("File descriptor out of range.\n %d",fd); #endif - read_callback[fd]=cb; - read_callback_data[fd]=data; + fds[fd].read.callback=cb; + fds[fd].read.data=data; if(cb) { @@ -275,15 +282,15 @@ void set_read_callback(int fd,file_callback cb,void *data) void set_write_callback(int fd,file_callback cb,void *data) { #ifdef HAVE_POLL - int was_set = (write_callback[fd]!=0); + int was_set = (fds[fd].write.callback!=0); #endif #ifdef DEBUG if(fd<0 || fd>=MAX_OPEN_FILEDESCRIPTORS) fatal("File descriptor out of range.\n %d",fd); #endif - write_callback[fd]=cb; - write_callback_data[fd]=data; + fds[fd].write.callback=cb; + fds[fd].write.data=data; if(cb) { @@ -318,14 +325,14 @@ void set_write_callback(int fd,file_callback cb,void *data) void set_read_oob_callback(int fd,file_callback cb,void *data) { #ifdef HAVE_POLL - int was_set = (read_oob_callback[fd]!=0); + int was_set = (fds[fd].read_oob.callback!=0); #endif #ifdef DEBUG if(fd<0 || fd>=MAX_OPEN_FILEDESCRIPTORS) fatal("File descriptor out of range.\n %d",fd); #endif - read_oob_callback[fd]=cb; - read_oob_callback_data[fd]=data; + fds[fd].read_oob.callback=cb; + fds[fd].read_oob.data=data; if(cb) { @@ -361,15 +368,15 @@ void set_read_oob_callback(int fd,file_callback cb,void *data) void set_write_oob_callback(int fd,file_callback cb,void *data) { #ifdef HAVE_POLL - int was_set = (write_oob_callback[fd]!=0); + int was_set = (fds[fd].write_oob.callback!=0); #endif #ifdef DEBUG if(fd<0 || fd>=MAX_OPEN_FILEDESCRIPTORS) fatal("File descriptor out of range.\n %d",fd); #endif - write_oob_callback[fd]=cb; - write_oob_callback_data[fd]=data; + fds[fd].write_oob.callback=cb; + fds[fd].write_oob.data=data; if(cb) { @@ -396,7 +403,7 @@ void set_write_oob_callback(int fd,file_callback cb,void *data) } #else #if POLLWRBAND == POLLOUT - if (was_set && !write_callback[fd]) + if (was_set && !fds[fd].write.callback) POLL_FD_CLR(fd,POLLWRBAND); #else /* POLLWRBAND != POLLOUT */ if(was_set) @@ -414,7 +421,7 @@ file_callback query_read_callback(int fd) fatal("File descriptor out of range.\n %d",fd); #endif - return read_callback[fd]; + return fds[fd].read.callback; } file_callback query_write_callback(int fd) @@ -424,7 +431,7 @@ file_callback query_write_callback(int fd) fatal("File descriptor out of range.\n %d",fd); #endif - return write_callback[fd]; + return fds[fd].write.callback; } #ifdef WITH_OOB @@ -435,7 +442,7 @@ file_callback query_read_oob_callback(int fd) fatal("File descriptor out of range.\n %d",fd); #endif - return read_oob_callback[fd]; + return fds[fd].read_oob.callback; } file_callback query_write_oob_callback(int fd) @@ -445,7 +452,7 @@ file_callback query_write_oob_callback(int fd) fatal("File descriptor out of range.\n %d",fd); #endif - return write_oob_callback[fd]; + return fds[fd].write_oob.callback; } #endif /* WITH_OOB */ @@ -456,7 +463,7 @@ void *query_read_callback_data(int fd) fatal("File descriptor out of range.\n %d",fd); #endif - return read_callback_data[fd]; + return fds[fd].read.data; } void *query_write_callback_data(int fd) @@ -466,7 +473,7 @@ void *query_write_callback_data(int fd) fatal("File descriptor out of range.\n %d",fd); #endif - return write_callback_data[fd]; + return fds[fd].write.data; } #ifdef WITH_OOB @@ -477,7 +484,7 @@ void *query_read_oob_callback_data(int fd) fatal("File descriptor out of range.\n %d",fd); #endif - return read_oob_callback_data[fd]; + return fds[fd].read_oob.data; } void *query_write_oob_callback_data(int fd) @@ -487,7 +494,7 @@ void *query_write_oob_callback_data(int fd) fatal("File descriptor out of range.\n %d",fd); #endif - return write_oob_callback_data[fd]; + return fds[fd].write_oob.data; } #endif /* WITH_OOB */ @@ -600,6 +607,8 @@ void backend(void) /* FIXME: OOB? */ fd_copy_my_fd_set_to_fd_set(&rset, &selectors.read, max_fd+1); fd_copy_my_fd_set_to_fd_set(&wset, &selectors.write, max_fd+1); +#else + switch_poll_set(); #endif alloca(0); /* Do garbage collect */ @@ -616,9 +625,7 @@ void backend(void) next_timeout.tv_usec = 0; next_timeout.tv_sec = 0; } -#ifdef HAVE_POLL - switch_poll_set(); -#endif + THREADS_ALLOW(); #ifdef HAVE_POLL { @@ -643,11 +650,11 @@ void backend(void) /* FIXME: OOB? */ for(i=0; i<max_fd+1; i++) { - if(fd_FD_ISSET(i, &rset) && read_callback[i]) - (*(read_callback[i]))(i,read_callback_data[i]); + if(fd_FD_ISSET(i, &rset) && fds[i].read.callback) + (*(fds[i].read.callback))(i,fds[i].read.data); - if(fd_FD_ISSET(i, &wset) && write_callback[i]) - (*(write_callback[i]))(i,write_callback_data[i]); + if(fd_FD_ISSET(i, &wset) && fds[i].write.callback) + (*(fds[i].write.callback))(i,fds[i].write.data); } #else for(i=0; i<active_num_in_poll; i++) @@ -669,8 +676,8 @@ void backend(void) #ifdef WITH_OOB if ((active_poll_fds[i].revents & POLLRDBAND) && - read_oob_callback[fd]) { - (*(read_oob_callback[fd]))(fd, read_oob_callback_data[fd]); + fds[fd].read_oob.callback) { + (*(fds[fd].read_oob.callback))(fd, fds[fd].read_oob.data); #ifdef DEBUG handled = 1; #endif /* DEBUG */ @@ -680,8 +687,8 @@ void backend(void) if((active_poll_fds[i].revents & POLLHUP) || (active_poll_fds[i].revents & POLLERR)) { /* Closed or error */ - if (read_callback[fd]) { - (*(read_callback[fd]))(fd,read_callback_data[fd]); + if (fds[fd].read.callback) { + (*(fds[fd].read.callback))(fd,fds[fd].read.data); } /* We don't want to keep this fd anymore. */ POLL_FD_CLR(fd, ~0); @@ -691,8 +698,8 @@ void backend(void) } if(active_poll_fds[i].revents & POLLRDNORM) { - if (read_callback[fd]) { - (*(read_callback[fd]))(fd,read_callback_data[fd]); + if (fds[fd].read.callback) { + (*(fds[fd].read.callback))(fd,fds[fd].read.data); } else { POLL_FD_CLR(fd, POLLRDNORM); } @@ -703,8 +710,8 @@ void backend(void) #ifdef WITH_OOB if ((active_poll_fds[i].revents & POLLWRBAND) && - write_oob_callback[fd]) { - (*(write_oob_callback[fd]))(fd, write_oob_callback_data[fd]); + fds[fd].write_oob.callback) { + (*(fds[fd].write_oob.callback))(fd, fds[fd].write_oob.data); #ifdef DEBUG handled = 1; #endif /* DEBUG */ @@ -712,8 +719,8 @@ void backend(void) #endif /* WITH_OOB */ if(active_poll_fds[i].revents & POLLOUT) { - if (write_callback[fd]) { - (*(write_callback[fd]))(fd,write_callback_data[fd]); + if (fds[fd].write.callback) { + (*(fds[fd].write.callback))(fd,fds[fd].write.data); } else { POLL_FD_CLR(fd, POLLOUT); }