diff --git a/src/backend.c b/src/backend.c index d26611fcfbf20927c8fbaffc2cb1fd0b3c1e4ff8..a182f5fb8182fa98108e0ebceeaafce66fda1a82 100644 --- a/src/backend.c +++ b/src/backend.c @@ -5,7 +5,7 @@ \*/ /**/ #include "global.h" -RCSID("$Id: backend.c,v 1.58 2000/08/29 13:40:13 mirar Exp $"); +RCSID("$Id: backend.c,v 1.59 2000/10/04 22:36:18 grubba Exp $"); #include "fdlib.h" #include "backend.h" #include <errno.h> @@ -38,7 +38,13 @@ RCSID("$Id: backend.c,v 1.58 2000/08/29 13:40:13 mirar Exp $"); #define SELECT_READ 1 #define SELECT_WRITE 2 +/* #define POLL_DEBUG */ +#ifdef POLL_DEBUG +#define IF_PD(x) x +#else /* !POLL_DEBUG */ +#define IF_PD(x) +#endif /* POLL_DEBUG */ struct cb_data { @@ -133,6 +139,7 @@ int active_num_in_poll = 0; void POLL_FD_SET(int fd, short add) { int i; + IF_PD(fprintf(stderr, "BACKEND: POLL_FD_SET(%d, 0x%04x)\n", fd, add)); for(i=0; i<num_in_poll; i++) if(poll_fds[i].fd == fd) { @@ -154,6 +161,7 @@ void POLL_FD_SET(int fd, short add) void POLL_FD_CLR(int fd, short sub) { int i; + IF_PD(fprintf(stderr, "BACKEND: POLL_FD_CLR(%d, 0x%04x)\n", fd, sub)); if(!poll_fds) return; for(i=0; i<num_in_poll; i++) if(poll_fds[i].fd == fd) @@ -181,6 +189,8 @@ void switch_poll_set(void) struct pollfd *tmp = active_poll_fds; int sz = active_poll_fd_size; + IF_PD(fprintf(stderr, "BACKEND: switch_poll_set()\n")); + active_num_in_poll = num_in_poll; if(!num_in_poll) return; @@ -287,6 +297,9 @@ void set_read_callback(int fd,file_callback cb,void *data) #ifdef HAVE_POLL int was_set; #endif + IF_PD(fprintf(stderr, "BACKEND: set_read_callback(%d, %p, %p)\n", + fd, cb, data)); + ASSURE_FDS_SIZE( fd ); #ifdef HAVE_POLL was_set = (fds[fd].read.callback!=0); @@ -310,8 +323,13 @@ void set_read_callback(int fd,file_callback cb,void *data) wake_up_backend(); }else{ #ifdef HAVE_POLL +#if defined(WITH_OOB) + if (was_set && !fds[fd].read_oob.callback) + POLL_FD_CLR(fd, POLLRDNORM|POLLIN); +#else /* !WITH_OOB */ if(was_set) POLL_FD_CLR(fd, POLLRDNORM|POLLIN); +#endif /* WITH_OOB */ #else /* !HAVE_POLL */ if(fd <= max_fd) { @@ -338,6 +356,9 @@ void set_write_callback(int fd,file_callback cb,void *data) #ifdef HAVE_POLL int was_set; #endif + IF_PD(fprintf(stderr, "BACKEND: set_write_callback(%d, %p, %p)\n", + fd, cb, data)); + ASSURE_FDS_SIZE( fd ); #ifdef HAVE_POLL was_set = (fds[fd].write.callback!=0); @@ -362,13 +383,13 @@ void set_write_callback(int fd,file_callback cb,void *data) wake_up_backend(); } else { #ifdef HAVE_POLL -#if defined(WITH_OOB) && (POLLWRBAND == POLLOUT) +#if defined(WITH_OOB) if (was_set && !fds[fd].write_oob.callback) POLL_FD_CLR(fd, POLLOUT); -#else /* POLLWRBAND != POLLOUT */ +#else /* !WITH_OOB */ if(was_set) POLL_FD_CLR(fd, POLLOUT); -#endif /* POLLWRBAND == POLLOUT */ +#endif /* WITH_OOB */ #else /* !HAVE_POLL */ if(fd <= max_fd) { @@ -401,6 +422,9 @@ void set_read_oob_callback(int fd,file_callback cb,void *data) #ifdef HAVE_POLL int was_set; #endif + IF_PD(fprintf(stderr, "BACKEND: set_read_oob_callback(%d, %p, %p)\n", + fd, cb, data)); + ASSURE_FDS_SIZE( fd ); #ifdef HAVE_POLL was_set = (fds[fd].read_oob.callback!=0); @@ -415,7 +439,7 @@ void set_read_oob_callback(int fd,file_callback cb,void *data) if(cb) { #ifdef HAVE_POLL - POLL_FD_SET(fd, POLLRDBAND); + POLL_FD_SET(fd, POLLRDBAND|POLLRDNORM|POLLIN); #else my_FD_SET(fd, &selectors.except); #endif @@ -423,8 +447,15 @@ void set_read_oob_callback(int fd,file_callback cb,void *data) wake_up_backend(); }else{ #ifdef HAVE_POLL - if(was_set) - POLL_FD_CLR(fd, POLLRDBAND); + if(was_set) { + if (!fds[fd].read.callback) { + POLL_FD_CLR(fd, POLLRDBAND|POLLRDNORM|POLLIN); + } else { +#if (POLLRDBAND != POLLRDNORM) && (POLLRDBAND != POLLIN) + POLL_FD_CLR(fd, POLLRDBAND); +#endif /* (POLLRDBAND != POLLRDNORM) && (POLLRDBAND != POLLIN) */ + } + } #else /* !HAVE_POLL */ if(fd <= max_fd) { @@ -448,6 +479,9 @@ void set_write_oob_callback(int fd,file_callback cb,void *data) #ifdef HAVE_POLL int was_set; #endif + IF_PD(fprintf(stderr, "BACKEND: set_write_oob_callback(%d, %p, %p)\n", + fd, cb, data)); + ASSURE_FDS_SIZE( fd ); #ifdef HAVE_POLL was_set = (fds[fd].write_oob.callback!=0); @@ -463,7 +497,7 @@ void set_write_oob_callback(int fd,file_callback cb,void *data) if(cb) { #ifdef HAVE_POLL - POLL_FD_SET(fd,POLLWRBAND); + POLL_FD_SET(fd, POLLWRBAND|POLLOUT); #else my_FD_SET(fd, &selectors.write); /* FIXME:? */ #endif @@ -471,13 +505,15 @@ void set_write_oob_callback(int fd,file_callback cb,void *data) wake_up_backend(); }else{ #ifdef HAVE_POLL -#if POLLWRBAND == POLLOUT - if (was_set && !fds[fd].write.callback) - POLL_FD_CLR(fd,POLLWRBAND); -#else /* POLLWRBAND != POLLOUT */ - if(was_set) - POLL_FD_CLR(fd,POLLWRBAND); -#endif /* POLLWRBAND == POLLOUT */ + if(was_set) { + if (!fds[fd].write.callback) { + POLL_FD_CLR(fd, POLLWRBAND|POLLOUT); + } else { +#if POLLWRBAND != POLLOUT + POLL_FD_CLR(fd, POLLWRBAND); +#endif /* POLLWRBAND != POLLOUT */ + } + } #else /* !HAVE_POLL */ /* FIXME:? */ if(fd <= max_fd) @@ -505,6 +541,7 @@ PMOD_EXPORT file_callback query_read_callback(int fd) if(fd<0) fatal("File descriptor out of range.\n %d",fd); #endif + IF_PD(fprintf(stderr, "BACKEND: query_read_callback(%d)\n", fd)); ASSURE_FDS_SIZE( fd ); return fds[fd].read.callback; } @@ -515,6 +552,7 @@ PMOD_EXPORT file_callback query_write_callback(int fd) if(fd<0) fatal("File descriptor out of range.\n %d",fd); #endif + IF_PD(fprintf(stderr, "BACKEND: query_write_callback(%d)\n", fd)); ASSURE_FDS_SIZE( fd ); return fds[fd].write.callback; } @@ -526,6 +564,7 @@ PMOD_EXPORT file_callback query_read_oob_callback(int fd) if(fd<0) fatal("File descriptor out of range.\n %d",fd); #endif + IF_PD(fprintf(stderr, "BACKEND: query_read_oob_callback(%d)\n", fd)); ASSURE_FDS_SIZE( fd ); return fds[fd].read_oob.callback; } @@ -536,7 +575,7 @@ PMOD_EXPORT file_callback query_write_oob_callback(int fd) if(fd<0) fatal("File descriptor out of range.\n %d",fd); #endif - + IF_PD(fprintf(stderr, "BACKEND: query_write_oob_callback(%d)\n", fd)); ASSURE_FDS_SIZE( fd ); return fds[fd].write_oob.callback; } @@ -548,7 +587,7 @@ PMOD_EXPORT void *query_read_callback_data(int fd) if(fd<0) fatal("File descriptor out of range.\n %d",fd); #endif - + IF_PD(fprintf(stderr, "BACKEND: query_read_callback_data(%d)\n", fd)); ASSURE_FDS_SIZE( fd ); return fds[fd].read.data; } @@ -559,7 +598,7 @@ PMOD_EXPORT void *query_write_callback_data(int fd) if(fd<0) fatal("File descriptor out of range.\n %d",fd); #endif - + IF_PD(fprintf(stderr, "BACKEND: query_write_callback_data(%d)\n", fd)); ASSURE_FDS_SIZE( fd ); return fds[fd].write.data; } @@ -571,7 +610,7 @@ PMOD_EXPORT void *query_read_oob_callback_data(int fd) if(fd<0) fatal("File descriptor out of range.\n %d",fd); #endif - + IF_PD(fprintf(stderr, "BACKEND: query_read_oob_callback_data(%d)\n", fd)); ASSURE_FDS_SIZE( fd ); return fds[fd].read_oob.data; } @@ -582,7 +621,7 @@ PMOD_EXPORT void *query_write_oob_callback_data(int fd) if(fd<0) fatal("File descriptor out of range.\n %d",fd); #endif - + IF_PD(fprintf(stderr, "BACKEND: query_write_oob_callback_data(%d)\n", fd)); ASSURE_FDS_SIZE( fd ); return fds[fd].write_oob.data; } @@ -743,7 +782,10 @@ void backend(void) #ifdef HAVE_POLL { int msec = (next_timeout.tv_sec*1000) + next_timeout.tv_usec/1000; + IF_PD(fprintf(stderr, "BACKEND: poll(%p, %d, %ld)...", + active_poll_fds, active_num_in_poll, msec)); i = poll(active_poll_fds, active_num_in_poll, msec); + IF_PD(fprintf(stderr, " => %d\n", i)); } #else /* FIXME: OOB? */ @@ -821,6 +863,9 @@ void backend(void) #ifdef WITH_OOB if ((active_poll_fds[i].revents & POLLRDBAND) && fds[fd].read_oob.callback) { + IF_PD(fprintf(stderr, "BACKEND: POLLRDBAND\n")); + IF_PD(fprintf(stderr, "BACKEND: read_oob_callback(%d, %p)\n", + fd, fds[fd].read_oob.data)); (*(fds[fd].read_oob.callback))(fd, fds[fd].read_oob.data); #ifdef PIKE_DEBUG handled = 1; @@ -836,7 +881,10 @@ void backend(void) fprintf(stderr, "Got POLLERR on fd %d\n", i); } #endif /* PIKE_DEBUG */ + IF_PD(fprintf(stderr, "BACKEND: POLLHUP | POLLERR\n")); if (fds[fd].read.callback) { + IF_PD(fprintf(stderr, "BACKEND: read_callback(%d, %p)\n", + fd, fds[fd].read.data)); (*(fds[fd].read.callback))(fd,fds[fd].read.data); } /* We don't want to keep this fd anymore. */ @@ -847,7 +895,10 @@ void backend(void) } if(active_poll_fds[i].revents & (POLLRDNORM|POLLIN)) { + IF_PD(fprintf(stderr, "BACKEND: POLLRDNORM|POLLIN\n")); if (fds[fd].read.callback) { + IF_PD(fprintf(stderr, "BACKEND: read_callback(%d, %p)\n", + fd, fds[fd].read.data)); (*(fds[fd].read.callback))(fd,fds[fd].read.data); } else { POLL_FD_CLR(fd, POLLRDNORM|POLLIN); @@ -860,6 +911,9 @@ void backend(void) #ifdef WITH_OOB if ((active_poll_fds[i].revents & POLLWRBAND) && fds[fd].write_oob.callback) { + IF_PD(fprintf(stderr, "BACKEND: POLLWRBAND\n")); + IF_PD(fprintf(stderr, "BACKEND: write_oob_callback(%d, %p)\n", + fd, fds[fd].write_oob.data)); (*(fds[fd].write_oob.callback))(fd, fds[fd].write_oob.data); #ifdef PIKE_DEBUG handled = 1; @@ -868,7 +922,10 @@ void backend(void) #endif /* WITH_OOB */ if(active_poll_fds[i].revents & POLLOUT) { + IF_PD(fprintf(stderr, "BACKEND: POLLOUT\n")); if (fds[fd].write.callback) { + IF_PD(fprintf(stderr, "BACKEND: write_callback(%d, %p)\n", + fd, fds[fd].write.data)); (*(fds[fd].write.callback))(fd, fds[fd].write.data); } else { POLL_FD_CLR(fd, POLLOUT);