From a9706243f8e1fe8bea83af92ccfff410e5760833 Mon Sep 17 00:00:00 2001 From: "hyunghwan.chung" Date: Tue, 13 Nov 2018 07:40:30 +0000 Subject: [PATCH] changed to use pipe2() if available grouped some variables in xtn_t in std.c --- moo/lib/std.c | 190 +++++++++++++++++++++++++++----------------------- 1 file changed, 103 insertions(+), 87 deletions(-) diff --git a/moo/lib/std.c b/moo/lib/std.c index 20a0cab..4b8c8bf 100644 --- a/moo/lib/std.c +++ b/moo/lib/std.c @@ -29,6 +29,7 @@ #include #include +#include #if !defined(__DOS__) && defined(HAVE_PTHREAD) && defined(HAVE_STRERROR_R) # define USE_THREAD @@ -265,15 +266,18 @@ struct xtn_t int vm_running; - moo_bitmask_t logmask; - int logfd; - int logfd_flag; /* bitwise OR'ed fo logfd_flag_t bits */ - struct { - moo_bch_t buf[4096]; - moo_oow_t len; - } logbuf; + moo_bitmask_t mask; + int fd; + int fd_flag; /* bitwise OR'ed fo logfd_flag_t bits */ + + struct + { + moo_bch_t buf[4096]; + moo_oow_t len; + } out; + } log; const moo_iostd_t* in; @@ -297,10 +301,13 @@ struct xtn_t #endif #if defined(USE_THREAD) - int p[2]; /* pipe for signaling */ - pthread_t iothr; - int iothr_up; - int iothr_abort; + struct + { + int p[2]; /* pipe for signaling */ + pthread_t thr; + int up; + int abort; + } iothr; #endif struct @@ -684,23 +691,23 @@ static int write_log (moo_t* moo, int fd, const moo_bch_t* ptr, moo_oow_t len) while (len > 0) { - if (xtn->logbuf.len > 0) + if (xtn->log.out.len > 0) { moo_oow_t rcapa, cplen; - rcapa = MOO_COUNTOF(xtn->logbuf.buf) - xtn->logbuf.len; + rcapa = MOO_COUNTOF(xtn->log.out.buf) - xtn->log.out.len; cplen = (len >= rcapa)? rcapa: len; - MOO_MEMCPY (&xtn->logbuf.buf[xtn->logbuf.len], ptr, cplen); - xtn->logbuf.len += cplen; + MOO_MEMCPY (&xtn->log.out.buf[xtn->log.out.len], ptr, cplen); + xtn->log.out.len += cplen; ptr += cplen; len -= cplen; - if (xtn->logbuf.len >= MOO_COUNTOF(xtn->logbuf.buf)) + if (xtn->log.out.len >= MOO_COUNTOF(xtn->log.out.buf)) { int n; - n = write_all(fd, xtn->logbuf.buf, xtn->logbuf.len); - xtn->logbuf.len = 0; + n = write_all(fd, xtn->log.out.buf, xtn->log.out.len); + xtn->log.out.len = 0; if (n <= -1) return -1; } } @@ -708,7 +715,7 @@ static int write_log (moo_t* moo, int fd, const moo_bch_t* ptr, moo_oow_t len) { moo_oow_t rcapa; - rcapa = MOO_COUNTOF(xtn->logbuf.buf); + rcapa = MOO_COUNTOF(xtn->log.out.buf); if (len >= rcapa) { if (write_all(fd, ptr, rcapa) <= -1) return -1; @@ -717,8 +724,8 @@ static int write_log (moo_t* moo, int fd, const moo_bch_t* ptr, moo_oow_t len) } else { - MOO_MEMCPY (xtn->logbuf.buf, ptr, len); - xtn->logbuf.len += len; + MOO_MEMCPY (xtn->log.out.buf, ptr, len); + xtn->log.out.len += len; ptr += len; len -= len; @@ -732,10 +739,10 @@ static int write_log (moo_t* moo, int fd, const moo_bch_t* ptr, moo_oow_t len) static void flush_log (moo_t* moo, int fd) { xtn_t* xtn = GET_XTN(moo); - if (xtn->logbuf.len > 0) + if (xtn->log.out.len > 0) { - write_all (fd, xtn->logbuf.buf, xtn->logbuf.len); - xtn->logbuf.len = 0; + write_all (fd, xtn->log.out.buf, xtn->log.out.len); + xtn->log.out.len = 0; } } @@ -753,13 +760,13 @@ static void log_write (moo_t* moo, moo_bitmask_t mask, const moo_ooch_t* msg, mo } else { - if (!(xtn->logmask & mask & ~MOO_LOG_ALL_LEVELS)) return; /* check log types */ - if (!(xtn->logmask & mask & ~MOO_LOG_ALL_TYPES)) return; /* check log levels */ + if (!(xtn->log.mask & mask & ~MOO_LOG_ALL_LEVELS)) return; /* check log types */ + if (!(xtn->log.mask & mask & ~MOO_LOG_ALL_TYPES)) return; /* check log levels */ if (mask & MOO_LOG_STDOUT) logfd = 1; else { - logfd = xtn->logfd; + logfd = xtn->log.fd; if (logfd <= -1) return; } } @@ -816,7 +823,7 @@ static void log_write (moo_t* moo, moo_bitmask_t mask, const moo_ooch_t* msg, mo write_log (moo, logfd, ts, tslen); } - if (logfd == xtn->logfd && (xtn->logfd_flag & LOGFD_TTY)) + if (logfd == xtn->log.fd && (xtn->log.fd_flag & LOGFD_TTY)) { if (mask & MOO_LOG_FATAL) write_log (moo, logfd, "\x1B[1;31m", 7); else if (mask & MOO_LOG_ERROR) write_log (moo, logfd, "\x1B[1;32m", 7); @@ -861,7 +868,7 @@ static void log_write (moo_t* moo, moo_bitmask_t mask, const moo_ooch_t* msg, mo write_log (moo, logfd, msg, len); #endif - if (logfd == xtn->logfd && (xtn->logfd_flag & LOGFD_TTY)) + if (logfd == xtn->log.fd && (xtn->log.fd_flag & LOGFD_TTY)) { if (mask & (MOO_LOG_FATAL | MOO_LOG_ERROR | MOO_LOG_WARN)) write_log (moo, logfd, "\x1B[0m", 4); } @@ -1831,11 +1838,13 @@ static int vm_startup (moo_t* moo) goto oops; } + #if defined(FD_CLOEXEC) flag = fcntl(xtn->ep, F_GETFD); if (flag >= 0) fcntl (xtn->ep, F_SETFD, flag | FD_CLOEXEC); + #endif #elif defined(USE_EPOLL) - #if defined(EPOLL_CLOEXEC) + #if defined(HAVE_EPOLL_CREATE1) && defined(EPOLL_CLOEXEC) xtn->ep = epoll_create1(EPOLL_CLOEXEC); #else xtn->ep = epoll_create(1024); @@ -1847,12 +1856,14 @@ static int vm_startup (moo_t* moo) goto oops; } - #if defined(EPOLL_CLOEXEC) + #if defined(HAVE_EPOLL_CREATE1) && defined(EPOLL_CLOEXEC) /* do nothing */ #else + #if defined(FD_CLOEXEC) flag = fcntl(xtn->ep, F_GETFD); if (flag >= 0) fcntl (xtn->ep, F_SETFD, flag | FD_CLOEXEC); #endif + #endif #elif defined(USE_POLL) @@ -1866,39 +1877,44 @@ static int vm_startup (moo_t* moo) #endif /* USE_DEVPOLL */ #if defined(USE_THREAD) - if (pipe(xtn->p) == -1) + #if defined(HAVE_PIPE2) && defined(O_CLOEXEC) && defined(O_NONBLOCK) + if (pipe2(xtn->iothr.p, O_CLOEXEC | O_NONBLOCK) == -1) + #else + if (pipe(xtn->iothr.p) == -1) + #endif { - moo_seterrwithsyserr (moo, 0, errno); - MOO_DEBUG1 (moo, "Cannot create pipes - %hs\n", strerror(errno)); + moo_seterrbfmtwithsyserr (moo, 0, errno, "unable to create pipes for iothr management"); goto oops; } pcount = 2; - #if defined(O_CLOEXEC) - flag = fcntl (xtn->p[0], F_GETFD); - if (flag >= 0) fcntl (xtn->p[0], F_SETFD, flag | FD_CLOEXEC); - flag = fcntl (xtn->p[1], F_GETFD); - if (flag >= 0) fcntl (xtn->p[1], F_SETFD, flag | FD_CLOEXEC); + #if defined(HAVE_PIPE2) && defined(O_CLOEXEC) && defined(O_NONBLOCK) + /* do nothing */ + #else + #if defined(FD_CLOEXEC) + flag = fcntl(xtn->iothr.p[0], F_GETFD); + if (flag >= 0) fcntl (xtn->iothr.p[0], F_SETFD, flag | FD_CLOEXEC); + flag = fcntl(xtn->iothr.p[1], F_GETFD); + if (flag >= 0) fcntl (xtn->iothr.p[1], F_SETFD, flag | FD_CLOEXEC); #endif - #if defined(O_NONBLOCK) - flag = fcntl (xtn->p[0], F_GETFL); - if (flag >= 0) fcntl (xtn->p[0], F_SETFL, flag | O_NONBLOCK); - flag = fcntl (xtn->p[1], F_GETFL); - if (flag >= 0) fcntl (xtn->p[1], F_SETFL, flag | O_NONBLOCK); + flag = fcntl(xtn->iothr.p[0], F_GETFL); + if (flag >= 0) fcntl (xtn->iothr.p[0], F_SETFL, flag | O_NONBLOCK); + flag = fcntl(xtn->iothr.p[1], F_GETFL); + if (flag >= 0) fcntl (xtn->iothr.p[1], F_SETFL, flag | O_NONBLOCK); + #endif #endif - if (_add_poll_fd(moo, xtn->p[0], XPOLLIN) <= -1) goto oops; + if (_add_poll_fd(moo, xtn->iothr.p[0], XPOLLIN) <= -1) goto oops; pthread_mutex_init (&xtn->ev.mtx, MOO_NULL); pthread_cond_init (&xtn->ev.cnd, MOO_NULL); pthread_cond_init (&xtn->ev.cnd2, MOO_NULL); - xtn->iothr_abort = 0; - xtn->iothr_up = 0; + xtn->iothr.abort = 0; + xtn->iothr.up = 0; /*pthread_create (&xtn->iothr, MOO_NULL, iothr_main, moo);*/ - #endif /* USE_THREAD */ xtn->vm_running = 1; @@ -1909,8 +1925,8 @@ oops: #if defined(USE_THREAD) if (pcount > 0) { - close (xtn->p[0]); - close (xtn->p[1]); + close (xtn->iothr.p[0]); + close (xtn->iothr.p[1]); } #endif @@ -1940,21 +1956,21 @@ static void vm_cleanup (moo_t* moo) #endif #if defined(USE_THREAD) - if (xtn->iothr_up) + if (xtn->iothr.up) { - xtn->iothr_abort = 1; - write (xtn->p[1], "Q", 1); + xtn->iothr.abort = 1; + write (xtn->iothr.p[1], "Q", 1); pthread_cond_signal (&xtn->ev.cnd); - pthread_join (xtn->iothr, MOO_NULL); - xtn->iothr_up = 0; + pthread_join (xtn->iothr.thr, MOO_NULL); + xtn->iothr.up = 0; } pthread_cond_destroy (&xtn->ev.cnd); pthread_cond_destroy (&xtn->ev.cnd2); pthread_mutex_destroy (&xtn->ev.mtx); - _del_poll_fd (moo, xtn->p[0]); - close (xtn->p[1]); - close (xtn->p[0]); + _del_poll_fd (moo, xtn->iothr.p[0]); + close (xtn->iothr.p[1]); + close (xtn->iothr.p[0]); #endif /* USE_THREAD */ #if defined(USE_DEVPOLL) @@ -2128,7 +2144,7 @@ static void* iothr_main (void* arg) xtn_t* xtn = GET_XTN(moo); /*while (!moo->abort_req)*/ - while (!xtn->iothr_abort) + while (!xtn->iothr.abort) { if (xtn->ev.len <= 0) /* TODO: no mutex needed for this check? */ { @@ -2262,18 +2278,18 @@ static void vm_muxwait (moo_t* moo, const moo_ntime_t* dur, moo_vmprim_muxwait_c int n; /* create a thread if mux wait is started at least once. */ - if (!xtn->iothr_up) + if (!xtn->iothr.up) { - xtn->iothr_up = 1; - if (pthread_create (&xtn->iothr, MOO_NULL, iothr_main, moo) != 0) + xtn->iothr.up = 1; + if (pthread_create (&xtn->iothr.thr, MOO_NULL, iothr_main, moo) != 0) { MOO_LOG2 (moo, MOO_LOG_WARN, "Warning: pthread_create failure - %d, %hs\n", errno, strerror(errno)); - xtn->iothr_up = 0; + xtn->iothr.up = 0; /* TODO: switch to the non-threaded mode? */ } } - if (xtn->iothr_abort) return; + if (xtn->iothr.abort) return; if (xtn->ev.len <= 0) { @@ -2316,23 +2332,23 @@ static void vm_muxwait (moo_t* moo, const moo_ntime_t* dur, moo_vmprim_muxwait_c --n; #if defined(USE_DEVPOLL) - if (xtn->ev.buf[n].fd == xtn->p[0]) + if (xtn->ev.buf[n].fd == xtn->iothr.p[0]) #elif defined(USE_EPOLL) /*if (xtn->ev.buf[n].data.ptr == (void*)MOO_TYPE_MAX(moo_oow_t))*/ - if (xtn->ev.buf[n].data.fd == xtn->p[0]) + if (xtn->ev.buf[n].data.fd == xtn->iothr.p[0]) #elif defined(USE_POLL) - if (xtn->ev.buf[n].fd == xtn->p[0]) + if (xtn->ev.buf[n].fd == xtn->iothr.p[0]) #elif defined(USE_SELECT) - if (xtn->ev.buf[n].fd == xtn->p[0]) + if (xtn->ev.buf[n].fd == xtn->iothr.p[0]) #else # error UNSUPPORTED #endif { moo_uint8_t u8; - while (read(xtn->p[0], &u8, MOO_SIZEOF(u8)) > 0) + while (read(xtn->iothr.p[0], &u8, MOO_SIZEOF(u8)) > 0) { /* consume as much as possible */; - if (u8 == 'Q') xtn->iothr_abort = 1; + if (u8 == 'Q') xtn->iothr.abort = 1; } } else if (muxwcb) @@ -2721,7 +2737,7 @@ static void setup_tick (void) #elif defined(macintosh) GetCurrentProcess (&g_psn); - memset (&g_tmtask, 0, MOO_SIZEOF(g_tmtask)); + MOO_MEMSET (&g_tmtask, 0, MOO_SIZEOF(g_tmtask)); g_tmtask.tmAddr = NewTimerProc (timer_intr_handler); InsXTime ((QElem*)&g_tmtask); PrimeTime ((QElem*)&g_tmtask, TMTASK_DELAY); @@ -2730,7 +2746,7 @@ static void setup_tick (void) struct itimerval itv; struct sigaction act; - memset (&act, 0, sizeof(act)); + MOO_MEMSET (&act, 0, sizeof(act)); sigemptyset (&act.sa_mask); act.sa_handler = arrange_process_switching; act.sa_flags = SA_RESTART; @@ -2845,7 +2861,7 @@ static int handle_logopt (moo_t* moo, const moo_bch_t* str) cm = moo_find_bchar_in_bcstr(xstr, ','); *cm = '\0'; - logmask = xtn->logmask; + logmask = xtn->log.mask; do { flt = cm + 1; @@ -2880,18 +2896,18 @@ static int handle_logopt (moo_t* moo, const moo_bch_t* str) logmask = MOO_LOG_ALL_LEVELS | MOO_LOG_ALL_TYPES; } - xtn->logfd = open(xstr, O_CREAT | O_WRONLY | O_APPEND , 0644); - if (xtn->logfd == -1) + xtn->log.fd = open(xstr, O_CREAT | O_WRONLY | O_APPEND , 0644); + if (xtn->log.fd == -1) { moo_seterrbfmt (moo, MOO_ESYSERR, "cannot open log file %hs", xstr); /* TODO: use syserrb/u??? */ if (str != xstr) moo_freemem (moo, xstr); return -1; } - xtn->logmask = logmask; - xtn->logfd_flag |= LOGFD_OPENED_HERE; + xtn->log.mask = logmask; + xtn->log.fd_flag |= LOGFD_OPENED_HERE; #if defined(HAVE_ISATTY) - if (isatty(xtn->logfd)) xtn->logfd_flag |= LOGFD_TTY; + if (isatty(xtn->log.fd)) xtn->log.fd_flag |= LOGFD_TTY; #endif if (str != xstr) moo_freemem (moo, xstr); @@ -2934,16 +2950,16 @@ static int handle_dbgopt (moo_t* moo, const moo_bch_t* str) static MOO_INLINE void reset_log_to_default (xtn_t* xtn) { #if defined(ENABLE_LOG_INITIALLY) - xtn->logfd = 2; - xtn->logfd_flag = 0; + xtn->log.fd = 2; + xtn->log.fd_flag = 0; #if defined(HAVE_ISATTY) - if (isatty(xtn->logfd)) xtn->logfd_flag |= LOGFD_TTY; + if (isatty(xtn->log.fd)) xtn->log.fd_flag |= LOGFD_TTY; #endif - xtn->logmask = MOO_LOG_ALL_LEVELS | MOO_LOG_ALL_TYPES; + xtn->log.mask = MOO_LOG_ALL_LEVELS | MOO_LOG_ALL_TYPES; #else - xtn->logfd = -1; - xtn->logfd_flag = 0; - xtn->logmask = 0; + xtn->log.fd = -1; + xtn->log.fd_flag = 0; + xtn->log.mask = 0; #endif } @@ -2974,8 +2990,8 @@ static MOO_INLINE void unchain (moo_t* moo) static void fini_moo (moo_t* moo) { xtn_t* xtn = GET_XTN(moo); - if ((xtn->logfd_flag & LOGFD_OPENED_HERE) && xtn->logfd >= 0) close (xtn->logfd); - reset_log_to_default (moo); + if ((xtn->log.fd_flag & LOGFD_OPENED_HERE) && xtn->log.fd >= 0) close (xtn->log.fd); + reset_log_to_default (xtn); unchain (moo); }