added the 'select' support as a multiplexer mechanism
This commit is contained in:
parent
c647f76cdf
commit
64e1cee44a
@ -123,7 +123,12 @@
|
|||||||
# define XPOLLERR POLLERR
|
# define XPOLLERR POLLERR
|
||||||
# define XPOLLHUP POLLHUP
|
# define XPOLLHUP POLLHUP
|
||||||
# else
|
# else
|
||||||
# error UNSUPPORTED MULTIPLEXER
|
# define USE_SELECT
|
||||||
|
/* fake XPOLLXXX values */
|
||||||
|
# define XPOLLIN (1 << 0)
|
||||||
|
# define XPOLLOUT (1 << 1)
|
||||||
|
# define XPOLLERR (1 << 2)
|
||||||
|
# define XPOLLHUP (1 << 3)
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@ -197,11 +202,11 @@ struct xtn_t
|
|||||||
#if defined(USE_DEVPOLL)
|
#if defined(USE_DEVPOLL)
|
||||||
/*TODO: make it dynamically changeable depending on the number of
|
/*TODO: make it dynamically changeable depending on the number of
|
||||||
* file descriptors added */
|
* file descriptors added */
|
||||||
struct pollfd buf[64];
|
struct pollfd buf[64]; /* buffer for reading events */
|
||||||
#elif defined(USE_EPOLL)
|
#elif defined(USE_EPOLL)
|
||||||
/*TODO: make it dynamically changeable depending on the number of
|
/*TODO: make it dynamically changeable depending on the number of
|
||||||
* file descriptors added */
|
* file descriptors added */
|
||||||
struct epoll_event buf[64];
|
struct epoll_event buf[64]; /* buffer for reading events */
|
||||||
#elif defined(USE_POLL)
|
#elif defined(USE_POLL)
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
@ -210,6 +215,13 @@ struct xtn_t
|
|||||||
moo_oow_t len;
|
moo_oow_t len;
|
||||||
} reg; /* registrar */
|
} reg; /* registrar */
|
||||||
struct pollfd* buf;
|
struct pollfd* buf;
|
||||||
|
#elif defined(USE_SELECT)
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
fd_set rfds;
|
||||||
|
fd_set wfds;
|
||||||
|
int maxfd;
|
||||||
|
} reg;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
moo_oow_t len;
|
moo_oow_t len;
|
||||||
@ -850,6 +862,18 @@ static int _add_poll_fd (moo_t* moo, int fd, int event_mask, moo_oow_t event_dat
|
|||||||
xtn->epd.ptr[fd] = event_data;
|
xtn->epd.ptr[fd] = event_data;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
#elif defined(USE_SELECT)
|
||||||
|
xtn_t* xtn = (xtn_t*)moo_getxtn(moo);
|
||||||
|
if (event_mask & XPOLLIN)
|
||||||
|
{
|
||||||
|
FD_SET (fd, &xtn->ev.reg.rfds);
|
||||||
|
if (fd > xtn->ev.reg.maxfd) xtn->ev.reg.maxfd = fd;
|
||||||
|
}
|
||||||
|
if (event_mask & XPOLLOUT)
|
||||||
|
{
|
||||||
|
FD_SET (fd, &xtn->ev.reg.wfds);
|
||||||
|
if (fd > xtn->ev.reg.maxfd) xtn->ev.reg.maxfd = fd;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
|
|
||||||
MOO_DEBUG1 (moo, "Cannot add file descriptor %d to poll - not implemented\n", fd);
|
MOO_DEBUG1 (moo, "Cannot add file descriptor %d to poll - not implemented\n", fd);
|
||||||
@ -913,6 +937,23 @@ static int _del_poll_fd (moo_t* moo, int fd)
|
|||||||
moo_seterrnum (moo, MOO_ENOENT);
|
moo_seterrnum (moo, MOO_ENOENT);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
#elif defined(USE_SELECT)
|
||||||
|
xtn_t* xtn = (xtn_t*)moo_getxtn(moo);
|
||||||
|
|
||||||
|
FD_CLR (fd, &xtn->ev.reg.rfds);
|
||||||
|
FD_CLR (fd, &xtn->ev.reg.wfds);
|
||||||
|
if (fd == xtn->ev.reg.maxfd)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
/* TODO: any way to make this search faster or to do without the search like this */
|
||||||
|
for (i = fd; i > 0;)
|
||||||
|
{
|
||||||
|
i--;
|
||||||
|
if (FD_ISSET(i, &xtn->ev.reg.rfds) || FD_ISSET(i, &xtn->ev.reg.wfds)) break;
|
||||||
|
}
|
||||||
|
xtn->ev.reg.maxfd = i;
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
MOO_DEBUG1 (moo, "Cannot remove file descriptor %d from poll - not implemented\n", fd);
|
MOO_DEBUG1 (moo, "Cannot remove file descriptor %d from poll - not implemented\n", fd);
|
||||||
@ -972,6 +1013,23 @@ static int _mod_poll_fd (moo_t* moo, int fd, int event_mask, moo_oow_t event_dat
|
|||||||
moo_seterrnum (moo, MOO_ENOENT);
|
moo_seterrnum (moo, MOO_ENOENT);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
#elif defined(USE_SELECT)
|
||||||
|
|
||||||
|
xtn_t* xtn = (xtn_t*)moo_getxtn(moo);
|
||||||
|
|
||||||
|
MOO_ASSERT (moo, fd <= xtn->ev.reg.maxfd);
|
||||||
|
MOO_ASSERT (moo, event_mask & (XPOLLIN | XPOLLOUT));
|
||||||
|
|
||||||
|
if (event_mask & XPOLLIN)
|
||||||
|
FD_SET (fd, &xtn->ev.reg.rfds);
|
||||||
|
else
|
||||||
|
FD_CLR (fd, &xtn->ev.reg.rfds);
|
||||||
|
|
||||||
|
if (event_mask & XPOLLOUT)
|
||||||
|
FD_SET (fd, &xtn->ev.reg.wfds);
|
||||||
|
else
|
||||||
|
FD_CLR (fd, &xtn->ev.reg.wfds);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
MOO_DEBUG1 (moo, "Cannot modify file descriptor %d in poll - not implemented\n", fd);
|
MOO_DEBUG1 (moo, "Cannot modify file descriptor %d in poll - not implemented\n", fd);
|
||||||
moo_seterrnum (moo, MOO_ENOIMPL);
|
moo_seterrnum (moo, MOO_ENOIMPL);
|
||||||
@ -994,6 +1052,8 @@ static void* iothr_main (void* arg)
|
|||||||
int n;
|
int n;
|
||||||
#if defined(USE_DEVPOLL)
|
#if defined(USE_DEVPOLL)
|
||||||
struct dvpoll dvp;
|
struct dvpoll dvp;
|
||||||
|
#elif defined(USE_SELECT)
|
||||||
|
struct timeval tv;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
poll_for_event:
|
poll_for_event:
|
||||||
@ -1008,6 +1068,10 @@ static void* iothr_main (void* arg)
|
|||||||
#elif defined(USE_POLL)
|
#elif defined(USE_POLL)
|
||||||
memcpy (xtn->ev.buf, xtn->ev.reg.ptr, xtn->ev.reg.len * MOO_SIZEOF(*xtn->ev.buf));
|
memcpy (xtn->ev.buf, xtn->ev.reg.ptr, xtn->ev.reg.len * MOO_SIZEOF(*xtn->ev.buf));
|
||||||
n = poll (xtn->ev.buf, xtn->ev.reg.len, 10000);
|
n = poll (xtn->ev.buf, xtn->ev.reg.len, 10000);
|
||||||
|
#elif defined(USE_SELECT)
|
||||||
|
tv.tv_sec = 10;
|
||||||
|
tv.tv_usec = 0;
|
||||||
|
n = select (xtn->ev.reg.maxfd + 1, &xtn->ev.reg.rfds, &xtn->ev.reg.wfds, NULL, &tv);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pthread_mutex_lock (&xtn->ev.mtx);
|
pthread_mutex_lock (&xtn->ev.mtx);
|
||||||
@ -1092,6 +1156,10 @@ static int vm_startup (moo_t* moo)
|
|||||||
flag = fcntl (xtn->ep, F_GETFD);
|
flag = fcntl (xtn->ep, F_GETFD);
|
||||||
if (flag >= 0) fcntl (xtn->ep, F_SETFD, flag | FD_CLOEXEC);
|
if (flag >= 0) fcntl (xtn->ep, F_SETFD, flag | FD_CLOEXEC);
|
||||||
#endif
|
#endif
|
||||||
|
#elif defined(USE_SELECT)
|
||||||
|
FD_ZERO (xtn->ev.reg.rfds);
|
||||||
|
FD_ZERO (xtn->ev.reg.wfds);
|
||||||
|
xtn->ev.reg.maxfd = -1;
|
||||||
#endif /* USE_DEVPOLL */
|
#endif /* USE_DEVPOLL */
|
||||||
|
|
||||||
|
|
||||||
@ -1208,6 +1276,10 @@ static void vm_cleanup (moo_t* moo)
|
|||||||
moo_freemem (moo, xtn->ev.buf);
|
moo_freemem (moo, xtn->ev.buf);
|
||||||
xtn->ev.buf = MOO_NULL;
|
xtn->ev.buf = MOO_NULL;
|
||||||
}
|
}
|
||||||
|
#elif defined(USE_SELECT)
|
||||||
|
FD_ZERO (xtn->ev.reg.rfds);
|
||||||
|
FD_ZERO (xtn->ev.reg.wfds);
|
||||||
|
xtn->ev.reg.maxfd = -1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(USE_DEVPOLL) || defined(USE_POLL)
|
#if defined(USE_DEVPOLL) || defined(USE_POLL)
|
||||||
@ -1441,6 +1513,8 @@ static void vm_muxwait (moo_t* moo, const moo_ntime_t* dur, moo_vmprim_muxwait_c
|
|||||||
int tmout = 0, n;
|
int tmout = 0, n;
|
||||||
#if defined(USE_DEVPOLL)
|
#if defined(USE_DEVPOLL)
|
||||||
struct dvpoll dvp;
|
struct dvpoll dvp;
|
||||||
|
#elif defined(USE_SELECT)
|
||||||
|
struct timeval tv;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (dur) tmout = MOO_SECNSEC_TO_MSEC(dur->sec, dur->nsec);
|
if (dur) tmout = MOO_SECNSEC_TO_MSEC(dur->sec, dur->nsec);
|
||||||
@ -1455,6 +1529,10 @@ static void vm_muxwait (moo_t* moo, const moo_ntime_t* dur, moo_vmprim_muxwait_c
|
|||||||
#elif defined(USE_POLL)
|
#elif defined(USE_POLL)
|
||||||
memcpy (xtn->ev.buf, xtn->ev.reg.ptr, xtn->ev.reg.len * MOO_SIZEOF(*xtn->ev.buf));
|
memcpy (xtn->ev.buf, xtn->ev.reg.ptr, xtn->ev.reg.len * MOO_SIZEOF(*xtn->ev.buf));
|
||||||
n = poll (xtn->ev.buf, xtn->ev.reg.len, tmout);
|
n = poll (xtn->ev.buf, xtn->ev.reg.len, tmout);
|
||||||
|
#elif defined(USE_SELECT)
|
||||||
|
tv.tv_sec = dur->sec;
|
||||||
|
tv.tv_usec = MOO_NSEC_TO_USEC(dur->nsec);
|
||||||
|
n = select (xtn->ev.reg.maxfd + 1, &xtn->ev.reg.rfds, &xtn->ev.reg.wfds, NULL, &tv);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (n <= -1)
|
if (n <= -1)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user