#include "portab.h"
-static char UNUSED id[] = "$Id: io.c,v 1.1 2005/07/07 18:38:35 fw Exp $";
+static char UNUSED id[] = "$Id: io.c,v 1.5 2005/07/14 14:35:38 fw Exp $";
#include <assert.h>
#include <stdlib.h>
#endif
#endif
+static bool library_initialized;
#ifdef IO_USE_EPOLL
#include <sys/epoll.h>
i = (io_event *) array_get(&io_events, sizeof(io_event), fd);
assert(i);
- if (!i) {
-#ifdef DEBUG
- Log(LOG_DEBUG, "io_event_add(): EMPTY FOR fd %d", fd);
-#endif
- return NULL;
- }
return i;
}
bool
io_library_init(unsigned int eventsize)
{
+ bool ret;
#ifdef IO_USE_EPOLL
int ecreate_hint = (int)eventsize;
if (ecreate_hint <= 0)
ecreate_hint = 128;
#endif
+ if (library_initialized)
+ return true;
+
#ifdef IO_USE_SELECT
#ifdef FD_SETSIZE
if (eventsize >= FD_SETSIZE)
#ifdef IO_USE_EPOLL
io_masterfd = epoll_create(ecreate_hint);
Log(LOG_INFO,
- "io subsystem: using epoll (hint size %d), initial io_event maxfd: %u, io_masterfd %d",
+ "IO subsystem: epoll (hint size %d, initial maxfd %u, masterfd %d).",
ecreate_hint, eventsize, io_masterfd);
- return io_masterfd >= 0;
+ ret = io_masterfd >= 0;
+ if (ret) library_initialized = true;
+
+ return ret;
#endif
#ifdef IO_USE_SELECT
- Log(LOG_INFO, "io subsystem: using select, initial io_event maxfd: %u",
+ Log(LOG_INFO, "IO subsystem: select (initial maxfd %u).",
eventsize);
FD_ZERO(&readers);
FD_ZERO(&writers);
#ifdef FD_SETSIZE
if (Conf_MaxConnections >= FD_SETSIZE) {
Log(LOG_WARNING,
- "Conf_MaxConnections (%d) exceeds limit (%u), changed Conf_MaxConnections to %u",
+ "MaxConnections (%d) exceeds limit (%u), changed MaxConnections to %u.",
Conf_MaxConnections, FD_SETSIZE, FD_SETSIZE - 1);
Conf_MaxConnections = FD_SETSIZE - 1;
}
#else
Log(LOG_WARNING,
- "FD_SETSIZE undefined, don't know how many descriptors select() can handle on your platform");
-#endif
+ "FD_SETSIZE undefined, don't know how many descriptors select() can handle on your platform ...");
+#endif /* FD_SETSIZE */
+ library_initialized = true;
return true;
-#endif
+#endif /* SELECT */
#ifdef IO_USE_KQUEUE
io_masterfd = kqueue();
Log(LOG_INFO,
- "io subsystem: using kqueue, initial io_event maxfd: %u, io_masterfd %d",
+ "IO subsystem: kqueue (initial maxfd %u, masterfd %d)",
eventsize, io_masterfd);
- return io_masterfd >= 0;
+ ret = io_masterfd >= 0;
+ if (ret) library_initialized = true;
+
+ return ret;
#endif
}
-bool
+void
io_library_shutdown(void)
{
- unsigned int len = array_length(&io_events, sizeof(io_event));
-
- while (len--) {
- if (NULL == io_event_get(len))
- continue;
- }
-#ifndef IO_USE_SELECT
- close(io_masterfd); /* kqueue, epoll */
- io_masterfd = -1;
-#else
+#ifdef IO_USE_SELECT
FD_ZERO(&readers);
FD_ZERO(&writers);
+#else
+ close(io_masterfd); /* kqueue, epoll */
+ io_masterfd = -1;
#endif
#ifdef IO_USE_KQUEUE
array_free(&io_evcache);
#endif
- return true;
+ library_initialized = false;
}
if (i->what == what)
return true;
#ifdef DEBUG
- Log(LOG_DEBUG, "io_event_add(): fd %d (arg: %d), what %d.", i->fd, fd,
- what);
+ Log(LOG_DEBUG, "io_event_add(): fd %d (arg: %d), what %d.", i->fd, fd, what);
#endif
i->what |= what;
#endif
io_event *i = io_event_get(fd);
#ifdef DEBUG
- Log(LOG_DEBUG, "io_event_del(): trying to delete eventtype %d on fd %d",
- what, fd);
+ Log(LOG_DEBUG, "io_event_del(): trying to delete eventtype %d on fd %d", what, fd);
#endif
assert(i);
if (!i)
- return true;
+ return false;
i->what &= ~what;
assert(newevents);
#endif
- ret = kevent(io_masterfd, newevents, newevents_len, kev, 100, &ts);
+ ret = kevent(io_masterfd, newevents, newevents_len, kev,
+ 100, &ts);
if ((newevents_len>0) && ret != -1)
array_trunc(&io_evcache);