changed sockets and pipes used in httped to work in non-blocking mode
This commit is contained in:
@ -438,6 +438,26 @@ qse_mux_errnum_t qse_mux_geterrnum (qse_mux_t* mux)
|
||||
|
||||
int qse_mux_insert (qse_mux_t* mux, const qse_mux_evt_t* evt)
|
||||
{
|
||||
#if defined(USE_SELECT)
|
||||
/* nothing */
|
||||
#elif defined(USE_KQUEUE)
|
||||
struct kevent chlist[2];
|
||||
int count = 0;
|
||||
#elif defined(USE_EPOLL)
|
||||
struct epoll_event ev;
|
||||
#elif defined(__OS2__)
|
||||
/* nothing */
|
||||
#else
|
||||
/* nothing */
|
||||
#endif
|
||||
|
||||
/* sanity check */
|
||||
if (!(evt->mask & (QSE_MUX_IN | QSE_MUX_OUT)) || evt->hnd < 0)
|
||||
{
|
||||
mux->errnum = QSE_MUX_EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if defined(USE_SELECT)
|
||||
|
||||
/* TODO: windows seems to return a pretty high file descriptors
|
||||
@ -482,9 +502,6 @@ int qse_mux_insert (qse_mux_t* mux, const qse_mux_evt_t* evt)
|
||||
return 0;
|
||||
|
||||
#elif defined(USE_KQUEUE)
|
||||
struct kevent chlist[2];
|
||||
int count = 0;
|
||||
|
||||
/* TODO: study if it is better to put 'evt' to the udata
|
||||
* field of chlist? */
|
||||
|
||||
@ -502,11 +519,7 @@ int qse_mux_insert (qse_mux_t* mux, const qse_mux_evt_t* evt)
|
||||
count++;
|
||||
}
|
||||
|
||||
if (count == 0 || evt->hnd < 0)
|
||||
{
|
||||
mux->errnum = QSE_MUX_EINVAL;
|
||||
return -1;
|
||||
}
|
||||
QSE_ASSERT (count > 0);
|
||||
|
||||
if (evt->hnd >= mux->me.ubound)
|
||||
{
|
||||
@ -550,17 +563,12 @@ int qse_mux_insert (qse_mux_t* mux, const qse_mux_evt_t* evt)
|
||||
return 0;
|
||||
|
||||
#elif defined(USE_EPOLL)
|
||||
struct epoll_event ev;
|
||||
|
||||
QSE_MEMSET (&ev, 0, QSE_SIZEOF(ev));
|
||||
if (evt->mask & QSE_MUX_IN) ev.events |= EPOLLIN;
|
||||
if (evt->mask & QSE_MUX_OUT) ev.events |= EPOLLOUT;
|
||||
|
||||
if (ev.events == 0 || evt->hnd < 0)
|
||||
{
|
||||
mux->errnum = QSE_MUX_EINVAL;
|
||||
return -1;
|
||||
}
|
||||
QSE_ASSERT (ev.events != 0);
|
||||
|
||||
if (evt->hnd >= mux->me.ubound)
|
||||
{
|
||||
@ -937,13 +945,13 @@ int qse_mux_poll (qse_mux_t* mux, const qse_ntime_t* tmout)
|
||||
if (mux->ee.ptr[i].events & EPOLLIN) xevt.mask |= QSE_MUX_IN;
|
||||
if (mux->ee.ptr[i].events & EPOLLOUT) xevt.mask |= QSE_MUX_OUT;
|
||||
|
||||
if (mux->ee.ptr[i].events & EPOLLHUP)
|
||||
if (mux->ee.ptr[i].events & (EPOLLHUP | EPOLLERR))
|
||||
{
|
||||
if (evt->mask & QSE_MUX_IN) xevt.mask |= QSE_MUX_IN;
|
||||
if (evt->mask & QSE_MUX_OUT) xevt.mask |= QSE_MUX_OUT;
|
||||
}
|
||||
|
||||
mux->evtfun (mux, &xevt);
|
||||
if (xevt.mask > 0) mux->evtfun (mux, &xevt);
|
||||
}
|
||||
|
||||
return nfds;
|
||||
|
@ -429,6 +429,22 @@ static int get_highest_fd (void)
|
||||
|
||||
#endif
|
||||
|
||||
static int set_pipe_nonblock (qse_pio_t* pio, qse_pio_hnd_t fd, int enabled)
|
||||
{
|
||||
#if defined(O_NONBLOCK)
|
||||
|
||||
int flag = QSE_FCNTL (fd, F_GETFL, 0);
|
||||
if (flag >= 0) flag = QSE_FCNTL (fd, F_SETFL, (enabled? (flag | O_NONBLOCK): (flag & ~O_NONBLOCK)));
|
||||
if (flag <= -1) pio->errnum = syserr_to_errnum (errno);
|
||||
return flag;
|
||||
|
||||
#else
|
||||
pio->errnum = QSE_PIO_ENOIMPL;
|
||||
return -1;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
int qse_pio_init (
|
||||
qse_pio_t* pio, qse_mmgr_t* mmgr, const qse_char_t* cmd,
|
||||
qse_env_t* env, int flags)
|
||||
@ -1785,6 +1801,13 @@ create_process:
|
||||
|
||||
#endif
|
||||
|
||||
if (((flags & QSE_PIO_INNOBLOCK) && set_pipe_nonblock(pio, handle[1], 1) <= -1) ||
|
||||
((flags & QSE_PIO_OUTNOBLOCK) && set_pipe_nonblock(pio, handle[2], 1) <= -1) ||
|
||||
((flags & QSE_PIO_ERRNOBLOCK) && set_pipe_nobnlock(pio, handle[4], 1) <= -1))
|
||||
{
|
||||
goto oops;
|
||||
}
|
||||
|
||||
/* store back references */
|
||||
pio->pin[QSE_PIO_IN].self = pio;
|
||||
pio->pin[QSE_PIO_OUT].self = pio;
|
||||
@ -1795,6 +1818,7 @@ create_process:
|
||||
pio->pin[QSE_PIO_OUT].handle = handle[2];
|
||||
pio->pin[QSE_PIO_ERR].handle = handle[4];
|
||||
|
||||
|
||||
if (flags & QSE_PIO_TEXT)
|
||||
{
|
||||
int topt = 0;
|
||||
@ -1882,17 +1906,17 @@ oops:
|
||||
}
|
||||
for (i = minidx; i < maxidx; i++)
|
||||
{
|
||||
if (handle[i] != QSE_PIO_HND_NIL) QSE_CLOSE (handle[i]);
|
||||
if (handle[i] != QSE_PIO_HND_NIL) QSE_CLOSE (handle[i]);
|
||||
}
|
||||
#elif defined(QSE_SYSCALL0) && defined(SYS_vfork)
|
||||
for (i = minidx; i < maxidx; i++)
|
||||
{
|
||||
if (handle[i] != QSE_PIO_HND_NIL) QSE_CLOSE (handle[i]);
|
||||
if (handle[i] != QSE_PIO_HND_NIL) QSE_CLOSE (handle[i]);
|
||||
}
|
||||
#else
|
||||
for (i = minidx; i < maxidx; i++)
|
||||
{
|
||||
if (handle[i] != QSE_PIO_HND_NIL) QSE_CLOSE (handle[i]);
|
||||
if (handle[i] != QSE_PIO_HND_NIL) QSE_CLOSE (handle[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user