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:
parent
7051862205
commit
1f8372f35d
@ -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);
|
||||||
|
|
||||||
|
@ -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';
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
* ========================================================================= */
|
* ========================================================================= */
|
||||||
|
@ -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 */
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user