fixed to initialize urem in __dev_writev()

added MIO_DEV_SCK_BIND_IGNERR
implemented MIO_DEV_PRO_INTONUL, MIO_DEV_PRO_OUTTONUL, MIO_DEV_PRO_ERRTONUL, MIO_DEV_PRO_DROPIN, MIO_DEV_PRO_DROPOUT, MIO_DEV_PRO_DROERR
This commit is contained in:
hyung-hwan 2020-05-24 01:18:32 +00:00
parent 7051862205
commit 1f8372f35d
8 changed files with 58 additions and 26 deletions

View File

@ -671,8 +671,12 @@ static int x = 0;
int y; int y;
int z = 0; int z = 0;
//y = ++x; #if defined(__ATOMIC_RELAXED)
y = __atomic_add_fetch (&x, 1, __ATOMIC_RELAXED); y = __atomic_add_fetch (&x, 1, __ATOMIC_RELAXED);
#else
// this is buggy..
y = ++x;
#endif
while ((n = read(iop->rfd, buf, MIO_COUNTOF(buf)))> 0) write (iop->wfd, buf, n); while ((n = read(iop->rfd, buf, MIO_COUNTOF(buf)))> 0) write (iop->wfd, buf, n);
@ -1031,6 +1035,7 @@ int main (int argc, char* argv[])
} }
memset (&tcp_lstn, 0, MIO_SIZEOF(tcp_lstn));
tcp_lstn.backlogs = 100; tcp_lstn.backlogs = 100;
if (mio_dev_sck_listen(tcp[1], &tcp_lstn) <= -1) if (mio_dev_sck_listen(tcp[1], &tcp_lstn) <= -1)
{ {
@ -1139,7 +1144,8 @@ for (i = 0; i < 5; i++)
dnc = mio_svc_dnc_start(mio, &servaddr, MIO_NULL, &send_tmout, &reply_tmout, 2); /* option - send to all, send one by one */ dnc = mio_svc_dnc_start(mio, &servaddr, MIO_NULL, &send_tmout, &reply_tmout, 2); /* option - send to all, send one by one */
htts = mio_svc_htts_start(mio, &htts_bind_addr, process_http_request); htts = mio_svc_htts_start(mio, &htts_bind_addr, process_http_request);
mio_svc_htts_setservernamewithbcstr (htts, "MIO-HTTP"); if (htts) mio_svc_htts_setservernamewithbcstr (htts, "MIO-HTTP");
else MIO_INFO1 (mio, "UNABLE TO START HTTS - %js\n", mio_geterrmsg(mio));
#if 1 #if 1
{ {
@ -1258,6 +1264,7 @@ if (!mio_svc_dnc_resolve(dnc, "google.com", MIO_DNS_RRT_SOA, MIO_SVC_DNC_RESOLVE
} }
#endif #endif
#if 0
{ {
mio_dev_pipe_t* pp; mio_dev_pipe_t* pp;
mio_dev_pipe_make_t mi; mio_dev_pipe_make_t mi;
@ -1281,6 +1288,7 @@ for (i = 0; i < 20; i++)
mio_dev_thr_write (tt, "hello, world", 12, MIO_NULL); mio_dev_thr_write (tt, "hello, world", 12, MIO_NULL);
mio_dev_thr_write (tt, MIO_NULL, 0, MIO_NULL); mio_dev_thr_write (tt, MIO_NULL, 0, MIO_NULL);
} }
#endif
mio_loop (mio); mio_loop (mio);

View File

@ -395,7 +395,7 @@ mio_svc_htts_t* mio_svc_htts_start (mio_t* mio, const mio_skad_t* bind_addr, mio
MIO_MEMSET (&info, 0, MIO_SIZEOF(info)); MIO_MEMSET (&info, 0, MIO_SIZEOF(info));
info.b.localaddr = *bind_addr; info.b.localaddr = *bind_addr;
info.b.options = MIO_DEV_SCK_BIND_REUSEADDR | MIO_DEV_SCK_BIND_REUSEPORT; info.b.options = MIO_DEV_SCK_BIND_REUSEADDR | MIO_DEV_SCK_BIND_REUSEPORT | MIO_DEV_SCK_BIND_IGNERR;
/*info.b.options |= MIO_DEV_SCK_BIND_SSL; */ /*info.b.options |= MIO_DEV_SCK_BIND_SSL; */
info.b.ssl_certfile = "localhost.crt"; info.b.ssl_certfile = "localhost.crt";
info.b.ssl_keyfile = "localhost.key"; info.b.ssl_keyfile = "localhost.key";
@ -826,6 +826,7 @@ static int cgi_peer_on_read (mio_dev_pro_t* pro, mio_dev_pro_sid_t sid, const vo
MIO_ASSERT (mio, !(cgi_state->over & CGI_STATE_OVER_READ_FROM_PEER)); MIO_ASSERT (mio, !(cgi_state->over & CGI_STATE_OVER_READ_FROM_PEER));
printf ("FEED %d BYTES TO HTRD\n", (int)dlen);
if (mio_htrd_feed(cgi_state->peer_htrd, data, dlen, &rem) <= -1) if (mio_htrd_feed(cgi_state->peer_htrd, data, dlen, &rem) <= -1)
{ {
MIO_DEBUG3 (mio, "HTTPS(%p) - unable to feed peer into to htrd - peer %p(pid=%u)\n", cgi_state->htts, pro, (unsigned int)pro->child_pid); MIO_DEBUG3 (mio, "HTTPS(%p) - unable to feed peer into to htrd - peer %p(pid=%u)\n", cgi_state->htts, pro, (unsigned int)pro->child_pid);
@ -964,7 +965,9 @@ static int cgi_peer_htrd_push_content (mio_htrd_t* htrd, mio_htre_t* req, const
mio_bch_t lbuf[16]; mio_bch_t lbuf[16];
mio_oow_t llen; mio_oow_t llen;
llen = mio_fmt_uintmax_to_bcstr(lbuf, MIO_COUNTOF(lbuf) - 2, dlen, 16 | MIO_FMT_UINTMAX_UPPERCASE, 0, '\0', MIO_NULL); /* mio_fmt_uintmax_to_bcstr() null-terminates the output. only MIO_COUNTOF(lbuf) - 1
* is enough to hold '\r' and '\n' at the back without '\0'. */
llen = mio_fmt_uintmax_to_bcstr(lbuf, MIO_COUNTOF(lbuf) - 1, dlen, 16 | MIO_FMT_UINTMAX_UPPERCASE, 0, '\0', MIO_NULL);
lbuf[llen++] = '\r'; lbuf[llen++] = '\r';
lbuf[llen++] = '\n'; lbuf[llen++] = '\n';

View File

@ -315,6 +315,7 @@ enum mio_dev_sck_bind_option_t
/* TODO: more options --- SO_RCVBUF, SO_SNDBUF, SO_RCVTIMEO, SO_SNDTIMEO, SO_KEEPALIVE */ /* TODO: more options --- SO_RCVBUF, SO_SNDBUF, SO_RCVTIMEO, SO_SNDTIMEO, SO_KEEPALIVE */
/* BINDTODEVICE??? */ /* BINDTODEVICE??? */
MIO_DEV_SCK_BIND_IGNERR = (1 << 14), /* ignore non-critical error in binding */
MIO_DEV_SCK_BIND_SSL = (1 << 15) MIO_DEV_SCK_BIND_SSL = (1 << 15)
}; };
typedef enum mio_dev_sck_bind_option_t mio_dev_sck_bind_option_t; typedef enum mio_dev_sck_bind_option_t mio_dev_sck_bind_option_t;

View File

@ -1429,12 +1429,11 @@ static int __dev_writev (mio_dev_t* dev, mio_iovec_t* iov, mio_iolen_t iovcnt, c
len = 0; len = 0;
for (i = 0; i < iovcnt; i++) len += iov[i].iov_len; for (i = 0; i < iovcnt; i++) len += iov[i].iov_len;
urem = len;
if (!MIO_WQ_IS_EMPTY(&dev->wq)) if (!MIO_WQ_IS_EMPTY(&dev->wq))
{ {
/* the writing queue is not empty. /* if the writing queue is not empty, enqueue this request immediately */
* enqueue this request immediately */
urem = len;
goto enqueue_data; goto enqueue_data;
} }
@ -1523,7 +1522,7 @@ enqueue_data:
/* queue the remaining data*/ /* queue the remaining data*/
q = (mio_wq_t*)mio_allocmem(mio, MIO_SIZEOF(*q) + (dstaddr? dstaddr->len: 0) + urem); q = (mio_wq_t*)mio_allocmem(mio, MIO_SIZEOF(*q) + (dstaddr? dstaddr->len: 0) + urem);
if (!q) return -1; if (MIO_UNLIKELY(!q)) return -1;
q->tmridx = MIO_TMRIDX_INVALID; q->tmridx = MIO_TMRIDX_INVALID;
q->dev = dev; q->dev = dev;
@ -1542,7 +1541,7 @@ enqueue_data:
q->ptr = (mio_uint8_t*)(q + 1) + q->dstaddr.len; q->ptr = (mio_uint8_t*)(q + 1) + q->dstaddr.len;
q->len = urem; q->len = urem;
q->olen = len; q->olen = len; /* original length to use when invoking on_write() */
for (i = index, j = 0; i < iovcnt; i++) for (i = index, j = 0; i < iovcnt; i++)
{ {
MIO_MEMCPY (&q->ptr[j], iov[i].iov_ptr, iov[i].iov_len); MIO_MEMCPY (&q->ptr[j], iov[i].iov_ptr, iov[i].iov_len);

View File

@ -1003,6 +1003,12 @@ MIO_EXPORT void mio_freemem (
void* ptr void* ptr
); );
MIO_EXPORT void mio_addcfmb (
mio_t* mio,
mio_cfmb_t* cfmb,
mio_cfmb_checker_t checker
);
/* ========================================================================= /* =========================================================================
* STRING ENCODING CONVERSION * STRING ENCODING CONVERSION
* ========================================================================= */ * ========================================================================= */

View File

@ -205,8 +205,19 @@ static pid_t standard_fork_and_exec (mio_dev_pro_t* dev, int pfds[], mio_dev_pro
devnull = open("/dev/null", O_RDWR, 0); devnull = open("/dev/null", O_RDWR, 0);
#endif #endif
if (devnull == MIO_SYSHND_INVALID) goto slave_oops; if (devnull == MIO_SYSHND_INVALID) goto slave_oops;
if ((mi->flags & MIO_DEV_PRO_INTONUL) && dup2(devnull, 0) == -1) goto slave_oops;
if ((mi->flags & MIO_DEV_PRO_OUTTONUL) && dup2(devnull, 1) == -1) goto slave_oops;
if ((mi->flags & MIO_DEV_PRO_ERRTONUL) && dup2(devnull, 2) == -1) goto slave_oops;
close (devnull);
devnull = MIO_SYSHND_INVALID;
} }
if (mi->flags & MIO_DEV_PRO_DROPIN) close (0);
if (mi->flags & MIO_DEV_PRO_DROPOUT) close (1);
if (mi->flags & MIO_DEV_PRO_DROPERR) close (2);
execv (param->argv[0], param->argv); execv (param->argv[0], param->argv);
/* if exec fails, free 'param' parameter which is an inherited pointer */ /* if exec fails, free 'param' parameter which is an inherited pointer */

View File

@ -808,10 +808,13 @@ static int dev_sck_ioctl (mio_dev_t* dev, int cmd, void* arg)
#if defined(SO_REUSEADDR) #if defined(SO_REUSEADDR)
int v = 1; int v = 1;
if (setsockopt(rdev->hnd, SOL_SOCKET, SO_REUSEADDR, &v, MIO_SIZEOF(v)) == -1) if (setsockopt(rdev->hnd, SOL_SOCKET, SO_REUSEADDR, &v, MIO_SIZEOF(v)) == -1)
{
if (!(bnd->options & MIO_DEV_SCK_BIND_IGNERR))
{ {
mio_seterrbfmtwithsyserr (mio, 0, errno, "unable to set SO_REUSEADDR"); mio_seterrbfmtwithsyserr (mio, 0, errno, "unable to set SO_REUSEADDR");
return -1; return -1;
} }
}
/* ignore it if not available /* ignore it if not available
#else #else
mio_seterrnum (mio, MIO_ENOIMPL); mio_seterrnum (mio, MIO_ENOIMPL);
@ -825,10 +828,13 @@ static int dev_sck_ioctl (mio_dev_t* dev, int cmd, void* arg)
#if defined(SO_REUSEPORT) #if defined(SO_REUSEPORT)
int v = 1; int v = 1;
if (setsockopt(rdev->hnd, SOL_SOCKET, SO_REUSEPORT, &v, MIO_SIZEOF(v)) == -1) if (setsockopt(rdev->hnd, SOL_SOCKET, SO_REUSEPORT, &v, MIO_SIZEOF(v)) == -1)
{
if (!(bnd->options & MIO_DEV_SCK_BIND_IGNERR))
{ {
mio_seterrbfmtwithsyserr (mio, 0, errno, "unable to set SO_REUSEPORT"); mio_seterrbfmtwithsyserr (mio, 0, errno, "unable to set SO_REUSEPORT");
return -1; return -1;
} }
}
/* ignore it if not available /* ignore it if not available
#else #else
mio_seterrnum (mio, MIO_ENOIMPL); mio_seterrnum (mio, MIO_ENOIMPL);

View File

@ -34,6 +34,17 @@
/* ========================================================================= */ /* ========================================================================= */
struct mio_dev_thr_info_t
{
MIO_CFMB_HEADER;
mio_dev_thr_func_t thr_func;
mio_dev_thr_iopair_t thr_iop;
void* thr_ctx;
pthread_t thr_hnd;
int thr_done;
};
struct slave_info_t struct slave_info_t
{ {
mio_dev_thr_make_t* mi; mio_dev_thr_make_t* mi;
@ -48,19 +59,6 @@ static mio_dev_thr_slave_t* make_slave (mio_t* mio, slave_info_t* si);
/* ========================================================================= */ /* ========================================================================= */
struct mio_dev_thr_info_t
{
MIO_CFMB_HEADER;
mio_dev_thr_func_t thr_func;
mio_dev_thr_iopair_t thr_iop;
void* thr_ctx;
pthread_t thr_hnd;
int thr_done;
};
typedef struct mio_dev_thr_info_t mio_dev_thr_info_t;
static void free_thr_info_resources (mio_t* mio, mio_dev_thr_info_t* ti) static void free_thr_info_resources (mio_t* mio, mio_dev_thr_info_t* ti)
{ {