diff options
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/interface.c | 51 | ||||
-rw-r--r-- | src/ioops.c | 87 | ||||
-rw-r--r-- | src/ioops.h | 16 |
4 files changed, 106 insertions, 49 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 653ccb824..ef1c72494 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -101,6 +101,7 @@ mpd_SOURCES = \ inputStream_file.c \ inputStream_http.c \ interface.c \ + ioops.c \ list.c \ listen.c \ log.c \ diff --git a/src/interface.c b/src/interface.c index 76770a15f..289ed8066 100644 --- a/src/interface.c +++ b/src/interface.c @@ -49,9 +49,6 @@ static size_t interface_max_command_list_size = static size_t interface_max_output_buffer_size = INTERFACE_MAX_OUTPUT_BUFFER_SIZE_DEFAULT; -/* List of registered external IO handlers */ -static struct ioOps *ioList; - /* maybe make conf option for this, or... 32 might be good enough */ static long int interface_list_cache_size = 32; @@ -487,41 +484,18 @@ int doIOForInterfaces(void) while (1) { fdmax = 0; - FD_ZERO( &rfds ); - FD_ZERO( &wfds ); FD_ZERO( &efds ); addInterfacesReadyToReadAndListenSocketToFdSet(&rfds, &fdmax); addInterfacesForBufferFlushToFdSet(&wfds, &fdmax); - /* Add fds for all registered IO handlers */ - if( ioList ) { - struct ioOps *o = ioList; - while( o ) { - struct ioOps *current = o; - int fdnum; - assert( current->fdset ); - fdnum = current->fdset( &rfds, &wfds, &efds ); - if( fdmax < fdnum ) - fdmax = fdnum; - o = o->next; - } - } + registered_IO_add_fds(&fdmax, &rfds, &wfds, &efds); selret = select(fdmax + 1, &rfds, &wfds, &efds, &tv); if (selret < 0 && errno == EINTR) break; - /* Consume fds for all registered IO handlers */ - if( ioList ) { - struct ioOps *o = ioList; - while( o ) { - struct ioOps *current = o; - assert( current->consume ); - selret = current->consume( selret, &rfds, &wfds, &efds ); - o = o->next; - } - } + registered_IO_consume_fds(&selret, &rfds, &wfds, &efds); if (selret == 0) break; @@ -810,24 +784,3 @@ static void printInterfaceOutBuffer(Interface * interface) interface->send_buf_used = 0; } -/* From ioops.h: */ -void registerIO(struct ioOps *ops) -{ - assert(ops != NULL); - - ops->next = ioList; - ioList = ops; - ops->prev = NULL; - if (ops->next) - ops->next->prev = ops; -} - -void deregisterIO(struct ioOps *ops) -{ - assert(ops != NULL); - - if (ioList == ops) - ioList = ops->next; - else if (ops->prev != NULL) - ops->prev->next = ops->next; -} diff --git a/src/ioops.c b/src/ioops.c new file mode 100644 index 000000000..fde862b50 --- /dev/null +++ b/src/ioops.c @@ -0,0 +1,87 @@ +/* the Music Player Daemon (MPD) + * Copyright (C) 2003-2007 by Warren Dukes (warren.dukes@gmail.com) + * This project's homepage is: http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "ioops.h" + +/* Eventually the listener protocol will use this, too */ + +#ifdef HAVE_ZEROCONF + +/* + * functions and variables in this file are only used by a single thread and + * thus do not need to be thread-safe + */ + +/* List of registered external IO handlers */ +static struct ioOps *ioList; + +/* Add fds for all registered IO handlers */ +void registered_IO_add_fds(int *fdmax, + fd_set * rfds, fd_set * wfds, fd_set * efds) +{ + struct ioOps *o = ioList; + + while (o) { + struct ioOps *current = o; + int fdnum; + + assert(current->fdset); + fdnum = current->fdset(rfds, wfds, efds); + if (*fdmax < fdnum) + *fdmax = fdnum; + o = o->next; + } +} + +/* Consume fds for all registered IO handlers */ +void registered_IO_consume_fds(int *selret, + fd_set * rfds, fd_set * wfds, fd_set * efds) +{ + struct ioOps *o = ioList; + + while (o) { + struct ioOps *current = o; + + assert(current->consume); + *selret = current->consume(*selret, rfds, wfds, efds); + o = o->next; + } +} + +void registerIO(struct ioOps *ops) +{ + assert(ops != NULL); + + ops->next = ioList; + ioList = ops; + ops->prev = NULL; + if (ops->next) + ops->next->prev = ops; +} + +void deregisterIO(struct ioOps *ops) +{ + assert(ops != NULL); + + if (ioList == ops) + ioList = ops->next; + else if (ops->prev != NULL) + ops->prev->next = ops->next; +} + +#endif /* HAVE_ZEROCONF */ diff --git a/src/ioops.h b/src/ioops.h index 642ea79c7..6b23b0940 100644 --- a/src/ioops.h +++ b/src/ioops.h @@ -19,8 +19,10 @@ #ifndef IOOPS_H #define IOOPS_H +#include "../config.h" #include "os_compat.h" +#ifdef HAVE_ZEROCONF struct ioOps { struct ioOps *prev, *next; @@ -49,4 +51,18 @@ void registerIO(struct ioOps *ops); /* Call this to deregister your io operation handler struct */ void deregisterIO(struct ioOps *ops); +/* Add fds for all registered IO handlers */ +void registered_IO_add_fds(int *fdmax, + fd_set * rfds, fd_set * wfds, fd_set * efds); + +/* Consume fds for all registered IO handlers */ +void registered_IO_consume_fds(int *selret, + fd_set * rfds, fd_set * wfds, fd_set * efds); +#else /* ! HAVE_ZEROCONF */ + +#define registered_IO_add_fds(fdmax,rfds,wfds,efds) +#define registered_IO_consume_fds(selret,rfds,wfds,efds) + +#endif /* HAVE_ZEROCONF */ + #endif |