unfinished refactoring
This commit is contained in:
		
							
								
								
									
										12
									
								
								mio/configure
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								mio/configure
									
									
									
									
										vendored
									
									
								
							@ -17969,6 +17969,18 @@ _ACEOF
 | 
			
		||||
fi
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
for ac_func in isatty mmap munmap
 | 
			
		||||
do :
 | 
			
		||||
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 | 
			
		||||
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
 | 
			
		||||
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
 | 
			
		||||
  cat >>confdefs.h <<_ACEOF
 | 
			
		||||
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
 | 
			
		||||
_ACEOF
 | 
			
		||||
 | 
			
		||||
fi
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
OLDLIBS="$LIBS"
 | 
			
		||||
LIBS="$LIBM $LIBS"
 | 
			
		||||
 | 
			
		||||
@ -161,6 +161,7 @@ AC_CHECK_FUNCS([fork vfork posix_spawn gettid nanosleep select])
 | 
			
		||||
AC_CHECK_FUNCS([makecontext swapcontext getcontext setcontext])
 | 
			
		||||
AC_CHECK_FUNCS([snprintf _vsnprintf _vsnwprintf])
 | 
			
		||||
AC_CHECK_FUNCS([accept4 sendmsg recvmsg writev readv])
 | 
			
		||||
AC_CHECK_FUNCS([isatty mmap munmap])
 | 
			
		||||
 | 
			
		||||
OLDLIBS="$LIBS"
 | 
			
		||||
LIBS="$LIBM $LIBS"
 | 
			
		||||
 | 
			
		||||
@ -1,2 +0,0 @@
 | 
			
		||||
all:
 | 
			
		||||
	cc -g -I. -Wall -o mio main.c mio.c mio-tcp.c mio-udp.c mio-sck.c
 | 
			
		||||
@ -30,19 +30,20 @@ include_HEADERS = \
 | 
			
		||||
lib_LTLIBRARIES = libmio.la
 | 
			
		||||
libmio_la_SOURCES = \
 | 
			
		||||
	err.c \
 | 
			
		||||
	logfmt.c \
 | 
			
		||||
	logfmtv.h \
 | 
			
		||||
	fmtout.c \
 | 
			
		||||
	fmtoutv.h \
 | 
			
		||||
	mio-prv.h \
 | 
			
		||||
	mio.c \
 | 
			
		||||
	mio-pro.c \
 | 
			
		||||
	mio-sck.c \
 | 
			
		||||
	mio-tim.c \
 | 
			
		||||
	mio-tmr.c \
 | 
			
		||||
	sck-addr.c \
 | 
			
		||||
	sck-addr.h \
 | 
			
		||||
	sys-ass.c \
 | 
			
		||||
	sys-err.c \
 | 
			
		||||
	sys-log.c \
 | 
			
		||||
	sys-mux.c \
 | 
			
		||||
	sys-tim.c \
 | 
			
		||||
	tmr.c \
 | 
			
		||||
	utf8.c \
 | 
			
		||||
	utl.c
 | 
			
		||||
libmio_la_CPPFLAGS = $(CPPFLAGS_LIB_COMMON)
 | 
			
		||||
 | 
			
		||||
@ -140,11 +140,11 @@ LTLIBRARIES = $(lib_LTLIBRARIES)
 | 
			
		||||
am__DEPENDENCIES_1 =
 | 
			
		||||
am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
 | 
			
		||||
libmio_la_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
 | 
			
		||||
am_libmio_la_OBJECTS = libmio_la-err.lo libmio_la-logfmt.lo \
 | 
			
		||||
am_libmio_la_OBJECTS = libmio_la-err.lo libmio_la-fmtout.lo \
 | 
			
		||||
	libmio_la-mio.lo libmio_la-mio-pro.lo libmio_la-mio-sck.lo \
 | 
			
		||||
	libmio_la-mio-tim.lo libmio_la-mio-tmr.lo \
 | 
			
		||||
	libmio_la-sck-addr.lo libmio_la-sys-ass.lo \
 | 
			
		||||
	libmio_la-sys-err.lo libmio_la-sys-log.lo libmio_la-utf8.lo \
 | 
			
		||||
	libmio_la-sys-err.lo libmio_la-sys-log.lo libmio_la-sys-mux.lo \
 | 
			
		||||
	libmio_la-sys-tim.lo libmio_la-tmr.lo libmio_la-utf8.lo \
 | 
			
		||||
	libmio_la-utl.lo
 | 
			
		||||
libmio_la_OBJECTS = $(am_libmio_la_OBJECTS)
 | 
			
		||||
AM_V_lt = $(am__v_lt_@AM_V@)
 | 
			
		||||
@ -403,19 +403,20 @@ include_HEADERS = \
 | 
			
		||||
lib_LTLIBRARIES = libmio.la
 | 
			
		||||
libmio_la_SOURCES = \
 | 
			
		||||
	err.c \
 | 
			
		||||
	logfmt.c \
 | 
			
		||||
	logfmtv.h \
 | 
			
		||||
	fmtout.c \
 | 
			
		||||
	fmtoutv.h \
 | 
			
		||||
	mio-prv.h \
 | 
			
		||||
	mio.c \
 | 
			
		||||
	mio-pro.c \
 | 
			
		||||
	mio-sck.c \
 | 
			
		||||
	mio-tim.c \
 | 
			
		||||
	mio-tmr.c \
 | 
			
		||||
	sck-addr.c \
 | 
			
		||||
	sck-addr.h \
 | 
			
		||||
	sys-ass.c \
 | 
			
		||||
	sys-err.c \
 | 
			
		||||
	sys-log.c \
 | 
			
		||||
	sys-mux.c \
 | 
			
		||||
	sys-tim.c \
 | 
			
		||||
	tmr.c \
 | 
			
		||||
	utf8.c \
 | 
			
		||||
	utl.c
 | 
			
		||||
 | 
			
		||||
@ -574,16 +575,17 @@ distclean-compile:
 | 
			
		||||
	-rm -f *.tab.c
 | 
			
		||||
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-err.Plo@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-logfmt.Plo@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-fmtout.Plo@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-mio-pro.Plo@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-mio-sck.Plo@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-mio-tim.Plo@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-mio-tmr.Plo@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-mio.Plo@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-sck-addr.Plo@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-sys-ass.Plo@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-sys-err.Plo@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-sys-log.Plo@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-sys-mux.Plo@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-sys-tim.Plo@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-tmr.Plo@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-utf8.Plo@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmio_la-utl.Plo@am__quote@
 | 
			
		||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mio-main.Po@am__quote@
 | 
			
		||||
@ -619,12 +621,12 @@ libmio_la-err.lo: err.c
 | 
			
		||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 | 
			
		||||
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libmio_la-err.lo `test -f 'err.c' || echo '$(srcdir)/'`err.c
 | 
			
		||||
 | 
			
		||||
libmio_la-logfmt.lo: logfmt.c
 | 
			
		||||
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libmio_la-logfmt.lo -MD -MP -MF $(DEPDIR)/libmio_la-logfmt.Tpo -c -o libmio_la-logfmt.lo `test -f 'logfmt.c' || echo '$(srcdir)/'`logfmt.c
 | 
			
		||||
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libmio_la-logfmt.Tpo $(DEPDIR)/libmio_la-logfmt.Plo
 | 
			
		||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='logfmt.c' object='libmio_la-logfmt.lo' libtool=yes @AMDEPBACKSLASH@
 | 
			
		||||
libmio_la-fmtout.lo: fmtout.c
 | 
			
		||||
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libmio_la-fmtout.lo -MD -MP -MF $(DEPDIR)/libmio_la-fmtout.Tpo -c -o libmio_la-fmtout.lo `test -f 'fmtout.c' || echo '$(srcdir)/'`fmtout.c
 | 
			
		||||
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libmio_la-fmtout.Tpo $(DEPDIR)/libmio_la-fmtout.Plo
 | 
			
		||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='fmtout.c' object='libmio_la-fmtout.lo' libtool=yes @AMDEPBACKSLASH@
 | 
			
		||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 | 
			
		||||
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libmio_la-logfmt.lo `test -f 'logfmt.c' || echo '$(srcdir)/'`logfmt.c
 | 
			
		||||
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libmio_la-fmtout.lo `test -f 'fmtout.c' || echo '$(srcdir)/'`fmtout.c
 | 
			
		||||
 | 
			
		||||
libmio_la-mio.lo: mio.c
 | 
			
		||||
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libmio_la-mio.lo -MD -MP -MF $(DEPDIR)/libmio_la-mio.Tpo -c -o libmio_la-mio.lo `test -f 'mio.c' || echo '$(srcdir)/'`mio.c
 | 
			
		||||
@ -647,20 +649,6 @@ libmio_la-mio-sck.lo: mio-sck.c
 | 
			
		||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 | 
			
		||||
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libmio_la-mio-sck.lo `test -f 'mio-sck.c' || echo '$(srcdir)/'`mio-sck.c
 | 
			
		||||
 | 
			
		||||
libmio_la-mio-tim.lo: mio-tim.c
 | 
			
		||||
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libmio_la-mio-tim.lo -MD -MP -MF $(DEPDIR)/libmio_la-mio-tim.Tpo -c -o libmio_la-mio-tim.lo `test -f 'mio-tim.c' || echo '$(srcdir)/'`mio-tim.c
 | 
			
		||||
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libmio_la-mio-tim.Tpo $(DEPDIR)/libmio_la-mio-tim.Plo
 | 
			
		||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='mio-tim.c' object='libmio_la-mio-tim.lo' libtool=yes @AMDEPBACKSLASH@
 | 
			
		||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 | 
			
		||||
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libmio_la-mio-tim.lo `test -f 'mio-tim.c' || echo '$(srcdir)/'`mio-tim.c
 | 
			
		||||
 | 
			
		||||
libmio_la-mio-tmr.lo: mio-tmr.c
 | 
			
		||||
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libmio_la-mio-tmr.lo -MD -MP -MF $(DEPDIR)/libmio_la-mio-tmr.Tpo -c -o libmio_la-mio-tmr.lo `test -f 'mio-tmr.c' || echo '$(srcdir)/'`mio-tmr.c
 | 
			
		||||
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libmio_la-mio-tmr.Tpo $(DEPDIR)/libmio_la-mio-tmr.Plo
 | 
			
		||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='mio-tmr.c' object='libmio_la-mio-tmr.lo' libtool=yes @AMDEPBACKSLASH@
 | 
			
		||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 | 
			
		||||
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libmio_la-mio-tmr.lo `test -f 'mio-tmr.c' || echo '$(srcdir)/'`mio-tmr.c
 | 
			
		||||
 | 
			
		||||
libmio_la-sck-addr.lo: sck-addr.c
 | 
			
		||||
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libmio_la-sck-addr.lo -MD -MP -MF $(DEPDIR)/libmio_la-sck-addr.Tpo -c -o libmio_la-sck-addr.lo `test -f 'sck-addr.c' || echo '$(srcdir)/'`sck-addr.c
 | 
			
		||||
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libmio_la-sck-addr.Tpo $(DEPDIR)/libmio_la-sck-addr.Plo
 | 
			
		||||
@ -689,6 +677,27 @@ libmio_la-sys-log.lo: sys-log.c
 | 
			
		||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 | 
			
		||||
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libmio_la-sys-log.lo `test -f 'sys-log.c' || echo '$(srcdir)/'`sys-log.c
 | 
			
		||||
 | 
			
		||||
libmio_la-sys-mux.lo: sys-mux.c
 | 
			
		||||
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libmio_la-sys-mux.lo -MD -MP -MF $(DEPDIR)/libmio_la-sys-mux.Tpo -c -o libmio_la-sys-mux.lo `test -f 'sys-mux.c' || echo '$(srcdir)/'`sys-mux.c
 | 
			
		||||
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libmio_la-sys-mux.Tpo $(DEPDIR)/libmio_la-sys-mux.Plo
 | 
			
		||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='sys-mux.c' object='libmio_la-sys-mux.lo' libtool=yes @AMDEPBACKSLASH@
 | 
			
		||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 | 
			
		||||
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libmio_la-sys-mux.lo `test -f 'sys-mux.c' || echo '$(srcdir)/'`sys-mux.c
 | 
			
		||||
 | 
			
		||||
libmio_la-sys-tim.lo: sys-tim.c
 | 
			
		||||
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libmio_la-sys-tim.lo -MD -MP -MF $(DEPDIR)/libmio_la-sys-tim.Tpo -c -o libmio_la-sys-tim.lo `test -f 'sys-tim.c' || echo '$(srcdir)/'`sys-tim.c
 | 
			
		||||
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libmio_la-sys-tim.Tpo $(DEPDIR)/libmio_la-sys-tim.Plo
 | 
			
		||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='sys-tim.c' object='libmio_la-sys-tim.lo' libtool=yes @AMDEPBACKSLASH@
 | 
			
		||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 | 
			
		||||
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libmio_la-sys-tim.lo `test -f 'sys-tim.c' || echo '$(srcdir)/'`sys-tim.c
 | 
			
		||||
 | 
			
		||||
libmio_la-tmr.lo: tmr.c
 | 
			
		||||
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libmio_la-tmr.lo -MD -MP -MF $(DEPDIR)/libmio_la-tmr.Tpo -c -o libmio_la-tmr.lo `test -f 'tmr.c' || echo '$(srcdir)/'`tmr.c
 | 
			
		||||
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libmio_la-tmr.Tpo $(DEPDIR)/libmio_la-tmr.Plo
 | 
			
		||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='tmr.c' object='libmio_la-tmr.lo' libtool=yes @AMDEPBACKSLASH@
 | 
			
		||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 | 
			
		||||
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libmio_la-tmr.lo `test -f 'tmr.c' || echo '$(srcdir)/'`tmr.c
 | 
			
		||||
 | 
			
		||||
libmio_la-utf8.lo: utf8.c
 | 
			
		||||
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libmio_la-utf8.lo -MD -MP -MF $(DEPDIR)/libmio_la-utf8.Tpo -c -o libmio_la-utf8.lo `test -f 'utf8.c' || echo '$(srcdir)/'`utf8.c
 | 
			
		||||
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libmio_la-utf8.Tpo $(DEPDIR)/libmio_la-utf8.Plo
 | 
			
		||||
 | 
			
		||||
@ -26,6 +26,7 @@
 | 
			
		||||
 | 
			
		||||
#include "mio-prv.h"
 | 
			
		||||
 | 
			
		||||
/* TODO: this table is wrong. the messages are wrong as of now. fix these... */
 | 
			
		||||
static mio_ooch_t errstr_0[] = {'n','o',' ','e','r','r','o','r','\0'};
 | 
			
		||||
static mio_ooch_t errstr_1[] = {'g','e','n','e','r','i','c',' ','e','r','r','o','r','\0'};
 | 
			
		||||
static mio_ooch_t errstr_2[] = {'n','o','t',' ','i','m','p','l','e','m','e','n','t','e','d','\0'};
 | 
			
		||||
 | 
			
		||||
@ -142,8 +142,8 @@ typedef int (*mio_fmtout_putcs_t) (
 | 
			
		||||
	mio_oow_t         len
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
typedef struct mio_fmtout_t mio_fmtout_t;
 | 
			
		||||
struct mio_fmtout_t
 | 
			
		||||
typedef struct mio_fmtout_data_t mio_fmtout_data_t;
 | 
			
		||||
struct mio_fmtout_data_t
 | 
			
		||||
{
 | 
			
		||||
	mio_oow_t            count; /* out */
 | 
			
		||||
	mio_bitmask_t        mask;  /* in */
 | 
			
		||||
@ -381,44 +381,44 @@ redo:
 | 
			
		||||
#undef FMTCHAR_IS_UCH
 | 
			
		||||
#undef FMTCHAR_IS_OOCH
 | 
			
		||||
#undef fmtchar_t
 | 
			
		||||
#undef logfmtv
 | 
			
		||||
#undef fmtoutv
 | 
			
		||||
#define fmtchar_t mio_bch_t
 | 
			
		||||
#define logfmtv __logbfmtv
 | 
			
		||||
#define fmtoutv __logbfmtv
 | 
			
		||||
#define FMTCHAR_IS_BCH
 | 
			
		||||
#if defined(MIO_OOCH_IS_BCH)
 | 
			
		||||
#	define FMTCHAR_IS_OOCH
 | 
			
		||||
#endif
 | 
			
		||||
#include "logfmtv.h"
 | 
			
		||||
#include "fmtoutv.h"
 | 
			
		||||
 | 
			
		||||
#undef FMTCHAR_IS_BCH
 | 
			
		||||
#undef FMTCHAR_IS_UCH
 | 
			
		||||
#undef FMTCHAR_IS_OOCH
 | 
			
		||||
#undef fmtchar_t
 | 
			
		||||
#undef logfmtv
 | 
			
		||||
#undef fmtoutv
 | 
			
		||||
#define fmtchar_t mio_uch_t
 | 
			
		||||
#define logfmtv __logufmtv
 | 
			
		||||
#define fmtoutv __logufmtv
 | 
			
		||||
#define FMTCHAR_IS_UCH
 | 
			
		||||
#if defined(MIO_OOCH_IS_UCH)
 | 
			
		||||
#	define FMTCHAR_IS_OOCH
 | 
			
		||||
#endif
 | 
			
		||||
#include "logfmtv.h" 
 | 
			
		||||
#include "fmtoutv.h" 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int _logbfmtv (mio_t* mio, const mio_bch_t* fmt, mio_fmtout_t* data, va_list ap)
 | 
			
		||||
static int _logbfmtv (mio_t* mio, const mio_bch_t* fmt, mio_fmtout_data_t* data, va_list ap)
 | 
			
		||||
{
 | 
			
		||||
	return __logbfmtv (mio, fmt, data, ap, mio_logbfmt);
 | 
			
		||||
	return __logbfmtv(mio, fmt, data, ap);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int _logufmtv (mio_t* mio, const mio_uch_t* fmt, mio_fmtout_t* data, va_list ap)
 | 
			
		||||
static int _logufmtv (mio_t* mio, const mio_uch_t* fmt, mio_fmtout_data_t* data, va_list ap)
 | 
			
		||||
{
 | 
			
		||||
	return __logufmtv (mio, fmt, data, ap, mio_logbfmt);
 | 
			
		||||
	return __logufmtv(mio, fmt, data, ap);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mio_ooi_t mio_logbfmt (mio_t* mio, mio_bitmask_t mask, const mio_bch_t* fmt, ...)
 | 
			
		||||
{
 | 
			
		||||
	int x;
 | 
			
		||||
	va_list ap;
 | 
			
		||||
	mio_fmtout_t fo;
 | 
			
		||||
	mio_fmtout_data_t fo;
 | 
			
		||||
 | 
			
		||||
	if (mio->log.default_type_mask & MIO_LOG_ALL_TYPES) 
 | 
			
		||||
	{
 | 
			
		||||
@ -451,7 +451,7 @@ mio_ooi_t mio_logufmt (mio_t* mio, mio_bitmask_t mask, const mio_uch_t* fmt, ...
 | 
			
		||||
{
 | 
			
		||||
	int x;
 | 
			
		||||
	va_list ap;
 | 
			
		||||
	mio_fmtout_t fo;
 | 
			
		||||
	mio_fmtout_data_t fo;
 | 
			
		||||
 | 
			
		||||
	if (mio->log.default_type_mask & MIO_LOG_ALL_TYPES) 
 | 
			
		||||
	{
 | 
			
		||||
@ -519,36 +519,20 @@ static int put_errcs (mio_t* mio, mio_bitmask_t mask, const mio_ooch_t* ptr, mio
 | 
			
		||||
 | 
			
		||||
static mio_ooi_t __errbfmtv (mio_t* mio, mio_bitmask_t mask, const mio_bch_t* fmt, ...);
 | 
			
		||||
 | 
			
		||||
static int _errbfmtv (mio_t* mio, const mio_bch_t* fmt, mio_fmtout_t* data, va_list ap)
 | 
			
		||||
static int _errbfmtv (mio_t* mio, const mio_bch_t* fmt, mio_fmtout_data_t* data, va_list ap)
 | 
			
		||||
{
 | 
			
		||||
	return __logbfmtv (mio, fmt, data, ap, __errbfmtv);
 | 
			
		||||
	return __logbfmtv (mio, fmt, data, ap);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int _errufmtv (mio_t* mio, const mio_uch_t* fmt, mio_fmtout_t* data, va_list ap)
 | 
			
		||||
static int _errufmtv (mio_t* mio, const mio_uch_t* fmt, mio_fmtout_data_t* data, va_list ap)
 | 
			
		||||
{
 | 
			
		||||
	return __logufmtv (mio, fmt, data, ap, __errbfmtv);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static mio_ooi_t __errbfmtv (mio_t* mio, mio_bitmask_t mask, const mio_bch_t* fmt, ...)
 | 
			
		||||
{
 | 
			
		||||
	va_list ap;
 | 
			
		||||
	mio_fmtout_t fo;
 | 
			
		||||
 | 
			
		||||
	fo.mask = 0; /* not used */
 | 
			
		||||
	fo.putch = put_errch;
 | 
			
		||||
	fo.putcs = put_errcs;
 | 
			
		||||
 | 
			
		||||
	va_start (ap, fmt);
 | 
			
		||||
	_errbfmtv (mio, fmt, &fo, ap);
 | 
			
		||||
	va_end (ap);
 | 
			
		||||
 | 
			
		||||
	return fo.count;
 | 
			
		||||
	return __logufmtv (mio, fmt, data, ap);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void mio_seterrbfmt (mio_t* mio, mio_errnum_t errnum, const mio_bch_t* fmt, ...)
 | 
			
		||||
{
 | 
			
		||||
	va_list ap;
 | 
			
		||||
	mio_fmtout_t fo;
 | 
			
		||||
	mio_fmtout_data_t fo;
 | 
			
		||||
 | 
			
		||||
	if (mio->shuterr) return;
 | 
			
		||||
	mio->errmsg.len = 0;
 | 
			
		||||
@ -567,7 +551,7 @@ void mio_seterrbfmt (mio_t* mio, mio_errnum_t errnum, const mio_bch_t* fmt, ...)
 | 
			
		||||
void mio_seterrufmt (mio_t* mio, mio_errnum_t errnum, const mio_uch_t* fmt, ...)
 | 
			
		||||
{
 | 
			
		||||
	va_list ap;
 | 
			
		||||
	mio_fmtout_t fo;
 | 
			
		||||
	mio_fmtout_data_t fo;
 | 
			
		||||
 | 
			
		||||
	if (mio->shuterr) return;
 | 
			
		||||
	mio->errmsg.len = 0;
 | 
			
		||||
@ -586,7 +570,7 @@ void mio_seterrufmt (mio_t* mio, mio_errnum_t errnum, const mio_uch_t* fmt, ...)
 | 
			
		||||
 | 
			
		||||
void mio_seterrbfmtv (mio_t* mio, mio_errnum_t errnum, const mio_bch_t* fmt, va_list ap)
 | 
			
		||||
{
 | 
			
		||||
	mio_fmtout_t fo;
 | 
			
		||||
	mio_fmtout_data_t fo;
 | 
			
		||||
 | 
			
		||||
	if (mio->shuterr) return;
 | 
			
		||||
 | 
			
		||||
@ -602,7 +586,7 @@ void mio_seterrbfmtv (mio_t* mio, mio_errnum_t errnum, const mio_bch_t* fmt, va_
 | 
			
		||||
 | 
			
		||||
void mio_seterrufmtv (mio_t* mio, mio_errnum_t errnum, const mio_uch_t* fmt, va_list ap)
 | 
			
		||||
{
 | 
			
		||||
	mio_fmtout_t fo;
 | 
			
		||||
	mio_fmtout_data_t fo;
 | 
			
		||||
 | 
			
		||||
	if (mio->shuterr) return;
 | 
			
		||||
 | 
			
		||||
@ -669,38 +653,22 @@ static int put_sprch (mio_t* mio, mio_bitmask_t mask, mio_ooch_t ch, mio_oow_t l
 | 
			
		||||
 | 
			
		||||
static mio_ooi_t __sprbfmtv (mio_t* mio, mio_bitmask_t mask, const mio_bch_t* fmt, ...);
 | 
			
		||||
 | 
			
		||||
static int _sprbfmtv (mio_t* mio, const mio_bch_t* fmt, mio_fmtout_t* data, va_list ap)
 | 
			
		||||
static int _sprbfmtv (mio_t* mio, const mio_bch_t* fmt, mio_fmtout_data_t* data, va_list ap)
 | 
			
		||||
{
 | 
			
		||||
	return __logbfmtv (mio, fmt, data, ap, __sprbfmtv);
 | 
			
		||||
	return __logbfmtv (mio, fmt, data, ap);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
static int _sprufmtv (mio_t* mio, const mio_uch_t* fmt, mio_fmtout_t* data, va_list ap)
 | 
			
		||||
static int _sprufmtv (mio_t* mio, const mio_uch_t* fmt, mio_fmtout_data_t* data, va_list ap)
 | 
			
		||||
{
 | 
			
		||||
	return __logufmtv (mio, fmt, data, ap, __sprbfmtv);
 | 
			
		||||
}*/
 | 
			
		||||
 | 
			
		||||
static mio_ooi_t __sprbfmtv (mio_t* mio, mio_bitmask_t mask, const mio_bch_t* fmt, ...)
 | 
			
		||||
{
 | 
			
		||||
	va_list ap;
 | 
			
		||||
	mio_fmtout_t fo;
 | 
			
		||||
 | 
			
		||||
	fo.mask = mask; /* not used */
 | 
			
		||||
	fo.putch = put_sprch;
 | 
			
		||||
	fo.putcs = put_sprcs;
 | 
			
		||||
 | 
			
		||||
	va_start (ap, fmt);
 | 
			
		||||
	_sprbfmtv (mio, fmt, &fo, ap);
 | 
			
		||||
	va_end (ap);
 | 
			
		||||
 | 
			
		||||
	return fo.count;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mio_ooi_t mio_sproutbfmt (mio_t* mio, mio_bitmask_t mask, const mio_bch_t* fmt, ...)
 | 
			
		||||
{
 | 
			
		||||
	int x;
 | 
			
		||||
	va_list ap;
 | 
			
		||||
	mio_fmtout_t fo;
 | 
			
		||||
	mio_fmtout_data_t fo;
 | 
			
		||||
 | 
			
		||||
	fo.mask = mask;
 | 
			
		||||
	fo.putch = put_sprch;
 | 
			
		||||
@ -718,7 +686,7 @@ mio_ooi_t mio_sproutufmt (mio_t* mio, mio_bitmask_t mask, const mio_uch_t* fmt,
 | 
			
		||||
{
 | 
			
		||||
	int x;
 | 
			
		||||
	va_list ap;
 | 
			
		||||
	mio_fmtout_t fo;
 | 
			
		||||
	mio_fmtout_data_t fo;
 | 
			
		||||
 | 
			
		||||
	fo.mask = mask;
 | 
			
		||||
	fo.putch = put_sprch;
 | 
			
		||||
@ -74,7 +74,7 @@
 | 
			
		||||
#define PUT_OOCH(c,n) do { \
 | 
			
		||||
	if (n > 0) { \
 | 
			
		||||
		int xx; \
 | 
			
		||||
		if ((xx = data->putch (mio, data->mask, c, n)) <= -1) goto oops; \
 | 
			
		||||
		if ((xx = data->putch(mio, data->mask, c, n)) <= -1) goto oops; \
 | 
			
		||||
		if (xx == 0) goto done; \
 | 
			
		||||
		data->count += n; \
 | 
			
		||||
	} \
 | 
			
		||||
@ -83,13 +83,13 @@
 | 
			
		||||
#define PUT_OOCS(ptr,len) do { \
 | 
			
		||||
	if (len > 0) { \
 | 
			
		||||
		int xx; \
 | 
			
		||||
		if ((xx = data->putcs (mio, data->mask, ptr, len)) <= -1) goto oops; \
 | 
			
		||||
		if ((xx = data->putcs(mio, data->mask, ptr, len)) <= -1) goto oops; \
 | 
			
		||||
		if (xx == 0) goto done; \
 | 
			
		||||
		data->count += len; \
 | 
			
		||||
	} \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
static int logfmtv (mio_t* mio, const fmtchar_t* fmt, mio_fmtout_t* data, va_list ap, outbfmt_t outbfmt)
 | 
			
		||||
static int fmtoutv (mio_t* mio, const fmtchar_t* fmt, mio_fmtout_data_t* data, va_list ap)
 | 
			
		||||
{
 | 
			
		||||
	const fmtchar_t* percent;
 | 
			
		||||
	const fmtchar_t* checkpoint;
 | 
			
		||||
@ -584,10 +584,6 @@ static int logfmtv (mio_t* mio, const fmtchar_t* fmt, mio_fmtout_t* data, va_lis
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		case 'O': /* object - ignore precision, width, adjustment */
 | 
			
		||||
			if (print_object(mio, data->mask, va_arg(ap, mio_oop_t), outbfmt) <= -1) goto oops;
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
		case 'e':
 | 
			
		||||
		case 'E':
 | 
			
		||||
@ -206,7 +206,7 @@ else
 | 
			
		||||
//	if (ts->tally >= 2) mio_dev_sck_halt (tcp);
 | 
			
		||||
 | 
			
		||||
printf ("TCP_SCK_ON_WRITE ENABLING READING..............................\n");
 | 
			
		||||
	mio_inittime (&tmout, 5, 0);
 | 
			
		||||
	MIO_INIT_NTIME (&tmout, 5, 0);
 | 
			
		||||
	//mio_dev_sck_read (tcp, 1);
 | 
			
		||||
	mio_dev_sck_timedread (tcp, 1, &tmout);
 | 
			
		||||
}
 | 
			
		||||
@ -243,7 +243,7 @@ memset (xxx, a++ ,1000000);
 | 
			
		||||
 | 
			
		||||
printf ("TCP_SCK_ON_READ initiating write... of %d\n", 1000000);
 | 
			
		||||
	//return mio_dev_sck_write  (tcp, "HELLO", 5, MIO_NULL);
 | 
			
		||||
	mio_inittime (&tmout, 5, 0);
 | 
			
		||||
	MIO_INIT_NTIME (&tmout, 5, 0);
 | 
			
		||||
	n = mio_dev_sck_timedwrite  (tcp, xxx, 1000000, &tmout, MIO_NULL, MIO_NULL);
 | 
			
		||||
free (xxx);
 | 
			
		||||
 | 
			
		||||
@ -439,12 +439,12 @@ static int schedule_icmp_wait (mio_dev_sck_t* dev)
 | 
			
		||||
	mio_ntime_t fire_after;
 | 
			
		||||
 | 
			
		||||
	icmpxtn = (icmpxtn_t*)(dev + 1);
 | 
			
		||||
	mio_inittime (&fire_after, 2, 0);
 | 
			
		||||
	MIO_INIT_NTIME (&fire_after, 2, 0);
 | 
			
		||||
 | 
			
		||||
	memset (&tmrjob, 0, MIO_SIZEOF(tmrjob));
 | 
			
		||||
	tmrjob.ctx = dev;
 | 
			
		||||
	mio_gettime (&tmrjob.when);
 | 
			
		||||
	mio_addtime (&tmrjob.when, &fire_after, &tmrjob.when);
 | 
			
		||||
	mio_sys_gettime (&tmrjob.when);
 | 
			
		||||
	MIO_ADD_NTIME (&tmrjob.when, &tmrjob.when, &fire_after);
 | 
			
		||||
	tmrjob.handler = on_icmp_due;
 | 
			
		||||
	tmrjob.idxptr = &icmpxtn->tmout_jobidx;
 | 
			
		||||
 | 
			
		||||
@ -554,7 +554,7 @@ static int setup_ping4_tester (mio_t* mio)
 | 
			
		||||
 | 
			
		||||
/* ========================================================================= */
 | 
			
		||||
 | 
			
		||||
#if 1
 | 
			
		||||
#if 0
 | 
			
		||||
static mio_t* g_mio;
 | 
			
		||||
 | 
			
		||||
static void handle_signal (int sig)
 | 
			
		||||
@ -641,7 +641,7 @@ int main (int argc, char* argv[])
 | 
			
		||||
	mio_sckaddr_initforip4 (&tcp_conn.remoteaddr, 9999, (mio_ip4addr_t*)&ia);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	mio_inittime (&tcp_conn.connect_tmout, 5, 0);
 | 
			
		||||
	MIO_INIT_NTIME (&tcp_conn.connect_tmout, 5, 0);
 | 
			
		||||
	tcp_conn.options = MIO_DEV_SCK_CONNECT_SSL;
 | 
			
		||||
	if (mio_dev_sck_connect(tcp[0], &tcp_conn) <= -1)
 | 
			
		||||
	{
 | 
			
		||||
@ -706,7 +706,7 @@ int main (int argc, char* argv[])
 | 
			
		||||
	tcp_bind.options = MIO_DEV_SCK_BIND_REUSEADDR | /*MIO_DEV_SCK_BIND_REUSEPORT |*/ MIO_DEV_SCK_BIND_SSL; 
 | 
			
		||||
	tcp_bind.ssl_certfile = "localhost.crt";
 | 
			
		||||
	tcp_bind.ssl_keyfile = "localhost.key";
 | 
			
		||||
	mio_inittime (&tcp_bind.accept_tmout, 5, 1);
 | 
			
		||||
	MIO_INIT_NTIME (&tcp_bind.accept_tmout, 5, 1);
 | 
			
		||||
 | 
			
		||||
	if (mio_dev_sck_bind(tcp[2], &tcp_bind) <= -1)
 | 
			
		||||
	{
 | 
			
		||||
@ -782,7 +782,7 @@ int main (int argc, char* argv[])
 | 
			
		||||
	mio_dev_sck_connect_t tcp_conn;
 | 
			
		||||
	tcp_server_t* ts;
 | 
			
		||||
 | 
			
		||||
	mio = mio_open(&mmgr, 0, 512, MIO_NULL);
 | 
			
		||||
	mio = mio_open(&mmgr, 0, MIO_NULL, 512, MIO_NULL);
 | 
			
		||||
	if (!mio)
 | 
			
		||||
	{
 | 
			
		||||
		printf ("Cannot open mio\n");
 | 
			
		||||
@ -810,7 +810,7 @@ int main (int argc, char* argv[])
 | 
			
		||||
	in_addr_t ia = inet_addr("127.0.0.1");
 | 
			
		||||
	mio_sckaddr_initforip4 (&tcp_conn.remoteaddr, 9999, (mio_ip4addr_t*)&ia);
 | 
			
		||||
}
 | 
			
		||||
	mio_inittime (&tcp_conn.connect_tmout, 5, 0);
 | 
			
		||||
	MIO_INIT_NTIME (&tcp_conn.connect_tmout, 5, 0);
 | 
			
		||||
	tcp_conn.options = 0;
 | 
			
		||||
	if (mio_dev_sck_connect(tcpsvr, &tcp_conn) <= -1)
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
@ -250,6 +250,9 @@
 | 
			
		||||
/* Define to 1 if you have the <inttypes.h> header file. */
 | 
			
		||||
#undef HAVE_INTTYPES_H
 | 
			
		||||
 | 
			
		||||
/* Define to 1 if you have the `isatty' function. */
 | 
			
		||||
#undef HAVE_ISATTY
 | 
			
		||||
 | 
			
		||||
/* Define to 1 if you have the `isblank' function. */
 | 
			
		||||
#undef HAVE_ISBLANK
 | 
			
		||||
 | 
			
		||||
@ -334,6 +337,12 @@
 | 
			
		||||
/* Define to 1 if you have the <memory.h> header file. */
 | 
			
		||||
#undef HAVE_MEMORY_H
 | 
			
		||||
 | 
			
		||||
/* Define to 1 if you have the `mmap' function. */
 | 
			
		||||
#undef HAVE_MMAP
 | 
			
		||||
 | 
			
		||||
/* Define to 1 if you have the `munmap' function. */
 | 
			
		||||
#undef HAVE_MUNMAP
 | 
			
		||||
 | 
			
		||||
/* Define to 1 if you have the `nanosleep' function. */
 | 
			
		||||
#undef HAVE_NANOSLEEP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -433,6 +433,13 @@ struct mio_ntime_t
 | 
			
		||||
 | 
			
		||||
#define MIO_CMP_NTIME(a,b) (((a)->sec == (b)->sec)? ((a)->nsec - (b)->nsec): ((a)->sec - (b)->sec))
 | 
			
		||||
 | 
			
		||||
/* if time has been normalized properly, nsec must be equal to or
 | 
			
		||||
 * greater than 0. */
 | 
			
		||||
#define MIO_IS_NEG_NTIME(x) ((x)->sec < 0)
 | 
			
		||||
#define MIO_IS_POS_NTIME(x) ((x)->sec > 0 || ((x)->sec == 0 && (x)->nsec > 0))
 | 
			
		||||
#define MIO_IS_ZERO_NTIME(x) ((x)->sec == 0 && (x)->nsec == 0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* =========================================================================
 | 
			
		||||
 * PRIMITIVE MACROS
 | 
			
		||||
 * ========================================================================= */
 | 
			
		||||
 | 
			
		||||
@ -137,7 +137,7 @@ static pid_t standard_fork_and_exec (mio_t* mio, int pfds[], int flags, param_t*
 | 
			
		||||
	pid = fork ();
 | 
			
		||||
	if (pid == -1) 
 | 
			
		||||
	{
 | 
			
		||||
		mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
		mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -234,7 +234,7 @@ static int dev_pro_make_master (mio_dev_t* dev, void* ctx)
 | 
			
		||||
	{
 | 
			
		||||
		if (pipe(&pfds[0]) == -1)
 | 
			
		||||
		{
 | 
			
		||||
			dev->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
			dev->mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
			goto oops;
 | 
			
		||||
		}
 | 
			
		||||
		minidx = 0; maxidx = 1;
 | 
			
		||||
@ -244,7 +244,7 @@ static int dev_pro_make_master (mio_dev_t* dev, void* ctx)
 | 
			
		||||
	{
 | 
			
		||||
		if (pipe(&pfds[2]) == -1)
 | 
			
		||||
		{
 | 
			
		||||
			dev->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
			dev->mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
			goto oops;
 | 
			
		||||
		}
 | 
			
		||||
		if (minidx == -1) minidx = 2;
 | 
			
		||||
@ -255,7 +255,7 @@ static int dev_pro_make_master (mio_dev_t* dev, void* ctx)
 | 
			
		||||
	{
 | 
			
		||||
		if (pipe(&pfds[4]) == -1)
 | 
			
		||||
		{
 | 
			
		||||
			dev->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
			dev->mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
			goto oops;
 | 
			
		||||
		}
 | 
			
		||||
		if (minidx == -1) minidx = 4;
 | 
			
		||||
@ -508,7 +508,7 @@ static int dev_pro_kill_slave (mio_dev_t* dev, int force)
 | 
			
		||||
		/* indicate EOF */
 | 
			
		||||
		if (master->on_close) master->on_close (master, rdev->id);
 | 
			
		||||
 | 
			
		||||
		MIO_ASSERT (master->slave_count > 0);
 | 
			
		||||
		MIO_ASSERT (dev->mio, master->slave_count > 0);
 | 
			
		||||
		master->slave_count--;
 | 
			
		||||
 | 
			
		||||
		if (master->slave[rdev->id])
 | 
			
		||||
@ -550,7 +550,7 @@ static int dev_pro_read_slave (mio_dev_t* dev, void* buf, mio_iolen_t* len, mio_
 | 
			
		||||
	{
 | 
			
		||||
		if (errno == EINPROGRESS || errno == EWOULDBLOCK || errno == EAGAIN) return 0;  /* no data available */
 | 
			
		||||
		if (errno == EINTR) return 0;
 | 
			
		||||
		pro->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
		pro->mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -568,7 +568,7 @@ static int dev_pro_write_slave (mio_dev_t* dev, const void* data, mio_iolen_t* l
 | 
			
		||||
	{
 | 
			
		||||
		if (errno == EINPROGRESS || errno == EWOULDBLOCK || errno == EAGAIN) return 0;  /* no data can be written */
 | 
			
		||||
		if (errno == EINTR) return 0;
 | 
			
		||||
		pro->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
		pro->mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -618,7 +618,7 @@ static int dev_pro_ioctl (mio_dev_t* dev, int cmd, void* arg)
 | 
			
		||||
			{
 | 
			
		||||
				if (kill (rdev->child_pid, SIGKILL) == -1)
 | 
			
		||||
				{
 | 
			
		||||
					rdev->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
					rdev->mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
					return -1;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
@ -51,25 +51,6 @@
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define MIO_EPOCH_YEAR  (1970)
 | 
			
		||||
#define MIO_EPOCH_MON   (1)
 | 
			
		||||
#define MIO_EPOCH_DAY   (1)
 | 
			
		||||
#define MIO_EPOCH_WDAY  (4)
 | 
			
		||||
 | 
			
		||||
/* windows specific epoch time */
 | 
			
		||||
#define MIO_EPOCH_YEAR_WIN   (1601)
 | 
			
		||||
#define MIO_EPOCH_MON_WIN    (1)
 | 
			
		||||
#define MIO_EPOCH_DAY_WIN    (1)
 | 
			
		||||
 | 
			
		||||
#define MIO_DAYS_PER_WEEK  (7)
 | 
			
		||||
#define MIO_MONS_PER_YEAR  (12)
 | 
			
		||||
#define MIO_HOURS_PER_DAY  (24)
 | 
			
		||||
#define MIO_MINS_PER_HOUR  (60)
 | 
			
		||||
#define MIO_MINS_PER_DAY   (MIO_MINS_PER_HOUR*MIO_HOURS_PER_DAY)
 | 
			
		||||
#define MIO_SECS_PER_MIN   (60)
 | 
			
		||||
#define MIO_SECS_PER_HOUR  (MIO_SECS_PER_MIN*MIO_MINS_PER_HOUR)
 | 
			
		||||
#define MIO_SECS_PER_DAY   (MIO_SECS_PER_MIN*MIO_MINS_PER_DAY)
 | 
			
		||||
 | 
			
		||||
/* i don't want an error raised inside the callback to override 
 | 
			
		||||
 * the existing error number and message. */
 | 
			
		||||
#define prim_write_log(mio,mask,ptr,len) do { \
 | 
			
		||||
@ -88,10 +69,6 @@ int mio_makesyshndasync (
 | 
			
		||||
	mio_syshnd_t hnd
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
mio_errnum_t mio_syserrtoerrnum (
 | 
			
		||||
	int no
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
mio_bch_t* mio_mbsdup (
 | 
			
		||||
	mio_t*             mio,
 | 
			
		||||
@ -137,6 +114,26 @@ int mio_gettmrtmout (
 | 
			
		||||
	mio_ntime_t*       tmout
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
/* ========================================================================= */
 | 
			
		||||
/* err.c                                                                     */
 | 
			
		||||
/* ========================================================================= */
 | 
			
		||||
 | 
			
		||||
void mio_seterrbfmtv (
 | 
			
		||||
	mio_t*           mio,
 | 
			
		||||
	mio_errnum_t     errnum,
 | 
			
		||||
	const mio_bch_t* fmt,
 | 
			
		||||
	va_list          ap
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
void mio_seterrufmtv (
 | 
			
		||||
	mio_t*           mio,
 | 
			
		||||
	mio_errnum_t     errnum,
 | 
			
		||||
	const mio_uch_t* fmt,
 | 
			
		||||
	va_list          ap
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
/* ========================================================================== */
 | 
			
		||||
/* system intefaces                                                           */
 | 
			
		||||
/* ========================================================================== */
 | 
			
		||||
void mio_sys_assertfail (
 | 
			
		||||
	mio_t*           mio, 
 | 
			
		||||
@ -153,6 +150,16 @@ mio_errnum_t mio_sys_syserrstrb (
 | 
			
		||||
	mio_oow_t         len
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void mio_sys_initlog (
 | 
			
		||||
	mio_t*            mio
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
void mio_sys_finilog (
 | 
			
		||||
	mio_t*            mio
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
void mio_sys_writelog (
 | 
			
		||||
	mio_t*            mio,
 | 
			
		||||
	mio_bitmask_t     mask,
 | 
			
		||||
@ -160,6 +167,29 @@ void mio_sys_writelog (
 | 
			
		||||
	mio_oow_t         len
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int mio_sys_initmux (
 | 
			
		||||
	mio_t* mio
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
void mio_sys_finimux (
 | 
			
		||||
	mio_t* mio
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
int mio_sys_ctrlmux (
 | 
			
		||||
	mio_t*            mio,
 | 
			
		||||
	mio_sys_mux_cmd_t cmd,
 | 
			
		||||
	mio_dev_t*        dev,
 | 
			
		||||
	int               dev_capa
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The mio_sys_gettime() function gets the current time.
 | 
			
		||||
 */
 | 
			
		||||
void mio_sys_gettime (
 | 
			
		||||
	mio_ntime_t* nt
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -129,7 +129,7 @@ done:
 | 
			
		||||
 | 
			
		||||
oops:
 | 
			
		||||
	if (sck != MIO_SCKHND_INVALID) close (sck);
 | 
			
		||||
	mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
	mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
	return MIO_SCKHND_INVALID;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -345,7 +345,7 @@ static void connect_timedout (mio_t* mio, const mio_ntime_t* now, mio_tmrjob_t*
 | 
			
		||||
{
 | 
			
		||||
	mio_dev_sck_t* rdev = (mio_dev_sck_t*)job->ctx;
 | 
			
		||||
 | 
			
		||||
	MIO_ASSERT (IS_STATEFUL(rdev));
 | 
			
		||||
	MIO_ASSERT (mio, IS_STATEFUL(rdev));
 | 
			
		||||
 | 
			
		||||
	if (rdev->state & MIO_DEV_SCK_CONNECTING)
 | 
			
		||||
	{
 | 
			
		||||
@ -362,7 +362,7 @@ static void ssl_accept_timedout (mio_t* mio, const mio_ntime_t* now, mio_tmrjob_
 | 
			
		||||
{
 | 
			
		||||
	mio_dev_sck_t* rdev = (mio_dev_sck_t*)job->ctx;
 | 
			
		||||
 | 
			
		||||
	MIO_ASSERT (IS_STATEFUL(rdev));
 | 
			
		||||
	MIO_ASSERT (mio, IS_STATEFUL(rdev));
 | 
			
		||||
 | 
			
		||||
	if (rdev->state & MIO_DEV_SCK_ACCEPTING_SSL)
 | 
			
		||||
	{
 | 
			
		||||
@ -374,7 +374,7 @@ static void ssl_connect_timedout (mio_t* mio, const mio_ntime_t* now, mio_tmrjob
 | 
			
		||||
{
 | 
			
		||||
	mio_dev_sck_t* rdev = (mio_dev_sck_t*)job->ctx;
 | 
			
		||||
 | 
			
		||||
	MIO_ASSERT (IS_STATEFUL(rdev));
 | 
			
		||||
	MIO_ASSERT (mio, IS_STATEFUL(rdev));
 | 
			
		||||
 | 
			
		||||
	if (rdev->state & MIO_DEV_SCK_CONNECTING_SSL)
 | 
			
		||||
	{
 | 
			
		||||
@ -393,7 +393,7 @@ static int schedule_timer_job_at (mio_dev_sck_t* dev, const mio_ntime_t* fire_at
 | 
			
		||||
	tmrjob.handler = handler;
 | 
			
		||||
	tmrjob.idxptr = &dev->tmrjob_index;
 | 
			
		||||
 | 
			
		||||
	MIO_ASSERT (dev->tmrjob_index == MIO_TMRIDX_INVALID);
 | 
			
		||||
	MIO_ASSERT (dev->mio, dev->tmrjob_index == MIO_TMRIDX_INVALID);
 | 
			
		||||
	dev->tmrjob_index = mio_instmrjob (dev->mio, &tmrjob);
 | 
			
		||||
	return dev->tmrjob_index == MIO_TMRIDX_INVALID? -1: 0;
 | 
			
		||||
}
 | 
			
		||||
@ -402,10 +402,10 @@ static int schedule_timer_job_after (mio_dev_sck_t* dev, const mio_ntime_t* fire
 | 
			
		||||
{
 | 
			
		||||
	mio_ntime_t fire_at;
 | 
			
		||||
 | 
			
		||||
	MIO_ASSERT (mio_ispostime(fire_after));
 | 
			
		||||
	MIO_ASSERT (dev->mio, MIO_IS_POS_NTIME(fire_after));
 | 
			
		||||
 | 
			
		||||
	mio_gettime (&fire_at);
 | 
			
		||||
	mio_addtime (&fire_at, fire_after, &fire_at);
 | 
			
		||||
	mio_sys_gettime (&fire_at);
 | 
			
		||||
	MIO_ADD_NTIME (&fire_at, &fire_at, fire_after);
 | 
			
		||||
 | 
			
		||||
	return schedule_timer_job_at (dev, &fire_at, handler);
 | 
			
		||||
}
 | 
			
		||||
@ -417,7 +417,7 @@ static int dev_sck_make (mio_dev_t* dev, void* ctx)
 | 
			
		||||
	mio_dev_sck_t* rdev = (mio_dev_sck_t*)dev;
 | 
			
		||||
	mio_dev_sck_make_t* arg = (mio_dev_sck_make_t*)ctx;
 | 
			
		||||
 | 
			
		||||
	MIO_ASSERT (arg->type >= 0 && arg->type < MIO_COUNTOF(sck_type_map));
 | 
			
		||||
	MIO_ASSERT (dev->mio, arg->type >= 0 && arg->type < MIO_COUNTOF(sck_type_map));
 | 
			
		||||
 | 
			
		||||
	if (sck_type_map[arg->type].domain <= -1)
 | 
			
		||||
	{
 | 
			
		||||
@ -467,7 +467,7 @@ static int dev_sck_make_client (mio_dev_t* dev, void* ctx)
 | 
			
		||||
		int flags = fcntl(rdev->sck, F_GETFD, 0);
 | 
			
		||||
		if (fcntl(rdev->sck, F_SETFD, flags | FD_CLOEXEC) == -1)
 | 
			
		||||
		{
 | 
			
		||||
			rdev->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
			rdev->mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@ -492,13 +492,13 @@ static int dev_sck_kill (mio_dev_t* dev, int force)
 | 
			
		||||
		if (rdev->tmrjob_index != MIO_TMRIDX_INVALID)
 | 
			
		||||
		{
 | 
			
		||||
			mio_deltmrjob (dev->mio, rdev->tmrjob_index);
 | 
			
		||||
			MIO_ASSERT (rdev->tmrjob_index == MIO_TMRIDX_INVALID);
 | 
			
		||||
			MIO_ASSERT (dev->mio, rdev->tmrjob_index == MIO_TMRIDX_INVALID);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		MIO_ASSERT (rdev->state == 0);
 | 
			
		||||
		MIO_ASSERT (rdev->tmrjob_index == MIO_TMRIDX_INVALID);
 | 
			
		||||
		MIO_ASSERT (dev->mio, rdev->state == 0);
 | 
			
		||||
		MIO_ASSERT (dev->mio, rdev->tmrjob_index == MIO_TMRIDX_INVALID);
 | 
			
		||||
 | 
			
		||||
		if (rdev->on_disconnect) rdev->on_disconnect (rdev);
 | 
			
		||||
	}
 | 
			
		||||
@ -562,7 +562,7 @@ static int dev_sck_read_stateful (mio_dev_t* dev, void* buf, mio_iolen_t* len, m
 | 
			
		||||
		{
 | 
			
		||||
			if (errno == EINPROGRESS || errno == EWOULDBLOCK || errno == EAGAIN) return 0;  /* no data available */
 | 
			
		||||
			if (errno == EINTR) return 0;
 | 
			
		||||
			rdev->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
			rdev->mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@ -585,7 +585,7 @@ static int dev_sck_read_stateless (mio_dev_t* dev, void* buf, mio_iolen_t* len,
 | 
			
		||||
	{
 | 
			
		||||
		if (errno == EINPROGRESS || errno == EWOULDBLOCK || errno == EAGAIN) return 0;  /* no data available */
 | 
			
		||||
		if (errno == EINTR) return 0;
 | 
			
		||||
		rdev->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
		rdev->mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -642,7 +642,7 @@ static int dev_sck_write_stateful (mio_dev_t* dev, const void* data, mio_iolen_t
 | 
			
		||||
			 * the socket, probably leaving it in the half-closed state */
 | 
			
		||||
			if (shutdown(rdev->sck, SHUT_WR) == -1)
 | 
			
		||||
			{
 | 
			
		||||
				rdev->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
				rdev->mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
				return -1;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
@ -658,7 +658,7 @@ static int dev_sck_write_stateful (mio_dev_t* dev, const void* data, mio_iolen_t
 | 
			
		||||
		{
 | 
			
		||||
			if (errno == EINPROGRESS || errno == EWOULDBLOCK || errno == EAGAIN) return 0;  /* no data can be written */
 | 
			
		||||
			if (errno == EINTR) return 0;
 | 
			
		||||
			rdev->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
			rdev->mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@ -679,7 +679,7 @@ static int dev_sck_write_stateless (mio_dev_t* dev, const void* data, mio_iolen_
 | 
			
		||||
	{
 | 
			
		||||
		if (errno == EINPROGRESS || errno == EWOULDBLOCK || errno == EAGAIN) return 0;  /* no data can be written */
 | 
			
		||||
		if (errno == EINTR) return 0;
 | 
			
		||||
		rdev->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
		rdev->mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -772,6 +772,7 @@ static MIO_INLINE int accept_ssl (mio_dev_sck_t* dev)
 | 
			
		||||
static int dev_sck_ioctl (mio_dev_t* dev, int cmd, void* arg)
 | 
			
		||||
{
 | 
			
		||||
	mio_dev_sck_t* rdev = (mio_dev_sck_t*)dev;
 | 
			
		||||
	mio_t* mio = dev->mio;
 | 
			
		||||
 | 
			
		||||
	switch (cmd)
 | 
			
		||||
	{
 | 
			
		||||
@ -797,7 +798,7 @@ static int dev_sck_ioctl (mio_dev_t* dev, int cmd, void* arg)
 | 
			
		||||
				int v = 1;
 | 
			
		||||
				if (setsockopt (rdev->sck, SOL_SOCKET, SO_BROADCAST, &v, MIO_SIZEOF(v)) == -1)
 | 
			
		||||
				{
 | 
			
		||||
					rdev->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
					rdev->mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
					return -1;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
@ -808,7 +809,7 @@ static int dev_sck_ioctl (mio_dev_t* dev, int cmd, void* arg)
 | 
			
		||||
				int v = 1;
 | 
			
		||||
				if (setsockopt (rdev->sck, SOL_SOCKET, SO_REUSEADDR, &v, MIO_SIZEOF(v)) == -1)
 | 
			
		||||
				{
 | 
			
		||||
					rdev->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
					rdev->mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
					return -1;
 | 
			
		||||
				}
 | 
			
		||||
			#else
 | 
			
		||||
@ -823,7 +824,7 @@ static int dev_sck_ioctl (mio_dev_t* dev, int cmd, void* arg)
 | 
			
		||||
				int v = 1;
 | 
			
		||||
				if (setsockopt (rdev->sck, SOL_SOCKET, SO_REUSEPORT, &v, MIO_SIZEOF(v)) == -1)
 | 
			
		||||
				{
 | 
			
		||||
					rdev->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
					rdev->mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
					return -1;
 | 
			
		||||
				}
 | 
			
		||||
			#else
 | 
			
		||||
@ -838,7 +839,7 @@ static int dev_sck_ioctl (mio_dev_t* dev, int cmd, void* arg)
 | 
			
		||||
				int v = 1;
 | 
			
		||||
				if (setsockopt(rdev->sck, SOL_IP, IP_TRANSPARENT, &v, MIO_SIZEOF(v)) == -1)
 | 
			
		||||
				{
 | 
			
		||||
					rdev->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
					rdev->mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
					return -1;
 | 
			
		||||
				}
 | 
			
		||||
			#else
 | 
			
		||||
@ -849,12 +850,16 @@ static int dev_sck_ioctl (mio_dev_t* dev, int cmd, void* arg)
 | 
			
		||||
 | 
			
		||||
			if (rdev->ssl_ctx)
 | 
			
		||||
			{
 | 
			
		||||
			#if defined(USE_SSL)
 | 
			
		||||
				SSL_CTX_free (rdev->ssl_ctx);
 | 
			
		||||
			#endif
 | 
			
		||||
				rdev->ssl_ctx = MIO_NULL;
 | 
			
		||||
 | 
			
		||||
				if (rdev->ssl)
 | 
			
		||||
				{
 | 
			
		||||
				#if defined(USE_SSL)
 | 
			
		||||
					SSL_free (rdev->ssl);
 | 
			
		||||
				#endif
 | 
			
		||||
					rdev->ssl = MIO_NULL;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
@ -904,7 +909,7 @@ static int dev_sck_ioctl (mio_dev_t* dev, int cmd, void* arg)
 | 
			
		||||
			x = bind(rdev->sck, sa, sl);
 | 
			
		||||
			if (x == -1)
 | 
			
		||||
			{
 | 
			
		||||
				rdev->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
				rdev->mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
			#if defined(USE_SSL)
 | 
			
		||||
				if (ssl_ctx) SSL_CTX_free (ssl_ctx);
 | 
			
		||||
			#endif
 | 
			
		||||
@ -1003,9 +1008,9 @@ fcntl (rdev->sck, F_SETFL, flags | O_NONBLOCK);
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
					{
 | 
			
		||||
						mio_inittime (&rdev->tmout, 0, 0); /* just in case */
 | 
			
		||||
						MIO_INIT_NTIME (&rdev->tmout, 0, 0); /* just in case */
 | 
			
		||||
 | 
			
		||||
						if (mio_ispostime(&conn->connect_tmout))
 | 
			
		||||
						if (MIO_IS_POS_NTIME(&conn->connect_tmout))
 | 
			
		||||
						{
 | 
			
		||||
							if (schedule_timer_job_after(rdev, &conn->connect_tmout, connect_timedout) <= -1) 
 | 
			
		||||
							{
 | 
			
		||||
@ -1014,7 +1019,7 @@ fcntl (rdev->sck, F_SETFL, flags | O_NONBLOCK);
 | 
			
		||||
							else
 | 
			
		||||
							{
 | 
			
		||||
								/* update rdev->tmout to the deadline of the connect timeout job */
 | 
			
		||||
								MIO_ASSERT (rdev->tmrjob_index != MIO_TMRIDX_INVALID);
 | 
			
		||||
								MIO_ASSERT (mio, rdev->tmrjob_index != MIO_TMRIDX_INVALID);
 | 
			
		||||
								mio_gettmrjobdeadline (rdev->mio, rdev->tmrjob_index, &rdev->tmout);
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
@ -1028,7 +1033,7 @@ fcntl (rdev->sck, F_SETFL, flags | O_NONBLOCK);
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				rdev->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
				rdev->mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
 | 
			
		||||
			oops_connect:
 | 
			
		||||
				if (mio_dev_watch((mio_dev_t*)rdev, MIO_DEV_WATCH_UPDATE, MIO_DEV_EVENT_IN) <= -1)
 | 
			
		||||
@ -1068,11 +1073,11 @@ fcntl (rdev->sck, F_SETFL, flags | O_NONBLOCK);
 | 
			
		||||
					if (x == 0) 
 | 
			
		||||
					{
 | 
			
		||||
						MIO_ASSERT (rdev->tmrjob_index == MIO_TMRIDX_INVALID);
 | 
			
		||||
						mio_inittime (&rdev->tmout, 0, 0); /* just in case */
 | 
			
		||||
						MIO_INIT_NTIME (&rdev->tmout, 0, 0); /* just in case */
 | 
			
		||||
 | 
			
		||||
						/* it's ok to use conn->connect_tmout for ssl-connect as
 | 
			
		||||
						 * the underlying socket connection has been established immediately */
 | 
			
		||||
						if (mio_ispostime(&conn->connect_tmout))
 | 
			
		||||
						if (MIO_IS_POS_NTIME(&conn->connect_tmout))
 | 
			
		||||
						{
 | 
			
		||||
							if (schedule_timer_job_after(rdev, &conn->connect_tmout, ssl_connect_timedout) <= -1) 
 | 
			
		||||
							{
 | 
			
		||||
@ -1134,7 +1139,7 @@ fcntl (rdev->sck, F_SETFL, flags | O_NONBLOCK);
 | 
			
		||||
			x = listen (rdev->sck, lstn->backlogs);
 | 
			
		||||
			if (x == -1) 
 | 
			
		||||
			{
 | 
			
		||||
				rdev->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
				rdev->mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
				return -1;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
@ -1186,12 +1191,12 @@ static int harvest_outgoing_connection (mio_dev_sck_t* rdev)
 | 
			
		||||
	int errcode;
 | 
			
		||||
	mio_scklen_t len;
 | 
			
		||||
 | 
			
		||||
	MIO_ASSERT (!(rdev->state & MIO_DEV_SCK_CONNECTED));
 | 
			
		||||
	MIO_ASSERT (rdev->mio, !(rdev->state & MIO_DEV_SCK_CONNECTED));
 | 
			
		||||
 | 
			
		||||
	len = MIO_SIZEOF(errcode);
 | 
			
		||||
	if (getsockopt(rdev->sck, SOL_SOCKET, SO_ERROR, (char*)&errcode, &len) == -1)
 | 
			
		||||
	{
 | 
			
		||||
		rdev->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
		rdev->mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	else if (errcode == 0)
 | 
			
		||||
@ -1204,7 +1209,7 @@ static int harvest_outgoing_connection (mio_dev_sck_t* rdev)
 | 
			
		||||
		if (rdev->tmrjob_index != MIO_TMRIDX_INVALID)
 | 
			
		||||
		{
 | 
			
		||||
			mio_deltmrjob (rdev->mio, rdev->tmrjob_index);
 | 
			
		||||
			MIO_ASSERT (rdev->tmrjob_index == MIO_TMRIDX_INVALID);
 | 
			
		||||
			MIO_ASSERT (rdev->mio, rdev->tmrjob_index == MIO_TMRIDX_INVALID);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		addrlen = MIO_SIZEOF(localaddr);
 | 
			
		||||
@ -1235,7 +1240,7 @@ static int harvest_outgoing_connection (mio_dev_sck_t* rdev)
 | 
			
		||||
				/* rdev->tmout has been set to the deadline of the connect task
 | 
			
		||||
				 * when the CONNECT IOCTL command has been executed. use the 
 | 
			
		||||
				 * same deadline here */
 | 
			
		||||
				if (mio_ispostime(&rdev->tmout) &&
 | 
			
		||||
				if (MIO_IS_POS_NTIME(&rdev->tmout) &&
 | 
			
		||||
				    schedule_timer_job_at(rdev, &rdev->tmout, ssl_connect_timedout) <= -1)
 | 
			
		||||
				{
 | 
			
		||||
					mio_dev_halt ((mio_dev_t*)rdev);
 | 
			
		||||
@ -1267,13 +1272,14 @@ static int harvest_outgoing_connection (mio_dev_sck_t* rdev)
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		rdev->mio->errnum = mio_syserrtoerrnum(errcode);
 | 
			
		||||
		mio_seterrwithsyserr (rdev->mio, 0, errcode);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int accept_incoming_connection (mio_dev_sck_t* rdev)
 | 
			
		||||
{
 | 
			
		||||
	mio_t* mio = rdev->mio;
 | 
			
		||||
	mio_sckhnd_t clisck;
 | 
			
		||||
	mio_sckaddr_t remoteaddr;
 | 
			
		||||
	mio_scklen_t addrlen;
 | 
			
		||||
@ -1294,7 +1300,7 @@ static int accept_incoming_connection (mio_dev_sck_t* rdev)
 | 
			
		||||
			if (errno == EINPROGRESS || errno == EWOULDBLOCK || errno == EAGAIN) return 0;
 | 
			
		||||
			if (errno == EINTR) return 0; /* if interrupted by a signal, treat it as if it's EINPROGRESS */
 | 
			
		||||
 | 
			
		||||
			rdev->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
			rdev->mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
			return -1;
 | 
			
		||||
		 }
 | 
			
		||||
 | 
			
		||||
@ -1313,7 +1319,7 @@ static int accept_incoming_connection (mio_dev_sck_t* rdev)
 | 
			
		||||
		if (errno == EINPROGRESS || errno == EWOULDBLOCK || errno == EAGAIN) return 0;
 | 
			
		||||
		if (errno == EINTR) return 0; /* if interrupted by a signal, treat it as if it's EINPROGRESS */
 | 
			
		||||
 | 
			
		||||
		rdev->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
		rdev->mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -1330,7 +1336,7 @@ accept_done:
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	MIO_ASSERT (clidev->sck == clisck);
 | 
			
		||||
	MIO_ASSERT (mio, clidev->sck == clisck);
 | 
			
		||||
 | 
			
		||||
	clidev->dev_capa |= MIO_DEV_CAPA_IN | MIO_DEV_CAPA_OUT | MIO_DEV_CAPA_STREAM | MIO_DEV_CAPA_OUT_QUEUED;
 | 
			
		||||
	clidev->remoteaddr = remoteaddr;
 | 
			
		||||
@ -1382,18 +1388,18 @@ accept_done:
 | 
			
		||||
	clidev->on_write = rdev->on_write;
 | 
			
		||||
	clidev->on_read = rdev->on_read;
 | 
			
		||||
 | 
			
		||||
	MIO_ASSERT (clidev->tmrjob_index == MIO_TMRIDX_INVALID);
 | 
			
		||||
	MIO_ASSERT (mio, clidev->tmrjob_index == MIO_TMRIDX_INVALID);
 | 
			
		||||
 | 
			
		||||
	if (rdev->ssl_ctx)
 | 
			
		||||
	{
 | 
			
		||||
		MIO_DEV_SCK_SET_PROGRESS (clidev, MIO_DEV_SCK_ACCEPTING_SSL);
 | 
			
		||||
		MIO_ASSERT (clidev->state & MIO_DEV_SCK_ACCEPTING_SSL);
 | 
			
		||||
		MIO_ASSERT (mio, clidev->state & MIO_DEV_SCK_ACCEPTING_SSL);
 | 
			
		||||
		/* actual SSL acceptance must be completed in the client device */
 | 
			
		||||
 | 
			
		||||
		/* let the client device know the SSL context to use */
 | 
			
		||||
		clidev->ssl_ctx = rdev->ssl_ctx;
 | 
			
		||||
 | 
			
		||||
		if (mio_ispostime(&rdev->tmout) &&
 | 
			
		||||
		if (MIO_IS_POS_NTIME(&rdev->tmout) &&
 | 
			
		||||
		    schedule_timer_job_after (clidev, &rdev->tmout, ssl_accept_timedout) <= -1)
 | 
			
		||||
		{
 | 
			
		||||
			/* TODO: call a warning/error callback */
 | 
			
		||||
@ -1431,7 +1437,7 @@ static int dev_evcb_sck_ready_stateful (mio_dev_t* dev, int events)
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			rdev->mio->errnum = mio_syserrtoerrnum (errcode);
 | 
			
		||||
			mio_seterrwithsyserr (rdev->mio, 0, errcode);
 | 
			
		||||
		}
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
@ -1605,7 +1611,7 @@ static int dev_evcb_sck_ready_stateless (mio_dev_t* dev, int events)
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			rdev->mio->errnum = mio_syserrtoerrnum (errcode);
 | 
			
		||||
			mio_seterrwithsyserr (rdev->mio, 0, errcode);
 | 
			
		||||
		}
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										540
									
								
								mio/lib/mio.c
									
									
									
									
									
								
							
							
						
						
									
										540
									
								
								mio/lib/mio.c
									
									
									
									
									
								
							@ -26,20 +26,6 @@
 | 
			
		||||
 | 
			
		||||
#include "mio-prv.h"
 | 
			
		||||
  
 | 
			
		||||
#if defined(HAVE_SYS_EPOLL_H)
 | 
			
		||||
#	include <sys/epoll.h>
 | 
			
		||||
#	define USE_EPOLL
 | 
			
		||||
#elif defined(HAVE_SYS_POLL_H)
 | 
			
		||||
#	include <sys/poll.h>
 | 
			
		||||
#	define USE_POLL
 | 
			
		||||
#else
 | 
			
		||||
#	error NO SUPPORTED MULTIPLEXER
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#define DEV_CAPA_ALL_WATCHED (MIO_DEV_CAPA_IN_WATCHED | MIO_DEV_CAPA_OUT_WATCHED | MIO_DEV_CAPA_PRI_WATCHED)
 | 
			
		||||
 | 
			
		||||
static int schedule_kill_zombie_job (mio_dev_t* dev);
 | 
			
		||||
@ -65,294 +51,28 @@ static void on_read_timeout (mio_t* mio, const mio_ntime_t* now, mio_tmrjob_t* j
 | 
			
		||||
static void on_write_timeout (mio_t* mio, const mio_ntime_t* now, mio_tmrjob_t* job);
 | 
			
		||||
 | 
			
		||||
/* ========================================================================= */
 | 
			
		||||
#if defined(USE_POLL)
 | 
			
		||||
 | 
			
		||||
#define MUX_CMD_INSERT 1
 | 
			
		||||
#define MUX_CMD_UPDATE 2
 | 
			
		||||
#define MUX_CMD_DELETE 3
 | 
			
		||||
 | 
			
		||||
#define MUX_INDEX_INVALID MIO_TYPE_MAX(mio_oow_t)
 | 
			
		||||
 | 
			
		||||
struct mio_mux_t
 | 
			
		||||
{
 | 
			
		||||
	struct
 | 
			
		||||
	{
 | 
			
		||||
		mio_oow_t* ptr;
 | 
			
		||||
		mio_oow_t  size;
 | 
			
		||||
		mio_oow_t  capa;
 | 
			
		||||
	} map; /* handle to index */
 | 
			
		||||
 | 
			
		||||
	struct
 | 
			
		||||
	{
 | 
			
		||||
		struct pollfd* pfd;
 | 
			
		||||
		mio_dev_t** dptr;
 | 
			
		||||
		mio_oow_t size;
 | 
			
		||||
		mio_oow_t capa;
 | 
			
		||||
	} pd; /* poll data */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int mux_open (mio_t* mio)
 | 
			
		||||
{
 | 
			
		||||
	mio_mux_t* mux;
 | 
			
		||||
 | 
			
		||||
	mux = MIO_MMGR_ALLOC (mio->mmgr, MIO_SIZEOF(*mux));
 | 
			
		||||
	if (!mux)
 | 
			
		||||
	{
 | 
			
		||||
		mio->errnum = MIO_ESYSMEM;
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	MIO_MEMSET (mux, 0, MIO_SIZEOF(*mux));
 | 
			
		||||
 | 
			
		||||
	mio->mux = mux;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void mux_close (mio_t* mio)
 | 
			
		||||
{
 | 
			
		||||
	if (mio->mux)
 | 
			
		||||
	{
 | 
			
		||||
		MIO_MMGR_FREE (mio->mmgr, mio->mux);
 | 
			
		||||
		mio->mux = MIO_NULL;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int mux_control (mio_dev_t* dev, int cmd, mio_syshnd_t hnd, int dev_capa)
 | 
			
		||||
{
 | 
			
		||||
	mio_t* mio;
 | 
			
		||||
	mio_mux_t* mux;
 | 
			
		||||
	mio_oow_t idx;
 | 
			
		||||
 | 
			
		||||
	mio = dev->mio;
 | 
			
		||||
	mux = (mio_mux_t*)mio->mux;
 | 
			
		||||
 | 
			
		||||
	if (hnd >= mux->map.capa)
 | 
			
		||||
	{
 | 
			
		||||
		mio_oow_t new_capa;
 | 
			
		||||
		mio_oow_t* tmp;
 | 
			
		||||
 | 
			
		||||
		if (cmd != MUX_CMD_INSERT)
 | 
			
		||||
		{
 | 
			
		||||
			mio->errnum = MIO_ENOENT;
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		new_capa = MIO_ALIGN_POW2((hnd + 1), 256);
 | 
			
		||||
 | 
			
		||||
		tmp = MIO_MMGR_REALLOC(mio->mmgr, mux->map.ptr, new_capa * MIO_SIZEOF(*tmp));
 | 
			
		||||
		if (!tmp)
 | 
			
		||||
		{
 | 
			
		||||
			mio->errnum = MIO_ESYSMEM;
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for (idx = mux->map.capa; idx < new_capa; idx++) 
 | 
			
		||||
			tmp[idx] = MUX_INDEX_INVALID;
 | 
			
		||||
 | 
			
		||||
		mux->map.ptr = tmp;
 | 
			
		||||
		mux->map.capa = new_capa;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	idx = mux->map.ptr[hnd];
 | 
			
		||||
	if (idx != MUX_INDEX_INVALID)
 | 
			
		||||
	{
 | 
			
		||||
		if (cmd == MUX_CMD_INSERT)
 | 
			
		||||
		{
 | 
			
		||||
			mio->errnum = MIO_EEXIST;
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		if (cmd != MUX_CMD_INSERT)
 | 
			
		||||
		{
 | 
			
		||||
			mio->errnum = MIO_ENOENT;
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch (cmd)
 | 
			
		||||
	{
 | 
			
		||||
		case MUX_CMD_INSERT:
 | 
			
		||||
 | 
			
		||||
			if (mux->pd.size >= mux->pd.capa)
 | 
			
		||||
			{
 | 
			
		||||
				mio_oow_t new_capa;
 | 
			
		||||
				struct pollfd* tmp1;
 | 
			
		||||
				mio_dev_t** tmp2;
 | 
			
		||||
 | 
			
		||||
				new_capa = MIO_ALIGN_POW2(mux->pd.size + 1, 256);
 | 
			
		||||
 | 
			
		||||
				tmp1 = MIO_MMGR_REALLOC(mio->mmgr, mux->pd.pfd, new_capa * MIO_SIZEOF(*tmp1));
 | 
			
		||||
				if (!tmp1)
 | 
			
		||||
				{
 | 
			
		||||
					mio->errnum = MIO_ESYSMEM;
 | 
			
		||||
					return -1;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				tmp2 = MIO_MMGR_REALLOC (mio->mmgr, mux->pd.dptr, new_capa * MIO_SIZEOF(*tmp2));
 | 
			
		||||
				if (!tmp2)
 | 
			
		||||
				{
 | 
			
		||||
					MIO_MMGR_FREE (mio->mmgr, tmp1);
 | 
			
		||||
					mio->errnum = MIO_ESYSMEM;
 | 
			
		||||
					return -1;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				mux->pd.pfd = tmp1;
 | 
			
		||||
				mux->pd.dptr = tmp2;
 | 
			
		||||
				mux->pd.capa = new_capa;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			idx = mux->pd.size++;
 | 
			
		||||
 | 
			
		||||
			mux->pd.pfd[idx].fd = hnd;
 | 
			
		||||
			mux->pd.pfd[idx].events = 0;
 | 
			
		||||
			if (dev_capa & MIO_DEV_CAPA_IN_WATCHED) mux->pd.pfd[idx].events |= POLLIN;
 | 
			
		||||
			if (dev_capa & MIO_DEV_CAPA_OUT_WATCHED) mux->pd.pfd[idx].events |= POLLOUT;
 | 
			
		||||
			mux->pd.pfd[idx].revents = 0;
 | 
			
		||||
			mux->pd.dptr[idx] = dev;
 | 
			
		||||
 | 
			
		||||
			mux->map.ptr[hnd] = idx;
 | 
			
		||||
 | 
			
		||||
			return 0;
 | 
			
		||||
 | 
			
		||||
		case MUX_CMD_UPDATE:
 | 
			
		||||
			MIO_ASSERT (mux->pd.dptr[idx] == dev);
 | 
			
		||||
			mux->pd.pfd[idx].events = 0;
 | 
			
		||||
			if (dev_capa & MIO_DEV_CAPA_IN_WATCHED) mux->pd.pfd[idx].events |= POLLIN;
 | 
			
		||||
			if (dev_capa & MIO_DEV_CAPA_OUT_WATCHED) mux->pd.pfd[idx].events |= POLLOUT;
 | 
			
		||||
			return 0;
 | 
			
		||||
 | 
			
		||||
		case MUX_CMD_DELETE:
 | 
			
		||||
			MIO_ASSERT (mux->pd.dptr[idx] == dev);
 | 
			
		||||
			mux->map.ptr[hnd] = MUX_INDEX_INVALID;
 | 
			
		||||
 | 
			
		||||
			/* TODO: speed up deletion. allow a hole in the array.
 | 
			
		||||
			 *       delay array compaction if there is a hole.
 | 
			
		||||
			 *       set fd for the hole to -1 such that poll()
 | 
			
		||||
			 *       ignores it. compact the array if another deletion 
 | 
			
		||||
			 *       is requested when there is an existing hole. */
 | 
			
		||||
			idx++;
 | 
			
		||||
			while (idx < mux->pd.size)
 | 
			
		||||
			{
 | 
			
		||||
				int fd;
 | 
			
		||||
 | 
			
		||||
				mux->pd.pfd[idx - 1] = mux->pd.pfd[idx];
 | 
			
		||||
				mux->pd.dptr[idx - 1] = mux->pd.dptr[idx];
 | 
			
		||||
 | 
			
		||||
				fd = mux->pd.pfd[idx].fd;
 | 
			
		||||
				mux->map.ptr[fd] = idx - 1;
 | 
			
		||||
 | 
			
		||||
				idx++;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			mux->pd.size--;
 | 
			
		||||
 | 
			
		||||
			return 0;
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			mio->errnum = MIO_EINVAL;
 | 
			
		||||
			return -1;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#elif defined(USE_EPOLL)
 | 
			
		||||
 | 
			
		||||
#define MUX_CMD_INSERT EPOLL_CTL_ADD
 | 
			
		||||
#define MUX_CMD_UPDATE EPOLL_CTL_MOD
 | 
			
		||||
#define MUX_CMD_DELETE EPOLL_CTL_DEL
 | 
			
		||||
 | 
			
		||||
struct mio_mux_t
 | 
			
		||||
{
 | 
			
		||||
	int hnd;
 | 
			
		||||
	struct epoll_event revs[100]; /* TODO: is it a good size? */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static int mux_open (mio_t* mio)
 | 
			
		||||
{
 | 
			
		||||
	mio_mux_t* mux;
 | 
			
		||||
 | 
			
		||||
	mux = MIO_MMGR_ALLOC (mio->mmgr, MIO_SIZEOF(*mux));
 | 
			
		||||
	if (!mux)
 | 
			
		||||
	{
 | 
			
		||||
		mio->errnum = MIO_ESYSMEM;
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	MIO_MEMSET (mux, 0, MIO_SIZEOF(*mux));
 | 
			
		||||
 | 
			
		||||
	mux->hnd = epoll_create (1000);
 | 
			
		||||
	if (mux->hnd == -1)
 | 
			
		||||
	{
 | 
			
		||||
		mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
		MIO_MMGR_FREE (mio->mmgr, mux);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mio->mux = mux;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void mux_close (mio_t* mio)
 | 
			
		||||
{
 | 
			
		||||
	if (mio->mux)
 | 
			
		||||
	{
 | 
			
		||||
		close (mio->mux->hnd);
 | 
			
		||||
		MIO_MMGR_FREE (mio->mmgr, mio->mux);
 | 
			
		||||
		mio->mux = MIO_NULL;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static MIO_INLINE int mux_control (mio_dev_t* dev, int cmd, mio_syshnd_t hnd, int dev_capa)
 | 
			
		||||
{
 | 
			
		||||
	struct epoll_event ev;
 | 
			
		||||
 | 
			
		||||
	ev.data.ptr = dev;
 | 
			
		||||
	ev.events = EPOLLHUP | EPOLLERR /*| EPOLLET*/;
 | 
			
		||||
 | 
			
		||||
	if (dev_capa & MIO_DEV_CAPA_IN_WATCHED) 
 | 
			
		||||
	{
 | 
			
		||||
		ev.events |= EPOLLIN;
 | 
			
		||||
	#if defined(EPOLLRDHUP)
 | 
			
		||||
		ev.events |= EPOLLRDHUP;
 | 
			
		||||
	#endif
 | 
			
		||||
		if (dev_capa & MIO_DEV_CAPA_PRI_WATCHED) ev.events |= EPOLLPRI;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (dev_capa & MIO_DEV_CAPA_OUT_WATCHED) ev.events |= EPOLLOUT;
 | 
			
		||||
 | 
			
		||||
	if (epoll_ctl (dev->mio->mux->hnd, cmd, hnd, &ev) == -1)
 | 
			
		||||
	{
 | 
			
		||||
		dev->mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* ========================================================================= */
 | 
			
		||||
 | 
			
		||||
mio_t* mio_open (mio_mmgr_t* mmgr, mio_oow_t xtnsize, mio_oow_t tmrcapa, mio_errnum_t* errnum)
 | 
			
		||||
mio_t* mio_open (mio_mmgr_t* mmgr, mio_oow_t xtnsize, mio_cmgr_t* cmgr, mio_oow_t tmrcapa, mio_errinf_t* errinfo)
 | 
			
		||||
{
 | 
			
		||||
	mio_t* mio;
 | 
			
		||||
 | 
			
		||||
	mio = MIO_MMGR_ALLOC (mmgr, MIO_SIZEOF(mio_t) + xtnsize);
 | 
			
		||||
	if (!cmgr) cmgr = mio_get_utf8_cmgr();
 | 
			
		||||
 | 
			
		||||
	mio = (mio_t*)MIO_MMGR_ALLOC(mmgr, MIO_SIZEOF(mio_t) + xtnsize);
 | 
			
		||||
	if (mio)
 | 
			
		||||
	{
 | 
			
		||||
		if (mio_init (mio, mmgr, tmrcapa) <= -1)
 | 
			
		||||
		if (mio_init(mio, mmgr, cmgr, tmrcapa) <= -1)
 | 
			
		||||
		{
 | 
			
		||||
			if (errnum) *errnum = mio->errnum;
 | 
			
		||||
			if (errinfo) mio_geterrinf (mio, errinfo);
 | 
			
		||||
			MIO_MMGR_FREE (mmgr, mio);
 | 
			
		||||
			mio = MIO_NULL;
 | 
			
		||||
		}
 | 
			
		||||
		else MIO_MEMSET (mio + 1, 0, xtnsize);
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	else if (errinfo)
 | 
			
		||||
	{
 | 
			
		||||
		if (errnum) *errnum = MIO_ESYSMEM;
 | 
			
		||||
		errinfo->num = MIO_ESYSMEM;
 | 
			
		||||
		mio_copy_oocstr (errinfo->msg, MIO_COUNTOF(errinfo->msg), mio_errnum_to_errstr(MIO_ESYSMEM));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return mio;
 | 
			
		||||
@ -364,28 +84,53 @@ void mio_close (mio_t* mio)
 | 
			
		||||
	MIO_MMGR_FREE (mio->mmgr, mio);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mio_init (mio_t* mio, mio_mmgr_t* mmgr, mio_oow_t tmrcapa)
 | 
			
		||||
int mio_init (mio_t* mio, mio_mmgr_t* mmgr, mio_cmgr_t* cmgr, mio_oow_t tmrcapa)
 | 
			
		||||
{
 | 
			
		||||
	int sys_log_inited = 0;
 | 
			
		||||
	int sys_mux_inited = 0;
 | 
			
		||||
 | 
			
		||||
	MIO_MEMSET (mio, 0, MIO_SIZEOF(*mio));
 | 
			
		||||
	mio->mmgr = mmgr;
 | 
			
		||||
	mio->cmgr = cmgr;
 | 
			
		||||
 | 
			
		||||
	/* initialize data for logging support */
 | 
			
		||||
	mio->option.log_mask = MIO_LOG_ALL_LEVELS | MIO_LOG_ALL_TYPES;
 | 
			
		||||
	mio->log.capa = MIO_ALIGN_POW2(1, MIO_LOG_CAPA_ALIGN); /* TODO: is this a good initial size? */
 | 
			
		||||
	/* alloate the log buffer in advance though it may get reallocated
 | 
			
		||||
	 * in put_oocs and put_ooch in fmtout.c. this is to let the logging
 | 
			
		||||
	 * routine still function despite some side-effects when
 | 
			
		||||
	 * reallocation fails */
 | 
			
		||||
	/* +1 required for consistency with put_oocs and put_ooch in fmtout.c */
 | 
			
		||||
	mio->log.ptr = mio_allocmem(mio, (mio->log.capa + 1) * MIO_SIZEOF(*mio->log.ptr)); 
 | 
			
		||||
	if (!mio->log.ptr) goto oops;
 | 
			
		||||
 | 
			
		||||
	/* inititalize the system-side logging */
 | 
			
		||||
	mio_sys_initlog (mio);
 | 
			
		||||
	sys_log_inited = 1;
 | 
			
		||||
 | 
			
		||||
	/* intialize the multiplexer object */
 | 
			
		||||
 | 
			
		||||
	if (mux_open (mio) <= -1) return -1;
 | 
			
		||||
	if (mio_sys_initmux(mio) <= -1) goto oops;
 | 
			
		||||
	sys_mux_inited = 0;
 | 
			
		||||
 | 
			
		||||
	/* initialize the timer object */
 | 
			
		||||
	if (tmrcapa <= 0) tmrcapa = 1;
 | 
			
		||||
	mio->tmr.jobs = MIO_MMGR_ALLOC (mio->mmgr, tmrcapa * MIO_SIZEOF(mio_tmrjob_t));
 | 
			
		||||
	if (!mio->tmr.jobs) 
 | 
			
		||||
	{
 | 
			
		||||
		mio->errnum = MIO_ESYSMEM;
 | 
			
		||||
		mux_close (mio);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	mio->tmr.jobs = mio_allocmem(mio, tmrcapa * MIO_SIZEOF(mio_tmrjob_t));
 | 
			
		||||
	if (!mio->tmr.jobs) goto oops;
 | 
			
		||||
 | 
			
		||||
	mio->tmr.capa = tmrcapa;
 | 
			
		||||
 | 
			
		||||
	MIO_CWQ_INIT (&mio->cwq);
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
oops:
 | 
			
		||||
	if (mio->tmr.jobs) mio_freemem (mio, mio->tmr.jobs);
 | 
			
		||||
 | 
			
		||||
	if (sys_mux_inited) mio_sys_finimux (mio);
 | 
			
		||||
	if (sys_log_inited) mio_sys_finilog (mio);
 | 
			
		||||
 | 
			
		||||
	if (mio->log.ptr) mio_freemem (mio, mio->log.ptr);
 | 
			
		||||
	mio->log.capa = 0;
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void mio_fini (mio_t* mio)
 | 
			
		||||
@ -449,7 +194,7 @@ void mio_fini (mio_t* mio)
 | 
			
		||||
		 * because the device is freed regardless of the failure when 2 
 | 
			
		||||
		 * is given to kill_and_free_device(). */
 | 
			
		||||
		dev = diehard.head;
 | 
			
		||||
		MIO_ASSERT (!(dev->dev_capa & (MIO_DEV_CAPA_ACTIVE | MIO_DEV_CAPA_HALTED | MIO_DEV_CAPA_ZOMBIE)));
 | 
			
		||||
		MIO_ASSERT (mio, !(dev->dev_capa & (MIO_DEV_CAPA_ACTIVE | MIO_DEV_CAPA_HALTED | MIO_DEV_CAPA_ZOMBIE)));
 | 
			
		||||
		UNLINK_DEVICE_FROM_LIST (&diehard, dev);
 | 
			
		||||
		kill_and_free_device (dev, 2);
 | 
			
		||||
	}
 | 
			
		||||
@ -458,10 +203,52 @@ void mio_fini (mio_t* mio)
 | 
			
		||||
	mio_cleartmrjobs (mio);
 | 
			
		||||
	MIO_MMGR_FREE (mio->mmgr, mio->tmr.jobs);
 | 
			
		||||
 | 
			
		||||
	/* close the multiplexer */
 | 
			
		||||
	mux_close (mio);
 | 
			
		||||
	mio_sys_finimux (mio); /* close the multiplexer */
 | 
			
		||||
	mio_sys_finilog (mio); /* close the system logger */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mio_setoption (mio_t* mio, mio_option_t id, const void* value)
 | 
			
		||||
{
 | 
			
		||||
	switch (id)
 | 
			
		||||
	{
 | 
			
		||||
		case MIO_TRAIT:
 | 
			
		||||
			mio->option.trait = *(mio_bitmask_t*)value;
 | 
			
		||||
			return 0;
 | 
			
		||||
 | 
			
		||||
		case MIO_LOG_MASK:
 | 
			
		||||
			mio->option.log_mask = *(mio_bitmask_t*)value;
 | 
			
		||||
			return 0;
 | 
			
		||||
 | 
			
		||||
		case MIO_LOG_MAXCAPA:
 | 
			
		||||
			mio->option.log_maxcapa = *(mio_oow_t*)value;
 | 
			
		||||
			return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
einval:
 | 
			
		||||
	mio_seterrnum (mio, MIO_EINVAL);
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mio_getoption (mio_t* mio, mio_option_t id, void* value)
 | 
			
		||||
{
 | 
			
		||||
	switch  (id)
 | 
			
		||||
	{
 | 
			
		||||
		case MIO_TRAIT:
 | 
			
		||||
			*(mio_bitmask_t*)value = mio->option.trait;
 | 
			
		||||
			return 0;
 | 
			
		||||
 | 
			
		||||
		case MIO_LOG_MASK:
 | 
			
		||||
			*(mio_bitmask_t*)value = mio->option.log_mask;
 | 
			
		||||
			return 0;
 | 
			
		||||
 | 
			
		||||
		case MIO_LOG_MAXCAPA:
 | 
			
		||||
			*(mio_oow_t*)value = mio->option.log_maxcapa;
 | 
			
		||||
			return 0;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	mio_seterrnum (mio, MIO_EINVAL);
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mio_prologue (mio_t* mio)
 | 
			
		||||
{
 | 
			
		||||
@ -479,7 +266,7 @@ static MIO_INLINE void unlink_wq (mio_t* mio, mio_wq_t* q)
 | 
			
		||||
	if (q->tmridx != MIO_TMRIDX_INVALID)
 | 
			
		||||
	{
 | 
			
		||||
		mio_deltmrjob (mio, q->tmridx);
 | 
			
		||||
		MIO_ASSERT (q->tmridx == MIO_TMRIDX_INVALID);
 | 
			
		||||
		MIO_ASSERT (mio, q->tmridx == MIO_TMRIDX_INVALID);
 | 
			
		||||
	}
 | 
			
		||||
	MIO_WQ_UNLINK (q);
 | 
			
		||||
}
 | 
			
		||||
@ -491,7 +278,7 @@ static MIO_INLINE void handle_event (mio_dev_t* dev, int events, int rdhup)
 | 
			
		||||
	mio = dev->mio;
 | 
			
		||||
	mio->renew_watch = 0;
 | 
			
		||||
 | 
			
		||||
	MIO_ASSERT (mio == dev->mio);
 | 
			
		||||
	MIO_ASSERT (mio, mio == dev->mio);
 | 
			
		||||
 | 
			
		||||
	if (dev->dev_evcb->ready)
 | 
			
		||||
	{
 | 
			
		||||
@ -642,8 +429,8 @@ static MIO_INLINE void handle_event (mio_dev_t* dev, int events, int rdhup)
 | 
			
		||||
 | 
			
		||||
				MIO_MEMSET (&tmrjob, 0, MIO_SIZEOF(tmrjob));
 | 
			
		||||
				tmrjob.ctx = dev;
 | 
			
		||||
				mio_gettime (&tmrjob.when);
 | 
			
		||||
				mio_addtime (&tmrjob.when, &dev->rtmout, &tmrjob.when);
 | 
			
		||||
				mio_sys_gettime (&tmrjob.when);
 | 
			
		||||
				MIO_ADD_NTIME (&tmrjob.when, &tmrjob.when, &dev->rtmout);
 | 
			
		||||
				tmrjob.handler = on_read_timeout;
 | 
			
		||||
				tmrjob.idxptr = &dev->rtmridx;
 | 
			
		||||
 | 
			
		||||
@ -752,12 +539,8 @@ static MIO_INLINE int __exec (mio_t* mio)
 | 
			
		||||
{
 | 
			
		||||
	mio_ntime_t tmout;
 | 
			
		||||
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
	ULONG nentries, i;
 | 
			
		||||
#else
 | 
			
		||||
	int nentries, i;
 | 
			
		||||
	mio_mux_t* mux;
 | 
			
		||||
#endif
 | 
			
		||||
	mio_sys_mux_t* mux;
 | 
			
		||||
 | 
			
		||||
	/*if (!mio->actdev.head) return 0;*/
 | 
			
		||||
 | 
			
		||||
@ -811,13 +594,13 @@ static MIO_INLINE int __exec (mio_t* mio)
 | 
			
		||||
*/
 | 
			
		||||
#elif defined(USE_POLL)
 | 
			
		||||
 | 
			
		||||
	mux = (mio_mux_t*)mio->mux;
 | 
			
		||||
	mux = (mio_sys_mux_t*)mio->sys.mux;
 | 
			
		||||
 | 
			
		||||
	nentries = poll(mux->pd.pfd, mux->pd.size, MIO_SECNSEC_TO_MSEC(tmout.sec, tmout.nsec));
 | 
			
		||||
	if (nentries == -1)
 | 
			
		||||
	{
 | 
			
		||||
		if (errno == EINTR) return 0;
 | 
			
		||||
		mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
		mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -830,7 +613,7 @@ static MIO_INLINE int __exec (mio_t* mio)
 | 
			
		||||
 | 
			
		||||
			dev = mux->pd.dptr[i];
 | 
			
		||||
 | 
			
		||||
			MIO_ASSERT (!(mux->pd.pfd[i].revents & POLLNVAL));
 | 
			
		||||
			MIO_ASSERT (mio, !(mux->pd.pfd[i].revents & POLLNVAL));
 | 
			
		||||
			if (mux->pd.pfd[i].revents & POLLIN) events |= MIO_DEV_EVENT_IN;
 | 
			
		||||
			if (mux->pd.pfd[i].revents & POLLOUT) events |= MIO_DEV_EVENT_OUT;
 | 
			
		||||
			if (mux->pd.pfd[i].revents & POLLPRI) events |= MIO_DEV_EVENT_PRI;
 | 
			
		||||
@ -843,14 +626,14 @@ static MIO_INLINE int __exec (mio_t* mio)
 | 
			
		||||
 | 
			
		||||
#elif defined(USE_EPOLL)
 | 
			
		||||
 | 
			
		||||
	mux = (mio_mux_t*)mio->mux;
 | 
			
		||||
	mux = (mio_sys_mux_t*)mio->sys.mux;
 | 
			
		||||
 | 
			
		||||
	nentries = epoll_wait(mux->hnd, mux->revs, MIO_COUNTOF(mux->revs), MIO_SECNSEC_TO_MSEC(tmout.sec, tmout.nsec));
 | 
			
		||||
	if (nentries == -1)
 | 
			
		||||
	{
 | 
			
		||||
		if (errno == EINTR) return 0; /* it's actually ok */
 | 
			
		||||
		/* other errors are critical - EBADF, EFAULT, EINVAL */
 | 
			
		||||
		mio->errnum = mio_syserrtoerrnum(errno);
 | 
			
		||||
		mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -882,10 +665,10 @@ static MIO_INLINE int __exec (mio_t* mio)
 | 
			
		||||
	/* kill all halted devices */
 | 
			
		||||
	while (mio->hltdev.head) 
 | 
			
		||||
	{
 | 
			
		||||
printf (">>>>>>>>>>>>>> KILLING HALTED DEVICE %p\n", mio->hltdev.head);
 | 
			
		||||
		MIO_DEBUG1 (mio, "Killing HALTED device %p\n", mio->hltdev.head);
 | 
			
		||||
		mio_killdev (mio, mio->hltdev.head);
 | 
			
		||||
	}
 | 
			
		||||
	MIO_ASSERT (mio->hltdev.tail == MIO_NULL);
 | 
			
		||||
	MIO_ASSERT (mio, mio->hltdev.tail == MIO_NULL);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
@ -950,7 +733,7 @@ mio_dev_t* mio_makedev (mio_t* mio, mio_oow_t dev_size, mio_dev_mth_t* dev_mth,
 | 
			
		||||
	dev->dev_capa = MIO_DEV_CAPA_IN | MIO_DEV_CAPA_OUT;
 | 
			
		||||
	dev->dev_mth = dev_mth;
 | 
			
		||||
	dev->dev_evcb = dev_evcb;
 | 
			
		||||
	mio_inittime (&dev->rtmout, 0, 0); 
 | 
			
		||||
	MIO_INIT_NTIME (&dev->rtmout, 0, 0); 
 | 
			
		||||
	dev->rtmridx = MIO_TMRIDX_INVALID;
 | 
			
		||||
	MIO_WQ_INIT (&dev->wq);
 | 
			
		||||
	dev->cw_count = 0;
 | 
			
		||||
@ -964,10 +747,10 @@ mio_dev_t* mio_makedev (mio_t* mio, mio_oow_t dev_size, mio_dev_mth_t* dev_mth,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* the make callback must not change these fields */
 | 
			
		||||
	MIO_ASSERT (dev->dev_mth == dev_mth);
 | 
			
		||||
	MIO_ASSERT (dev->dev_evcb == dev_evcb);
 | 
			
		||||
	MIO_ASSERT (dev->dev_prev == MIO_NULL);
 | 
			
		||||
	MIO_ASSERT (dev->dev_next == MIO_NULL);
 | 
			
		||||
	MIO_ASSERT (mio, dev->dev_mth == dev_mth);
 | 
			
		||||
	MIO_ASSERT (mio, dev->dev_evcb == dev_evcb);
 | 
			
		||||
	MIO_ASSERT (mio, dev->dev_prev == MIO_NULL);
 | 
			
		||||
	MIO_ASSERT (mio, dev->dev_next == MIO_NULL);
 | 
			
		||||
 | 
			
		||||
	/* set some internal capability bits according to the capabilities 
 | 
			
		||||
	 * removed by the device making callback for convenience sake. */
 | 
			
		||||
@ -1026,8 +809,8 @@ static int kill_and_free_device (mio_dev_t* dev, int force)
 | 
			
		||||
{
 | 
			
		||||
	mio_t* mio;
 | 
			
		||||
 | 
			
		||||
	MIO_ASSERT (!(dev->dev_capa & MIO_DEV_CAPA_ACTIVE));
 | 
			
		||||
	MIO_ASSERT (!(dev->dev_capa & MIO_DEV_CAPA_HALTED));
 | 
			
		||||
	MIO_ASSERT (mio, !(dev->dev_capa & MIO_DEV_CAPA_ACTIVE));
 | 
			
		||||
	MIO_ASSERT (mio, !(dev->dev_capa & MIO_DEV_CAPA_HALTED));
 | 
			
		||||
 | 
			
		||||
	mio = dev->mio;
 | 
			
		||||
 | 
			
		||||
@ -1060,7 +843,7 @@ static void kill_zombie_job_handler (mio_t* mio, const mio_ntime_t* now, mio_tmr
 | 
			
		||||
{
 | 
			
		||||
	mio_dev_t* dev = (mio_dev_t*)job->ctx;
 | 
			
		||||
 | 
			
		||||
	MIO_ASSERT (dev->dev_capa & MIO_DEV_CAPA_ZOMBIE);
 | 
			
		||||
	MIO_ASSERT (mio, dev->dev_capa & MIO_DEV_CAPA_ZOMBIE);
 | 
			
		||||
 | 
			
		||||
	if (kill_and_free_device(dev, 0) <= -1)
 | 
			
		||||
	{
 | 
			
		||||
@ -1087,12 +870,12 @@ static int schedule_kill_zombie_job (mio_dev_t* dev)
 | 
			
		||||
	mio_tmrjob_t kill_zombie_job;
 | 
			
		||||
	mio_ntime_t tmout;
 | 
			
		||||
 | 
			
		||||
	mio_inittime (&tmout, 3, 0); /* TODO: take it from configuration */
 | 
			
		||||
	MIO_INIT_NTIME (&tmout, 3, 0); /* TODO: take it from configuration */
 | 
			
		||||
 | 
			
		||||
	MIO_MEMSET (&kill_zombie_job, 0, MIO_SIZEOF(kill_zombie_job));
 | 
			
		||||
	kill_zombie_job.ctx = dev;
 | 
			
		||||
	mio_gettime (&kill_zombie_job.when);
 | 
			
		||||
	mio_addtime (&kill_zombie_job.when, &tmout, &kill_zombie_job.when);
 | 
			
		||||
	mio_sys_gettime (&kill_zombie_job.when);
 | 
			
		||||
	MIO_ADD_NTIME (&kill_zombie_job.when, &kill_zombie_job.when, &tmout);
 | 
			
		||||
	kill_zombie_job.handler = kill_zombie_job_handler;
 | 
			
		||||
	/*kill_zombie_job.idxptr = &rdev->tmridx_kill_zombie;*/
 | 
			
		||||
 | 
			
		||||
@ -1101,13 +884,13 @@ static int schedule_kill_zombie_job (mio_dev_t* dev)
 | 
			
		||||
 | 
			
		||||
void mio_killdev (mio_t* mio, mio_dev_t* dev)
 | 
			
		||||
{
 | 
			
		||||
	MIO_ASSERT (mio == dev->mio);
 | 
			
		||||
	MIO_ASSERT (mio, mio == dev->mio);
 | 
			
		||||
 | 
			
		||||
	if (dev->dev_capa & MIO_DEV_CAPA_ZOMBIE)
 | 
			
		||||
	{
 | 
			
		||||
		MIO_ASSERT (MIO_WQ_ISEMPTY(&dev->wq));
 | 
			
		||||
		MIO_ASSERT (dev->cw_count == 0);
 | 
			
		||||
		MIO_ASSERT (dev->rtmridx == MIO_TMRIDX_INVALID);
 | 
			
		||||
		MIO_ASSERT (mio, MIO_WQ_ISEMPTY(&dev->wq));
 | 
			
		||||
		MIO_ASSERT (mio, dev->cw_count == 0);
 | 
			
		||||
		MIO_ASSERT (mio, dev->rtmridx == MIO_TMRIDX_INVALID);
 | 
			
		||||
		goto kill_device;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -1152,7 +935,7 @@ void mio_killdev (mio_t* mio, mio_dev_t* dev)
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		MIO_ASSERT (dev->dev_capa & MIO_DEV_CAPA_ACTIVE);
 | 
			
		||||
		MIO_ASSERT (mio, dev->dev_capa & MIO_DEV_CAPA_ACTIVE);
 | 
			
		||||
		UNLINK_DEVICE_FROM_LIST (&mio->actdev, dev);
 | 
			
		||||
		dev->dev_capa &= ~MIO_DEV_CAPA_ACTIVE;
 | 
			
		||||
	}
 | 
			
		||||
@ -1162,7 +945,7 @@ void mio_killdev (mio_t* mio, mio_dev_t* dev)
 | 
			
		||||
kill_device:
 | 
			
		||||
	if (kill_and_free_device(dev, 0) <= -1)
 | 
			
		||||
	{
 | 
			
		||||
		MIO_ASSERT (dev->dev_capa & MIO_DEV_CAPA_ZOMBIE);
 | 
			
		||||
		MIO_ASSERT (mio, dev->dev_capa & MIO_DEV_CAPA_ZOMBIE);
 | 
			
		||||
		if (schedule_kill_zombie_job (dev) <= -1)
 | 
			
		||||
		{
 | 
			
		||||
			/* i have to choice but to free up the devide by force */
 | 
			
		||||
@ -1223,7 +1006,7 @@ int mio_dev_watch (mio_dev_t* dev, mio_dev_watch_cmd_t cmd, int events)
 | 
			
		||||
		case MIO_DEV_WATCH_START:
 | 
			
		||||
			/* upon start, only input watching is requested */
 | 
			
		||||
			events = MIO_DEV_EVENT_IN; 
 | 
			
		||||
			mux_cmd = MUX_CMD_INSERT;
 | 
			
		||||
			mux_cmd = MIO_SYS_MUX_CMD_INSERT;
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case MIO_DEV_WATCH_RENEW:
 | 
			
		||||
@ -1235,12 +1018,12 @@ int mio_dev_watch (mio_dev_t* dev, mio_dev_watch_cmd_t cmd, int events)
 | 
			
		||||
			/* fall through */
 | 
			
		||||
		case MIO_DEV_WATCH_UPDATE:
 | 
			
		||||
			/* honor event watching requests as given by the caller */
 | 
			
		||||
			mux_cmd = MUX_CMD_UPDATE;
 | 
			
		||||
			mux_cmd = MIO_SYS_MUX_CMD_UPDATE;
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case MIO_DEV_WATCH_STOP:
 | 
			
		||||
			events = 0; /* override events */
 | 
			
		||||
			mux_cmd = MUX_CMD_DELETE;
 | 
			
		||||
			mux_cmd = MIO_SYS_MUX_CMD_DELETE;
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
@ -1269,13 +1052,13 @@ int mio_dev_watch (mio_dev_t* dev, mio_dev_watch_cmd_t cmd, int events)
 | 
			
		||||
		if (dev->dev_capa & MIO_DEV_CAPA_OUT) dev_capa |= MIO_DEV_CAPA_OUT_WATCHED;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (mux_cmd == MUX_CMD_UPDATE && (dev_capa & DEV_CAPA_ALL_WATCHED) == (dev->dev_capa & DEV_CAPA_ALL_WATCHED))
 | 
			
		||||
	if (mux_cmd == MIO_SYS_MUX_CMD_UPDATE && (dev_capa & DEV_CAPA_ALL_WATCHED) == (dev->dev_capa & DEV_CAPA_ALL_WATCHED))
 | 
			
		||||
	{
 | 
			
		||||
		/* no change in the device capacity. skip calling epoll_ctl */
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		if (mux_control(dev, mux_cmd, dev->dev_mth->getsyshnd(dev), dev_capa) <= -1) return -1;
 | 
			
		||||
		if (mio_sys_ctrlmux(dev->mio, mux_cmd, dev, dev_capa) <= -1) return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	dev->dev_capa = dev_capa;
 | 
			
		||||
@ -1292,7 +1075,7 @@ static void on_read_timeout (mio_t* mio, const mio_ntime_t* now, mio_tmrjob_t* j
 | 
			
		||||
	dev->mio->errnum = MIO_ETMOUT;
 | 
			
		||||
	x = dev->dev_evcb->on_read(dev, MIO_NULL, -1, MIO_NULL); 
 | 
			
		||||
 | 
			
		||||
	MIO_ASSERT (dev->rtmridx == MIO_TMRIDX_INVALID);
 | 
			
		||||
	MIO_ASSERT (mio, dev->rtmridx == MIO_TMRIDX_INVALID);
 | 
			
		||||
 | 
			
		||||
	if (x <= -1) mio_dev_halt (dev);
 | 
			
		||||
}
 | 
			
		||||
@ -1331,14 +1114,14 @@ update_timer:
 | 
			
		||||
		dev->rtmridx = MIO_TMRIDX_INVALID;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (tmout && mio_ispostime(tmout))
 | 
			
		||||
	if (tmout && MIO_IS_POS_NTIME(tmout))
 | 
			
		||||
	{
 | 
			
		||||
		mio_tmrjob_t tmrjob;
 | 
			
		||||
 | 
			
		||||
		MIO_MEMSET (&tmrjob, 0, MIO_SIZEOF(tmrjob));
 | 
			
		||||
		tmrjob.ctx = dev;
 | 
			
		||||
		mio_gettime (&tmrjob.when);
 | 
			
		||||
		mio_addtime (&tmrjob.when, tmout, &tmrjob.when);
 | 
			
		||||
		mio_sys_gettime (&tmrjob.when);
 | 
			
		||||
		MIO_ADD_NTIME (&tmrjob.when, &tmrjob.when, tmout);
 | 
			
		||||
		tmrjob.handler = on_read_timeout;
 | 
			
		||||
		tmrjob.idxptr = &dev->rtmridx;
 | 
			
		||||
 | 
			
		||||
@ -1401,7 +1184,7 @@ static void on_write_timeout (mio_t* mio, const mio_ntime_t* now, mio_tmrjob_t*
 | 
			
		||||
	dev->mio->errnum = MIO_ETMOUT;
 | 
			
		||||
	x = dev->dev_evcb->on_write(dev, -1, q->ctx, &q->dstaddr); 
 | 
			
		||||
 | 
			
		||||
	MIO_ASSERT (q->tmridx == MIO_TMRIDX_INVALID);
 | 
			
		||||
	MIO_ASSERT (mio, q->tmridx == MIO_TMRIDX_INVALID);
 | 
			
		||||
	MIO_WQ_UNLINK(q);
 | 
			
		||||
	MIO_MMGR_FREE (mio->mmgr, q);
 | 
			
		||||
 | 
			
		||||
@ -1526,14 +1309,14 @@ enqueue_data:
 | 
			
		||||
	q->olen = len;
 | 
			
		||||
	MIO_MEMCPY (q->ptr, uptr, urem);
 | 
			
		||||
 | 
			
		||||
	if (tmout && mio_ispostime(tmout))
 | 
			
		||||
	if (tmout && MIO_IS_POS_NTIME(tmout))
 | 
			
		||||
	{
 | 
			
		||||
		mio_tmrjob_t tmrjob;
 | 
			
		||||
 | 
			
		||||
		MIO_MEMSET (&tmrjob, 0, MIO_SIZEOF(tmrjob));
 | 
			
		||||
		tmrjob.ctx = q;
 | 
			
		||||
		mio_gettime (&tmrjob.when);
 | 
			
		||||
		mio_addtime (&tmrjob.when, tmout, &tmrjob.when);
 | 
			
		||||
		mio_sys_gettime (&tmrjob.when);
 | 
			
		||||
		MIO_ADD_NTIME (&tmrjob.when, &tmrjob.when, tmout);
 | 
			
		||||
		tmrjob.handler = on_write_timeout;
 | 
			
		||||
		tmrjob.idxptr = &q->tmridx;
 | 
			
		||||
 | 
			
		||||
@ -1624,74 +1407,17 @@ int mio_makesyshndasync (mio_t* mio, mio_syshnd_t hnd)
 | 
			
		||||
	if ((flags = fcntl(hnd, F_GETFL)) <= -1 ||
 | 
			
		||||
	    (flags = fcntl(hnd, F_SETFL, flags | O_NONBLOCK)) <= -1)
 | 
			
		||||
	{
 | 
			
		||||
		mio->errnum = mio_syserrtoerrnum (errno);
 | 
			
		||||
		mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
#else
 | 
			
		||||
	mio->errnum = MIO_ENOSUP;
 | 
			
		||||
	mio->errnum = MIO_ENOIMPL;
 | 
			
		||||
	return -1;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mio_errnum_t mio_syserrtoerrnum (int no)
 | 
			
		||||
{
 | 
			
		||||
	switch (no)
 | 
			
		||||
	{
 | 
			
		||||
		case ENOMEM:
 | 
			
		||||
			return MIO_ESYSMEM;
 | 
			
		||||
 | 
			
		||||
		case EINVAL:
 | 
			
		||||
			return MIO_EINVAL;
 | 
			
		||||
 | 
			
		||||
		case EEXIST:
 | 
			
		||||
			return MIO_EEXIST;
 | 
			
		||||
 | 
			
		||||
		case ENOENT:
 | 
			
		||||
			return MIO_ENOENT;
 | 
			
		||||
 | 
			
		||||
		case EMFILE:
 | 
			
		||||
			return MIO_EMFILE;
 | 
			
		||||
 | 
			
		||||
	#if defined(ENFILE)
 | 
			
		||||
		case ENFILE:
 | 
			
		||||
			return MIO_ENFILE;
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	#if defined(EWOULDBLOCK) && defined(EAGAIN) && (EWOULDBLOCK != EAGAIN)
 | 
			
		||||
		case EAGAIN:
 | 
			
		||||
		case EWOULDBLOCK:
 | 
			
		||||
			return MIO_EAGAIN;
 | 
			
		||||
	#elif defined(EAGAIN)
 | 
			
		||||
		case EAGAIN:
 | 
			
		||||
			return MIO_EAGAIN;
 | 
			
		||||
	#elif defined(EWOULDBLOCK)
 | 
			
		||||
		case EWOULDBLOCK:
 | 
			
		||||
			return MIO_EAGAIN;
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	#if defined(ECONNREFUSED)
 | 
			
		||||
		case ECONNREFUSED:
 | 
			
		||||
			return MIO_ECONRF;
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	#if defined(ECONNRESETD)
 | 
			
		||||
		case ECONNRESET:
 | 
			
		||||
			return MIO_ECONRS;
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	#if defined(EPERM)
 | 
			
		||||
		case EPERM:
 | 
			
		||||
			return MIO_EPERM;
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			return MIO_ESYSERR;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* -------------------------------------------------------------------------- */
 | 
			
		||||
 | 
			
		||||
void* mio_allocmem (mio_t* mio, mio_oow_t size)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										201
									
								
								mio/lib/mio.h
									
									
									
									
									
								
							
							
						
						
									
										201
									
								
								mio/lib/mio.h
									
									
									
									
									
								
							@ -113,6 +113,15 @@ struct mio_errinf_t
 | 
			
		||||
};
 | 
			
		||||
typedef struct mio_errinf_t mio_errinf_t;
 | 
			
		||||
 | 
			
		||||
enum mio_option_t
 | 
			
		||||
{
 | 
			
		||||
	MIO_TRAIT,
 | 
			
		||||
	MIO_LOG_MASK,
 | 
			
		||||
	MIO_LOG_MAXCAPA
 | 
			
		||||
};
 | 
			
		||||
typedef enum mio_option_t mio_option_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
enum mio_stopreq_t
 | 
			
		||||
{
 | 
			
		||||
	MIO_STOPREQ_NONE = 0,
 | 
			
		||||
@ -371,11 +380,84 @@ typedef enum mio_dev_event_t mio_dev_event_t;
 | 
			
		||||
#define MIO_CWQFL_SIZE 16
 | 
			
		||||
#define MIO_CWQFL_ALIGN 16
 | 
			
		||||
 | 
			
		||||
/* ========================================================================= */
 | 
			
		||||
/* =========================================================================
 | 
			
		||||
 * MIO LOGGING
 | 
			
		||||
 * ========================================================================= */
 | 
			
		||||
 | 
			
		||||
enum mio_log_mask_t
 | 
			
		||||
{
 | 
			
		||||
	MIO_LOG_DEBUG      = (1u << 0),
 | 
			
		||||
	MIO_LOG_INFO       = (1u << 1),
 | 
			
		||||
	MIO_LOG_WARN       = (1u << 2),
 | 
			
		||||
	MIO_LOG_ERROR      = (1u << 3),
 | 
			
		||||
	MIO_LOG_FATAL      = (1u << 4),
 | 
			
		||||
 | 
			
		||||
	MIO_LOG_UNTYPED    = (1u << 6), /* only to be used by MIO_DEBUGx() and MIO_INFOx() */
 | 
			
		||||
	MIO_LOG_CORE       = (1u << 7),
 | 
			
		||||
	MIO_LOG_DEV        = (1u << 8),
 | 
			
		||||
	MIO_LOG_TIMER      = (1u << 9),
 | 
			
		||||
 | 
			
		||||
	MIO_LOG_ALL_LEVELS = (MIO_LOG_DEBUG  | MIO_LOG_INFO | MIO_LOG_WARN | MIO_LOG_ERROR | MIO_LOG_FATAL),
 | 
			
		||||
	MIO_LOG_ALL_TYPES  = (MIO_LOG_UNTYPED | MIO_LOG_CORE | MIO_LOG_DEV | MIO_LOG_TIMER),
 | 
			
		||||
 | 
			
		||||
	MIO_LOG_STDOUT     = (1u << 14), /* write log messages to stdout without timestamp. MIO_LOG_STDOUT wins over MIO_LOG_STDERR. */
 | 
			
		||||
	MIO_LOG_STDERR     = (1u << 15)  /* write log messages to stderr without timestamp. */
 | 
			
		||||
};
 | 
			
		||||
typedef enum mio_log_mask_t mio_log_mask_t;
 | 
			
		||||
 | 
			
		||||
/* all bits must be set to get enabled */
 | 
			
		||||
#define MIO_LOG_ENABLED(mio,mask) (((mio)->option.log_mask & (mask)) == (mask))
 | 
			
		||||
 | 
			
		||||
#define MIO_LOG0(mio,mask,fmt) do { if (MIO_LOG_ENABLED(mio,mask)) mio_logbfmt(mio, mask, fmt); } while(0)
 | 
			
		||||
#define MIO_LOG1(mio,mask,fmt,a1) do { if (MIO_LOG_ENABLED(mio,mask)) mio_logbfmt(mio, mask, fmt, a1); } while(0)
 | 
			
		||||
#define MIO_LOG2(mio,mask,fmt,a1,a2) do { if (MIO_LOG_ENABLED(mio,mask)) mio_logbfmt(mio, mask, fmt, a1, a2); } while(0)
 | 
			
		||||
#define MIO_LOG3(mio,mask,fmt,a1,a2,a3) do { if (MIO_LOG_ENABLED(mio,mask)) mio_logbfmt(mio, mask, fmt, a1, a2, a3); } while(0)
 | 
			
		||||
#define MIO_LOG4(mio,mask,fmt,a1,a2,a3,a4) do { if (MIO_LOG_ENABLED(mio,mask)) mio_logbfmt(mio, mask, fmt, a1, a2, a3, a4); } while(0)
 | 
			
		||||
#define MIO_LOG5(mio,mask,fmt,a1,a2,a3,a4,a5) do { if (MIO_LOG_ENABLED(mio,mask)) mio_logbfmt(mio, mask, fmt, a1, a2, a3, a4, a5); } while(0)
 | 
			
		||||
#define MIO_LOG6(mio,mask,fmt,a1,a2,a3,a4,a5,a6) do { if (MIO_LOG_ENABLED(mio,mask)) mio_logbfmt(mio, mask, fmt, a1, a2, a3, a4, a5, a6); } while(0)
 | 
			
		||||
 | 
			
		||||
#if defined(MIO_BUILD_RELEASE)
 | 
			
		||||
	/* [NOTE]
 | 
			
		||||
	 *  get rid of debugging message totally regardless of
 | 
			
		||||
	 *  the log mask in the release build.
 | 
			
		||||
	 */
 | 
			
		||||
#	define MIO_DEBUG0(mio,fmt)
 | 
			
		||||
#	define MIO_DEBUG1(mio,fmt,a1)
 | 
			
		||||
#	define MIO_DEBUG2(mio,fmt,a1,a2)
 | 
			
		||||
#	define MIO_DEBUG3(mio,fmt,a1,a2,a3)
 | 
			
		||||
#	define MIO_DEBUG4(mio,fmt,a1,a2,a3,a4)
 | 
			
		||||
#	define MIO_DEBUG5(mio,fmt,a1,a2,a3,a4,a5)
 | 
			
		||||
#	define MIO_DEBUG6(mio,fmt,a1,a2,a3,a4,a5,a6)
 | 
			
		||||
#else
 | 
			
		||||
#	define MIO_DEBUG0(mio,fmt) MIO_LOG0(mio, MIO_LOG_DEBUG | MIO_LOG_UNTYPED, fmt)
 | 
			
		||||
#	define MIO_DEBUG1(mio,fmt,a1) MIO_LOG1(mio, MIO_LOG_DEBUG | MIO_LOG_UNTYPED, fmt, a1)
 | 
			
		||||
#	define MIO_DEBUG2(mio,fmt,a1,a2) MIO_LOG2(mio, MIO_LOG_DEBUG | MIO_LOG_UNTYPED, fmt, a1, a2)
 | 
			
		||||
#	define MIO_DEBUG3(mio,fmt,a1,a2,a3) MIO_LOG3(mio, MIO_LOG_DEBUG | MIO_LOG_UNTYPED, fmt, a1, a2, a3)
 | 
			
		||||
#	define MIO_DEBUG4(mio,fmt,a1,a2,a3,a4) MIO_LOG4(mio, MIO_LOG_DEBUG | MIO_LOG_UNTYPED, fmt, a1, a2, a3, a4)
 | 
			
		||||
#	define MIO_DEBUG5(mio,fmt,a1,a2,a3,a4,a5) MIO_LOG5(mio, MIO_LOG_DEBUG | MIO_LOG_UNTYPED, fmt, a1, a2, a3, a4, a5)
 | 
			
		||||
#	define MIO_DEBUG6(mio,fmt,a1,a2,a3,a4,a5,a6) MIO_LOG6(mio, MIO_LOG_DEBUG | MIO_LOG_UNTYPED, fmt, a1, a2, a3, a4, a5, a6)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define MIO_INFO0(mio,fmt) MIO_LOG0(mio, MIO_LOG_INFO | MIO_LOG_UNTYPED, fmt)
 | 
			
		||||
#define MIO_INFO1(mio,fmt,a1) MIO_LOG1(mio, MIO_LOG_INFO | MIO_LOG_UNTYPED, fmt, a1)
 | 
			
		||||
#define MIO_INFO2(mio,fmt,a1,a2) MIO_LOG2(mio, MIO_LOG_INFO | MIO_LOG_UNTYPED, fmt, a1, a2)
 | 
			
		||||
#define MIO_INFO3(mio,fmt,a1,a2,a3) MIO_LOG3(mio, MIO_LOG_INFO | MIO_LOG_UNTYPED, fmt, a1, a2, a3)
 | 
			
		||||
#define MIO_INFO4(mio,fmt,a1,a2,a3,a4) MIO_LOG4(mio, MIO_LOG_INFO | MIO_LOG_UNTYPED, fmt, a1, a2, a3, a4)
 | 
			
		||||
#define MIO_INFO5(mio,fmt,a1,a2,a3,a4,a5) MIO_LOG5(mio, MIO_LOG_INFO | MIO_LOG_UNTYPED, fmt, a1, a2, a3, a4, a5)
 | 
			
		||||
#define MIO_INFO6(mio,fmt,a1,a2,a3,a4,a5,a6) MIO_LOG6(mio, MIO_LOG_INFO | MIO_LOG_UNTYPED, fmt, a1, a2, a3, a4, a5, a6)
 | 
			
		||||
 | 
			
		||||
/* ========================================================================= */
 | 
			
		||||
 | 
			
		||||
typedef struct mio_mux_t mio_mux_t;
 | 
			
		||||
enum mio_sys_mux_cmd_t
 | 
			
		||||
{
 | 
			
		||||
	MIO_SYS_MUX_CMD_INSERT = 0,
 | 
			
		||||
	MIO_SYS_MUX_CMD_UPDATE = 1,
 | 
			
		||||
	MIO_SYS_MUX_CMD_DELETE = 2
 | 
			
		||||
};
 | 
			
		||||
typedef enum mio_sys_mux_cmd_t mio_sys_mux_cmd_t;
 | 
			
		||||
 | 
			
		||||
typedef struct mio_sys_mux_t mio_sys_mux_t;
 | 
			
		||||
typedef struct mio_sys_log_t mio_sys_log_t;
 | 
			
		||||
 | 
			
		||||
struct mio_t
 | 
			
		||||
{
 | 
			
		||||
@ -393,9 +475,15 @@ struct mio_t
 | 
			
		||||
		mio_ooch_t buf[MIO_ERRMSG_CAPA];
 | 
			
		||||
		mio_oow_t len;
 | 
			
		||||
	} errmsg;
 | 
			
		||||
 | 
			
		||||
	int shuterr;
 | 
			
		||||
 | 
			
		||||
	mio_stopreq_t stopreq;  /* stop request to abort mio_loop() */
 | 
			
		||||
	struct
 | 
			
		||||
	{
 | 
			
		||||
		mio_bitmask_t trait;
 | 
			
		||||
		mio_bitmask_t log_mask;
 | 
			
		||||
		mio_oow_t log_maxcapa;
 | 
			
		||||
	} option;
 | 
			
		||||
 | 
			
		||||
	struct
 | 
			
		||||
	{
 | 
			
		||||
@ -416,6 +504,8 @@ struct mio_t
 | 
			
		||||
		} xbuf; /* buffer to support sprintf */
 | 
			
		||||
	} sprintf;
 | 
			
		||||
 | 
			
		||||
	mio_stopreq_t stopreq;  /* stop request to abort mio_loop() */
 | 
			
		||||
 | 
			
		||||
	struct
 | 
			
		||||
	{
 | 
			
		||||
		mio_dev_t* head;
 | 
			
		||||
@ -450,7 +540,11 @@ struct mio_t
 | 
			
		||||
	mio_cwq_t* cwqfl[MIO_CWQFL_SIZE]; /* list of free cwq objects */
 | 
			
		||||
 | 
			
		||||
	/* platform specific fields below */
 | 
			
		||||
	mio_mux_t* mux;
 | 
			
		||||
	struct
 | 
			
		||||
	{
 | 
			
		||||
		mio_sys_mux_t* mux;
 | 
			
		||||
		mio_sys_log_t* log;
 | 
			
		||||
	} sys;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* ========================================================================= */
 | 
			
		||||
@ -461,25 +555,38 @@ extern "C" {
 | 
			
		||||
 | 
			
		||||
MIO_EXPORT mio_t* mio_open (
 | 
			
		||||
	mio_mmgr_t*   mmgr,
 | 
			
		||||
	mio_oow_t    xtnsize,
 | 
			
		||||
	mio_oow_t    tmrcapa,  /**< initial timer capacity */
 | 
			
		||||
	mio_errnum_t* errnum
 | 
			
		||||
	mio_oow_t     xtnsize,
 | 
			
		||||
	mio_cmgr_t*   cmgr,
 | 
			
		||||
	mio_oow_t     tmrcapa,  /**< initial timer capacity */
 | 
			
		||||
	mio_errinf_t* errinf
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
MIO_EXPORT void mio_close (
 | 
			
		||||
	mio_t* mio
 | 
			
		||||
	mio_t*        mio
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
MIO_EXPORT int mio_init (
 | 
			
		||||
	mio_t*      mio,
 | 
			
		||||
	mio_mmgr_t* mmgr,
 | 
			
		||||
	mio_oow_t  tmrcapa
 | 
			
		||||
	mio_t*       mio,
 | 
			
		||||
	mio_mmgr_t*  mmgr,
 | 
			
		||||
	mio_cmgr_t*  cmgr,
 | 
			
		||||
	mio_oow_t    tmrcapa
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
MIO_EXPORT void mio_fini (
 | 
			
		||||
	mio_t*      mio
 | 
			
		||||
	mio_t*       mio
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
MIO_EXPORT int mio_getoption (
 | 
			
		||||
	mio_t*        mio,
 | 
			
		||||
	mio_option_t  id,
 | 
			
		||||
	void*         value
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
MIO_EXPORT int mio_setoption (
 | 
			
		||||
	mio_t*       mio,
 | 
			
		||||
	mio_option_t id,
 | 
			
		||||
	const void*  value
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
#if defined(MIO_HAVE_INLINE)
 | 
			
		||||
	static MIO_INLINE mio_mmgr_t* mio_getmmgr (mio_t* mio) { return mio->mmgr; }
 | 
			
		||||
@ -572,10 +679,10 @@ MIO_EXPORT void mio_stop (
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
MIO_EXPORT mio_dev_t* mio_makedev (
 | 
			
		||||
	mio_t*          mio,
 | 
			
		||||
	mio_oow_t      dev_size,
 | 
			
		||||
	mio_dev_mth_t*  dev_mth,
 | 
			
		||||
	mio_dev_evcb_t* dev_evcb,
 | 
			
		||||
	mio_t*           mio,
 | 
			
		||||
	mio_oow_t        dev_size,
 | 
			
		||||
	mio_dev_mth_t*   dev_mth,
 | 
			
		||||
	mio_dev_evcb_t*  dev_evcb,
 | 
			
		||||
	void*            make_ctx
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
@ -585,7 +692,7 @@ MIO_EXPORT void mio_killdev (
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
MIO_EXPORT int mio_dev_ioctl (
 | 
			
		||||
	mio_dev_t* dev,
 | 
			
		||||
	mio_dev_t*  dev,
 | 
			
		||||
	int         cmd,
 | 
			
		||||
	void*       arg
 | 
			
		||||
);
 | 
			
		||||
@ -594,7 +701,7 @@ MIO_EXPORT int mio_dev_watch (
 | 
			
		||||
	mio_dev_t*          dev,
 | 
			
		||||
	mio_dev_watch_cmd_t cmd,
 | 
			
		||||
	/** 0 or bitwise-ORed of #MIO_DEV_EVENT_IN and #MIO_DEV_EVENT_OUT */
 | 
			
		||||
	int                  events
 | 
			
		||||
	int                 events
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
MIO_EXPORT int mio_dev_read (
 | 
			
		||||
@ -619,19 +726,19 @@ MIO_EXPORT int mio_dev_timedread (
 | 
			
		||||
 */ 
 | 
			
		||||
MIO_EXPORT int mio_dev_write (
 | 
			
		||||
	mio_dev_t*            dev,
 | 
			
		||||
	const void*            data,
 | 
			
		||||
	const void*           data,
 | 
			
		||||
	mio_iolen_t           len,
 | 
			
		||||
	void*                  wrctx,
 | 
			
		||||
	void*                 wrctx,
 | 
			
		||||
	const mio_devaddr_t*  dstaddr
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
MIO_EXPORT int mio_dev_timedwrite (
 | 
			
		||||
	mio_dev_t*           dev,
 | 
			
		||||
	const void*           data,
 | 
			
		||||
	const void*          data,
 | 
			
		||||
	mio_iolen_t          len,
 | 
			
		||||
	const mio_ntime_t*   tmout,
 | 
			
		||||
	void*                 wrctx,
 | 
			
		||||
	void*                wrctx,
 | 
			
		||||
	const mio_devaddr_t* dstaddr
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
@ -639,45 +746,9 @@ MIO_EXPORT void mio_dev_halt (
 | 
			
		||||
	mio_dev_t* dev
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
/* ========================================================================= */
 | 
			
		||||
 | 
			
		||||
#define mio_inittime(x,s,ns) (((x)->sec = (s)), ((x)->nsec = (ns)))
 | 
			
		||||
#define mio_cleartime(x) mio_inittime(x,0,0)
 | 
			
		||||
#define mio_cmptime(x,y) \
 | 
			
		||||
	(((x)->sec == (y)->sec)? ((x)->nsec - (y)->nsec): \
 | 
			
		||||
	                         ((x)->sec -  (y)->sec))
 | 
			
		||||
 | 
			
		||||
/* if time has been normalized properly, nsec must be equal to or
 | 
			
		||||
 * greater than 0. */
 | 
			
		||||
#define mio_isnegtime(x) ((x)->sec < 0)
 | 
			
		||||
#define mio_ispostime(x) ((x)->sec > 0 || ((x)->sec == 0 && (x)->nsec > 0))
 | 
			
		||||
#define mio_iszerotime(x) ((x)->sec == 0 && (x)->nsec == 0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The mio_gettime() function gets the current time.
 | 
			
		||||
 */
 | 
			
		||||
MIO_EXPORT void mio_gettime (
 | 
			
		||||
	mio_ntime_t* nt
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The mio_addtime() function adds x and y and stores the result in z 
 | 
			
		||||
 */
 | 
			
		||||
MIO_EXPORT void mio_addtime (
 | 
			
		||||
	const mio_ntime_t* x,
 | 
			
		||||
	const mio_ntime_t* y,
 | 
			
		||||
	mio_ntime_t*       z
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The mio_subtime() function subtract y from x and stores the result in z.
 | 
			
		||||
 */
 | 
			
		||||
MIO_EXPORT void mio_subtime (
 | 
			
		||||
	const mio_ntime_t* x,
 | 
			
		||||
	const mio_ntime_t* y,
 | 
			
		||||
	mio_ntime_t*       z
 | 
			
		||||
);
 | 
			
		||||
/* =========================================================================
 | 
			
		||||
 * TIMER MANAGEMENT
 | 
			
		||||
 * ========================================================================= */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The mio_instmrjob() function schedules a new event.
 | 
			
		||||
@ -897,6 +968,14 @@ MIO_EXPORT mio_bch_t* mio_dupbchars (
 | 
			
		||||
	mio_oow_t        bcslen
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
/* =========================================================================
 | 
			
		||||
 * MISCELLANEOUS HELPER FUNCTIONS
 | 
			
		||||
 * ========================================================================= */
 | 
			
		||||
 | 
			
		||||
MIO_EXPORT const mio_ooch_t* mio_errnum_to_errstr (
 | 
			
		||||
	mio_errnum_t errnum
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,3 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 * $Id$
 | 
			
		||||
 *
 | 
			
		||||
    Copyright (c) 2015-2016 Chung, Hyung-Hwan. All rights reserved.
 | 
			
		||||
 | 
			
		||||
    Redistribution and use in source and binary forms, with or without
 | 
			
		||||
    modification, are permitted provided that the following conditions
 | 
			
		||||
    are met:
 | 
			
		||||
    1. Redistributions of source code must retain the above copyright
 | 
			
		||||
       notice, this list of conditions and the following disclaimer.
 | 
			
		||||
    2. Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
       documentation and/or other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
    THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
 | 
			
		||||
    IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
			
		||||
    OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 | 
			
		||||
    IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 | 
			
		||||
    INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 | 
			
		||||
    NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 | 
			
		||||
    THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* this file is included by sck-addr.c */
 | 
			
		||||
 | 
			
		||||
static int str_to_ipv4 (const char_t* str, mio_oow_t len, struct in_addr* inaddr)
 | 
			
		||||
 | 
			
		||||
@ -24,6 +24,8 @@
 | 
			
		||||
    THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "mio-prv.h"
 | 
			
		||||
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
#	include <windows.h>
 | 
			
		||||
#	include <errno.h>
 | 
			
		||||
 | 
			
		||||
@ -74,6 +74,26 @@ static mio_errnum_t errno_to_errnum (int errcode)
 | 
			
		||||
		case EIO: return MIO_EIOERR;
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	#if defined(EMFILE)
 | 
			
		||||
		case EMFILE:
 | 
			
		||||
			return MIO_EMFILE;
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	#if defined(ENFILE)
 | 
			
		||||
		case ENFILE:
 | 
			
		||||
			return MIO_ENFILE;
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	#if defined(ECONNREFUSED)
 | 
			
		||||
		case ECONNREFUSED:
 | 
			
		||||
			return MIO_ECONRF;
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	#if defined(ECONNRESETD)
 | 
			
		||||
		case ECONNRESET:
 | 
			
		||||
			return MIO_ECONRS;
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
		default: return MIO_ESYSERR;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -26,6 +26,84 @@
 | 
			
		||||
 | 
			
		||||
#include "mio-prv.h"
 | 
			
		||||
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
#	include <windows.h>
 | 
			
		||||
#	include <time.h>
 | 
			
		||||
#	include <errno.h>
 | 
			
		||||
#	include <io.h>
 | 
			
		||||
#	include <fcntl.h>
 | 
			
		||||
 | 
			
		||||
#elif defined(__OS2__)
 | 
			
		||||
#	define INCL_DOSDATETIME
 | 
			
		||||
#	include <os2.h>
 | 
			
		||||
#	include <time.h>
 | 
			
		||||
#	include <errno.h>
 | 
			
		||||
#	include <io.h>
 | 
			
		||||
#	include <fcntl.h>
 | 
			
		||||
 | 
			
		||||
#elif defined(__DOS__)
 | 
			
		||||
#	include <dos.h>
 | 
			
		||||
#	include <time.h>
 | 
			
		||||
#	include <errno.h>
 | 
			
		||||
#	include <io.h>
 | 
			
		||||
#	include <fcntl.h>
 | 
			
		||||
 | 
			
		||||
#elif defined(macintosh)
 | 
			
		||||
#	include <Types.h>
 | 
			
		||||
#	include <OSUtils.h>
 | 
			
		||||
#	include <Timer.h>
 | 
			
		||||
#	include <MacErrors.h>
 | 
			
		||||
 | 
			
		||||
	/* TODO: a lot to do */
 | 
			
		||||
 | 
			
		||||
#elif defined(vms) || defined(__vms)
 | 
			
		||||
#	define __NEW_STARLET 1
 | 
			
		||||
#	include <starlet.h> /* (SYS$...) */
 | 
			
		||||
#	include <ssdef.h> /* (SS$...) */
 | 
			
		||||
#	include <lib$routines.h> /* (lib$...) */
 | 
			
		||||
 | 
			
		||||
	/* TODO: a lot to do */
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
#	include <sys/types.h>
 | 
			
		||||
#	include <unistd.h>
 | 
			
		||||
#	include <fcntl.h>
 | 
			
		||||
#	include <errno.h>
 | 
			
		||||
 | 
			
		||||
#	if defined(HAVE_TIME_H)
 | 
			
		||||
#		include <time.h>
 | 
			
		||||
#	endif
 | 
			
		||||
#	if defined(HAVE_SYS_TIME_H)
 | 
			
		||||
#		include <sys/time.h>
 | 
			
		||||
#	endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
struct mio_sys_log_t
 | 
			
		||||
{
 | 
			
		||||
	struct
 | 
			
		||||
	{
 | 
			
		||||
		int fd;
 | 
			
		||||
		int fd_flag; /* bitwise OR'ed fo logfd_flag_t bits */
 | 
			
		||||
 | 
			
		||||
		struct
 | 
			
		||||
		{
 | 
			
		||||
			mio_bch_t buf[4096];
 | 
			
		||||
			mio_oow_t len;
 | 
			
		||||
		} out;
 | 
			
		||||
	} log;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef mio_sys_log_t xtn_t;
 | 
			
		||||
#define GET_XTN(mio) (&(mio)->sys.log)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
enum logfd_flag_t
 | 
			
		||||
{
 | 
			
		||||
	LOGFD_TTY = (1 << 0),
 | 
			
		||||
	LOGFD_OPENED_HERE = (1 << 1)
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static int write_all (int fd, const mio_bch_t* ptr, mio_oow_t len)
 | 
			
		||||
{
 | 
			
		||||
	while (len > 0)
 | 
			
		||||
@ -259,3 +337,52 @@ void mio_sys_writelog (mio_t* mio, mio_bitmask_t mask, const mio_ooch_t* msg, mi
 | 
			
		||||
 | 
			
		||||
	flush_log (mio, logfd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static MIO_INLINE void reset_log_to_default (xtn_t* xtn)
 | 
			
		||||
{
 | 
			
		||||
#if defined(ENABLE_LOG_INITIALLY)
 | 
			
		||||
	xtn->log.fd = 2;
 | 
			
		||||
	xtn->log.fd_flag = 0;
 | 
			
		||||
	#if defined(HAVE_ISATTY)
 | 
			
		||||
	if (isatty(xtn->log.fd)) xtn->log.fd_flag |= LOGFD_TTY;
 | 
			
		||||
	#endif
 | 
			
		||||
#else
 | 
			
		||||
	xtn->log.fd = -1;
 | 
			
		||||
	xtn->log.fd_flag = 0;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void mio_sys_initlog (mio_t* mio)
 | 
			
		||||
{
 | 
			
		||||
	xtn_t* xtn = GET_XTN(mio);
 | 
			
		||||
	mio_bitmask_t logmask;
 | 
			
		||||
	mio_oow_t pathlen;
 | 
			
		||||
 | 
			
		||||
/* TODO: */
 | 
			
		||||
#define LOG_FILE "/dev/stderr"
 | 
			
		||||
	xtn->log.fd = open(LOG_FILE, O_CREAT | O_WRONLY | O_APPEND , 0644);
 | 
			
		||||
	if (xtn->log.fd == -1)
 | 
			
		||||
	{
 | 
			
		||||
		/*mio_seterrbfmtwithsyserr (mio, 0, errno, "cannot open log file %hs", LOG_FILE);*/
 | 
			
		||||
		xtn->log.fd = 2;
 | 
			
		||||
		xtn->log.fd_flag = 0;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		xtn->log.fd_flag |= LOGFD_OPENED_HERE;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#if defined(HAVE_ISATTY)
 | 
			
		||||
	if (isatty(xtn->log.fd)) xtn->log.fd_flag |= LOGFD_TTY;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	logmask = MIO_LOG_ALL_TYPES | MIO_LOG_ALL_LEVELS;
 | 
			
		||||
	mio_setoption (mio, MIO_LOG_MASK, &logmask);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void mio_sys_finilog (mio_t* mio)
 | 
			
		||||
{
 | 
			
		||||
	xtn_t* xtn = GET_XTN(mio);
 | 
			
		||||
	if ((xtn->log.fd_flag & LOGFD_OPENED_HERE) && xtn->log.fd >= 0) close (xtn->log.fd);
 | 
			
		||||
	reset_log_to_default (xtn);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										377
									
								
								mio/lib/sys-mux.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										377
									
								
								mio/lib/sys-mux.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,377 @@
 | 
			
		||||
/*
 | 
			
		||||
 * $Id$
 | 
			
		||||
 *
 | 
			
		||||
    Copyright (c) 2015-2016 Chung, Hyung-Hwan. All rights reserved.
 | 
			
		||||
 | 
			
		||||
    Redistribution and use in source and binary forms, with or without
 | 
			
		||||
    modification, are permitted provided that the following conditions
 | 
			
		||||
    are met:
 | 
			
		||||
    1. Redistributions of source code must retain the above copyright
 | 
			
		||||
       notice, this list of conditions and the following disclaimer.
 | 
			
		||||
    2. Redistributions in binary form must reproduce the above copyright
 | 
			
		||||
       notice, this list of conditions and the following disclaimer in the
 | 
			
		||||
       documentation and/or other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
    THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
 | 
			
		||||
    IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WAfRRANTIES
 | 
			
		||||
    OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 | 
			
		||||
    IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 | 
			
		||||
    INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 | 
			
		||||
    NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 | 
			
		||||
    THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "mio-prv.h"
 | 
			
		||||
 | 
			
		||||
#if defined(HAVE_SYS_EPOLL_H)
 | 
			
		||||
#	include <sys/epoll.h>
 | 
			
		||||
#	define USE_EPOLL
 | 
			
		||||
#elif defined(HAVE_SYS_POLL_H)
 | 
			
		||||
#	include <sys/poll.h>
 | 
			
		||||
#	define USE_POLL
 | 
			
		||||
#else
 | 
			
		||||
#	error NO SUPPORTED MULTIPLEXER
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
/* ========================================================================= */
 | 
			
		||||
#if defined(USE_POLL)
 | 
			
		||||
 | 
			
		||||
#define MUX_INDEX_INVALID MIO_TYPE_MAX(mio_oow_t)
 | 
			
		||||
 | 
			
		||||
struct mio_sys_mux_t
 | 
			
		||||
{
 | 
			
		||||
	struct
 | 
			
		||||
	{
 | 
			
		||||
		mio_oow_t* ptr;
 | 
			
		||||
		mio_oow_t  size;
 | 
			
		||||
		mio_oow_t  capa;
 | 
			
		||||
	} map; /* handle to index */
 | 
			
		||||
 | 
			
		||||
	struct
 | 
			
		||||
	{
 | 
			
		||||
		struct pollfd* pfd;
 | 
			
		||||
		mio_dev_t** dptr;
 | 
			
		||||
		mio_oow_t size;
 | 
			
		||||
		mio_oow_t capa;
 | 
			
		||||
	} pd; /* poll data */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int mio_sys_initmux (mio_t* mio)
 | 
			
		||||
{
 | 
			
		||||
	mio_sys_mux_t* mux;
 | 
			
		||||
 | 
			
		||||
	mux = (mio_sys_mux_t*)mio_callocmem(mio, MIO_SIZEOF(*mux));
 | 
			
		||||
	if (!mux) return -1;
 | 
			
		||||
 | 
			
		||||
	mio->sys.mux = mux;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void mio_sys_finimux (mio_t* mio)
 | 
			
		||||
{
 | 
			
		||||
	if (mio->sys.mux)
 | 
			
		||||
	{
 | 
			
		||||
		mio_freemem (mio, mio->sys.mux);
 | 
			
		||||
		mio->sys.mux = MIO_NULL;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mio_sys_ctrlmux (mio_t* mio, mio_sys_mux_cmd_t cmd, mio_dev_t* dev, int dev_capa)
 | 
			
		||||
{
 | 
			
		||||
	mio_t* mio;
 | 
			
		||||
	mio_sys_mux_t* mux;
 | 
			
		||||
	mio_oow_t idx;
 | 
			
		||||
 | 
			
		||||
	mio = dev->mio;
 | 
			
		||||
	mux = (mio_sys_mux_t*)mio->sys.mux;
 | 
			
		||||
 | 
			
		||||
	if (hnd >= mux->map.capa)
 | 
			
		||||
	{
 | 
			
		||||
		mio_oow_t new_capa;
 | 
			
		||||
		mio_oow_t* tmp;
 | 
			
		||||
 | 
			
		||||
		if (cmd != MIO_SYS_MUX_CMD_INSERT)
 | 
			
		||||
		{
 | 
			
		||||
			mio->errnum = MIO_ENOENT;
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		new_capa = MIO_ALIGN_POW2((hnd + 1), 256);
 | 
			
		||||
 | 
			
		||||
		tmp = MIO_MMGR_REALLOC(mio->mmgr, mux->map.ptr, new_capa * MIO_SIZEOF(*tmp));
 | 
			
		||||
		if (!tmp)
 | 
			
		||||
		{
 | 
			
		||||
			mio->errnum = MIO_ESYSMEM;
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for (idx = mux->map.capa; idx < new_capa; idx++) 
 | 
			
		||||
			tmp[idx] = MUX_INDEX_INVALID;
 | 
			
		||||
 | 
			
		||||
		mux->map.ptr = tmp;
 | 
			
		||||
		mux->map.capa = new_capa;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	idx = mux->map.ptr[hnd];
 | 
			
		||||
	if (idx != MUX_INDEX_INVALID)
 | 
			
		||||
	{
 | 
			
		||||
		if (cmd == MIO_SYS_MUX_CMD_INSERT)
 | 
			
		||||
		{
 | 
			
		||||
			mio->errnum = MIO_EEXIST;
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		if (cmd != MIO_SYS_MUX_CMD_INSERT)
 | 
			
		||||
		{
 | 
			
		||||
			mio->errnum = MIO_ENOENT;
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch (cmd)
 | 
			
		||||
	{
 | 
			
		||||
		case MIO_SYS_MUX_CMD_INSERT:
 | 
			
		||||
 | 
			
		||||
			if (mux->pd.size >= mux->pd.capa)
 | 
			
		||||
			{
 | 
			
		||||
				mio_oow_t new_capa;
 | 
			
		||||
				struct pollfd* tmp1;
 | 
			
		||||
				mio_dev_t** tmp2;
 | 
			
		||||
 | 
			
		||||
				new_capa = MIO_ALIGN_POW2(mux->pd.size + 1, 256);
 | 
			
		||||
 | 
			
		||||
				tmp1 = MIO_MMGR_REALLOC(mio->mmgr, mux->pd.pfd, new_capa * MIO_SIZEOF(*tmp1));
 | 
			
		||||
				if (!tmp1)
 | 
			
		||||
				{
 | 
			
		||||
					mio->errnum = MIO_ESYSMEM;
 | 
			
		||||
					return -1;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				tmp2 = MIO_MMGR_REALLOC (mio->mmgr, mux->pd.dptr, new_capa * MIO_SIZEOF(*tmp2));
 | 
			
		||||
				if (!tmp2)
 | 
			
		||||
				{
 | 
			
		||||
					MIO_MMGR_FREE (mio->mmgr, tmp1);
 | 
			
		||||
					mio->errnum = MIO_ESYSMEM;
 | 
			
		||||
					return -1;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				mux->pd.pfd = tmp1;
 | 
			
		||||
				mux->pd.dptr = tmp2;
 | 
			
		||||
				mux->pd.capa = new_capa;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			idx = mux->pd.size++;
 | 
			
		||||
 | 
			
		||||
			mux->pd.pfd[idx].fd = hnd;
 | 
			
		||||
			mux->pd.pfd[idx].events = 0;
 | 
			
		||||
			if (dev_capa & MIO_DEV_CAPA_IN_WATCHED) mux->pd.pfd[idx].events |= POLLIN;
 | 
			
		||||
			if (dev_capa & MIO_DEV_CAPA_OUT_WATCHED) mux->pd.pfd[idx].events |= POLLOUT;
 | 
			
		||||
			mux->pd.pfd[idx].revents = 0;
 | 
			
		||||
			mux->pd.dptr[idx] = dev;
 | 
			
		||||
 | 
			
		||||
			mux->map.ptr[hnd] = idx;
 | 
			
		||||
 | 
			
		||||
			return 0;
 | 
			
		||||
 | 
			
		||||
		case MIO_SYS_MUX_CMD_UPDATE:
 | 
			
		||||
			MIO_ASSERT (mio, mux->pd.dptr[idx] == dev);
 | 
			
		||||
			mux->pd.pfd[idx].events = 0;
 | 
			
		||||
			if (dev_capa & MIO_DEV_CAPA_IN_WATCHED) mux->pd.pfd[idx].events |= POLLIN;
 | 
			
		||||
			if (dev_capa & MIO_DEV_CAPA_OUT_WATCHED) mux->pd.pfd[idx].events |= POLLOUT;
 | 
			
		||||
			return 0;
 | 
			
		||||
 | 
			
		||||
		case MIO_SYS_MUX_CMD_DELETE:
 | 
			
		||||
			MIO_ASSERT (mio, mux->pd.dptr[idx] == dev);
 | 
			
		||||
			mux->map.ptr[hnd] = MUX_INDEX_INVALID;
 | 
			
		||||
 | 
			
		||||
			/* TODO: speed up deletion. allow a hole in the array.
 | 
			
		||||
			 *       delay array compaction if there is a hole.
 | 
			
		||||
			 *       set fd for the hole to -1 such that poll()
 | 
			
		||||
			 *       ignores it. compact the array if another deletion 
 | 
			
		||||
			 *       is requested when there is an existing hole. */
 | 
			
		||||
			idx++;
 | 
			
		||||
			while (idx < mux->pd.size)
 | 
			
		||||
			{
 | 
			
		||||
				int fd;
 | 
			
		||||
 | 
			
		||||
				mux->pd.pfd[idx - 1] = mux->pd.pfd[idx];
 | 
			
		||||
				mux->pd.dptr[idx - 1] = mux->pd.dptr[idx];
 | 
			
		||||
 | 
			
		||||
				fd = mux->pd.pfd[idx].fd;
 | 
			
		||||
				mux->map.ptr[fd] = idx - 1;
 | 
			
		||||
 | 
			
		||||
				idx++;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			mux->pd.size--;
 | 
			
		||||
 | 
			
		||||
			return 0;
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			mio->errnum = MIO_EINVAL;
 | 
			
		||||
			return -1;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#elif defined(USE_EPOLL)
 | 
			
		||||
 | 
			
		||||
struct mio_sys_mux_t
 | 
			
		||||
{
 | 
			
		||||
	int hnd;
 | 
			
		||||
	struct epoll_event revs[100]; /* TODO: is it a good size? */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int mio_sys_initmux (mio_t* mio)
 | 
			
		||||
{
 | 
			
		||||
	mio_sys_mux_t* mux;
 | 
			
		||||
 | 
			
		||||
	mux = (mio_sys_mux_t*)mio_callocmem(mio, MIO_SIZEOF(*mux));
 | 
			
		||||
	if (!mux) return -1;
 | 
			
		||||
	
 | 
			
		||||
	mux->hnd = epoll_create (1000);
 | 
			
		||||
	if (mux->hnd == -1)
 | 
			
		||||
	{
 | 
			
		||||
		mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
		mio_freemem (mio, mux);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mio->sys.mux = mux;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void mio_sys_finimux (mio_t* mio)
 | 
			
		||||
{
 | 
			
		||||
	if (mio->sys.mux)
 | 
			
		||||
	{
 | 
			
		||||
		close (mio->sys.mux->hnd);
 | 
			
		||||
		mio_Freemem (mio, mio->sys.mux);
 | 
			
		||||
		mio->sys.mux = MIO_NULL;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int mio_sys_ctrlmux (mio_t* mio, int cmd, mio_dev_t* dev, int dev_capa)
 | 
			
		||||
{
 | 
			
		||||
	static int epoll_cmd[] = { EPOLL_CTL_ADD, EPOLL_CTL_MOD, EPOLL_CTL_DEL };
 | 
			
		||||
	struct epoll_event ev;
 | 
			
		||||
 | 
			
		||||
	MIO_ASSERT (mio, mio == dev->mio);
 | 
			
		||||
 | 
			
		||||
	ev.data.ptr = dev;
 | 
			
		||||
	ev.events = EPOLLHUP | EPOLLERR /*| EPOLLET*/;
 | 
			
		||||
 | 
			
		||||
	if (dev_capa & MIO_DEV_CAPA_IN_WATCHED) 
 | 
			
		||||
	{
 | 
			
		||||
		ev.events |= EPOLLIN;
 | 
			
		||||
	#if defined(EPOLLRDHUP)
 | 
			
		||||
		ev.events |= EPOLLRDHUP;
 | 
			
		||||
	#endif
 | 
			
		||||
		if (dev_capa & MIO_DEV_CAPA_PRI_WATCHED) ev.events |= EPOLLPRI;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (dev_capa & MIO_DEV_CAPA_OUT_WATCHED) ev.events |= EPOLLOUT;
 | 
			
		||||
 | 
			
		||||
	if (epoll_ctl(mio->sys.mux->hnd, epoll_cmd[cmd], dev->dev_mth->getsyshnd(dev), &ev) == -1)
 | 
			
		||||
	{
 | 
			
		||||
		mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static void mio_sys_waitmux (mio_t* mio)
 | 
			
		||||
{
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
/*
 | 
			
		||||
	if (GetQueuedCompletionStatusEx (mio->iocp, mio->ovls, MIO_COUNTOF(mio->ovls), &nentries, timeout, FALSE) == FALSE)
 | 
			
		||||
	{
 | 
			
		||||
		// TODO: set errnum 
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < nentries; i++)
 | 
			
		||||
	{
 | 
			
		||||
	}
 | 
			
		||||
*/
 | 
			
		||||
#elif defined(USE_POLL)
 | 
			
		||||
 | 
			
		||||
	mux = (mio_sys_mux_t*)mio->sys.mux;
 | 
			
		||||
 | 
			
		||||
	nentries = poll(mux->pd.pfd, mux->pd.size, MIO_SECNSEC_TO_MSEC(tmout.sec, tmout.nsec));
 | 
			
		||||
	if (nentries == -1)
 | 
			
		||||
	{
 | 
			
		||||
		if (errno == EINTR) return 0;
 | 
			
		||||
		mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < mux->pd.size; i++)
 | 
			
		||||
	{
 | 
			
		||||
		if (mux->pd.pfd[i].fd >= 0 && mux->pd.pfd[i].revents)
 | 
			
		||||
		{
 | 
			
		||||
			int events = 0;
 | 
			
		||||
			mio_dev_t* dev;
 | 
			
		||||
 | 
			
		||||
			dev = mux->pd.dptr[i];
 | 
			
		||||
 | 
			
		||||
			MIO_ASSERT (mio, !(mux->pd.pfd[i].revents & POLLNVAL));
 | 
			
		||||
			if (mux->pd.pfd[i].revents & POLLIN) events |= MIO_DEV_EVENT_IN;
 | 
			
		||||
			if (mux->pd.pfd[i].revents & POLLOUT) events |= MIO_DEV_EVENT_OUT;
 | 
			
		||||
			if (mux->pd.pfd[i].revents & POLLPRI) events |= MIO_DEV_EVENT_PRI;
 | 
			
		||||
			if (mux->pd.pfd[i].revents & POLLERR) events |= MIO_DEV_EVENT_ERR;
 | 
			
		||||
			if (mux->pd.pfd[i].revents & POLLHUP) events |= MIO_DEV_EVENT_HUP;
 | 
			
		||||
 | 
			
		||||
			handle_event (dev, events, 0);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#elif defined(USE_EPOLL)
 | 
			
		||||
 | 
			
		||||
	mux = (mio_sys_mux_t*)mio->sys.mux;
 | 
			
		||||
 | 
			
		||||
	nentries = epoll_wait(mux->hnd, mux->revs, MIO_COUNTOF(mux->revs), MIO_SECNSEC_TO_MSEC(tmout.sec, tmout.nsec));
 | 
			
		||||
	if (nentries == -1)
 | 
			
		||||
	{
 | 
			
		||||
		if (errno == EINTR) return 0; /* it's actually ok */
 | 
			
		||||
		/* other errors are critical - EBADF, EFAULT, EINVAL */
 | 
			
		||||
		mio_seterrwithsyserr (mio, 0, errno);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* TODO: merge events??? for the same descriptor */
 | 
			
		||||
	
 | 
			
		||||
	for (i = 0; i < nentries; i++)
 | 
			
		||||
	{
 | 
			
		||||
		int events = 0, rdhup = 0;
 | 
			
		||||
		mio_dev_t* dev;
 | 
			
		||||
 | 
			
		||||
		dev = mux->revs[i].data.ptr;
 | 
			
		||||
 | 
			
		||||
		if (mux->revs[i].events & EPOLLIN) events |= MIO_DEV_EVENT_IN;
 | 
			
		||||
		if (mux->revs[i].events & EPOLLOUT) events |= MIO_DEV_EVENT_OUT;
 | 
			
		||||
		if (mux->revs[i].events & EPOLLPRI) events |= MIO_DEV_EVENT_PRI;
 | 
			
		||||
		if (mux->revs[i].events & EPOLLERR) events |= MIO_DEV_EVENT_ERR;
 | 
			
		||||
		if (mux->revs[i].events & EPOLLHUP) events |= MIO_DEV_EVENT_HUP;
 | 
			
		||||
	#if defined(EPOLLRDHUP)
 | 
			
		||||
		else if (mux->revs[i].events & EPOLLRDHUP) rdhup = 1;
 | 
			
		||||
	#endif
 | 
			
		||||
		handle_event (dev, events, rdhup);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#	error NO SUPPORTED MULTIPLEXER
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
@ -47,13 +47,23 @@
 | 
			
		||||
#	include <errno.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define MIO_EPOCH_YEAR  (1970)
 | 
			
		||||
#define MIO_EPOCH_MON   (1)
 | 
			
		||||
#define MIO_EPOCH_DAY   (1)
 | 
			
		||||
#define MIO_EPOCH_WDAY  (4)
 | 
			
		||||
 | 
			
		||||
/* windows specific epoch time */
 | 
			
		||||
#define MIO_EPOCH_YEAR_WIN   (1601)
 | 
			
		||||
#define MIO_EPOCH_MON_WIN    (1)
 | 
			
		||||
#define MIO_EPOCH_DAY_WIN    (1)
 | 
			
		||||
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
	#define EPOCH_DIFF_YEARS (MIO_EPOCH_YEAR-MIO_EPOCH_YEAR_WIN)
 | 
			
		||||
	#define EPOCH_DIFF_DAYS  ((mio_intptr_t)EPOCH_DIFF_YEARS*365+EPOCH_DIFF_YEARS/4-3)
 | 
			
		||||
	#define EPOCH_DIFF_SECS  ((mio_intptr_t)EPOCH_DIFF_DAYS*24*60*60)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void mio_gettime (mio_ntime_t* t)
 | 
			
		||||
void mio_sys_gettime (mio_ntime_t* t)
 | 
			
		||||
{
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
	SYSTEMTIME st;
 | 
			
		||||
@ -97,7 +107,7 @@ void mio_gettime (mio_ntime_t* t)
 | 
			
		||||
	/*bt.msec = dt.hundredths * 10;*/
 | 
			
		||||
	bt.isdst = -1; /* determine dst for me */
 | 
			
		||||
 | 
			
		||||
	if (mio_timelocal (&bt, t) <= -1) 
 | 
			
		||||
	if (mio_timelocal(&bt, t) <= -1) 
 | 
			
		||||
	{
 | 
			
		||||
		t->sec = time (MIO_NULL);
 | 
			
		||||
		t->nsec = 0;
 | 
			
		||||
@ -126,7 +136,7 @@ void mio_gettime (mio_ntime_t* t)
 | 
			
		||||
	/*bt.msec = dt.hsecond * 10; */
 | 
			
		||||
	bt.isdst = -1; /* determine dst for me */
 | 
			
		||||
 | 
			
		||||
	if (mio_timelocal (&bt, t) <= -1) 
 | 
			
		||||
	if (mio_timelocal(&bt, t) <= -1) 
 | 
			
		||||
	{
 | 
			
		||||
		t->sec = time (MIO_NULL);
 | 
			
		||||
		t->nsec = 0;
 | 
			
		||||
@ -146,7 +156,7 @@ void mio_gettime (mio_ntime_t* t)
 | 
			
		||||
#elif defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_REALTIME)
 | 
			
		||||
	struct timespec ts;
 | 
			
		||||
 | 
			
		||||
	if (clock_gettime (CLOCK_REALTIME, &ts) == -1 && errno == EINVAL)
 | 
			
		||||
	if (clock_gettime(CLOCK_REALTIME, &ts) == -1 && errno == EINVAL)
 | 
			
		||||
	{
 | 
			
		||||
	#if defined(HAVE_GETTIMEOFDAY)
 | 
			
		||||
		struct timeval tv;
 | 
			
		||||
@ -173,33 +183,3 @@ void mio_gettime (mio_ntime_t* t)
 | 
			
		||||
	t->nsec = 0;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void mio_addtime (const mio_ntime_t* x, const mio_ntime_t* y, mio_ntime_t* z)
 | 
			
		||||
{
 | 
			
		||||
	MIO_ASSERT (x->nsec >= 0 && x->nsec < MIO_NSECS_PER_SEC);
 | 
			
		||||
	MIO_ASSERT (y->nsec >= 0 && y->nsec < MIO_NSECS_PER_SEC);
 | 
			
		||||
 | 
			
		||||
	z->sec = x->sec + y->sec;
 | 
			
		||||
	z->nsec = x->nsec + y->nsec;
 | 
			
		||||
 | 
			
		||||
	if (z->nsec >= MIO_NSECS_PER_SEC)
 | 
			
		||||
	{
 | 
			
		||||
		z->sec = z->sec + 1;
 | 
			
		||||
		z->nsec = z->nsec - MIO_NSECS_PER_SEC;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void mio_subtime (const mio_ntime_t* x, const mio_ntime_t* y, mio_ntime_t* z)
 | 
			
		||||
{
 | 
			
		||||
	MIO_ASSERT (x->nsec >= 0 && x->nsec < MIO_NSECS_PER_SEC);
 | 
			
		||||
	MIO_ASSERT (y->nsec >= 0 && y->nsec < MIO_NSECS_PER_SEC);
 | 
			
		||||
 | 
			
		||||
	z->sec = x->sec - y->sec;
 | 
			
		||||
	z->nsec = x->nsec - y->nsec;
 | 
			
		||||
 | 
			
		||||
	if (z->nsec < 0)
 | 
			
		||||
	{
 | 
			
		||||
		z->sec = z->sec - 1;
 | 
			
		||||
		z->nsec = z->nsec + MIO_NSECS_PER_SEC;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -31,7 +31,7 @@
 | 
			
		||||
#define HEAP_LEFT(x)   ((x) * 2 + 1)
 | 
			
		||||
#define HEAP_RIGHT(x)  ((x) * 2 + 2)
 | 
			
		||||
 | 
			
		||||
#define YOUNGER_THAN(x,y) (mio_cmptime(&(x)->when, &(y)->when) < 0)
 | 
			
		||||
#define YOUNGER_THAN(x,y) (MIO_CMP_NTIME(&(x)->when, &(y)->when) < 0)
 | 
			
		||||
 | 
			
		||||
void mio_cleartmrjobs (mio_t* mio)
 | 
			
		||||
{
 | 
			
		||||
@ -114,7 +114,7 @@ void mio_deltmrjob (mio_t* mio, mio_tmridx_t index)
 | 
			
		||||
{
 | 
			
		||||
	mio_tmrjob_t item;
 | 
			
		||||
 | 
			
		||||
	MIO_ASSERT (index < mio->tmr.size);
 | 
			
		||||
	MIO_ASSERT (mio, index < mio->tmr.size);
 | 
			
		||||
 | 
			
		||||
	item = mio->tmr.jobs[index];
 | 
			
		||||
	if (mio->tmr.jobs[index].idxptr) *mio->tmr.jobs[index].idxptr = MIO_TMRIDX_INVALID;
 | 
			
		||||
@ -137,7 +137,7 @@ mio_tmridx_t mio_instmrjob (mio_t* mio, const mio_tmrjob_t* job)
 | 
			
		||||
		mio_tmrjob_t* tmp;
 | 
			
		||||
		mio_oow_t new_capa;
 | 
			
		||||
 | 
			
		||||
		MIO_ASSERT (mio->tmr.capa >= 1);
 | 
			
		||||
		MIO_ASSERT (mio, mio->tmr.capa >= 1);
 | 
			
		||||
		new_capa = mio->tmr.capa * 2;
 | 
			
		||||
		tmp = (mio_tmrjob_t*)MIO_MMGR_REALLOC (mio->mmgr, mio->tmr.jobs, new_capa * MIO_SIZEOF(*tmp));
 | 
			
		||||
		if (tmp == MIO_NULL) 
 | 
			
		||||
@ -173,11 +173,11 @@ void mio_firetmrjobs (mio_t* mio, const mio_ntime_t* tm, mio_oow_t* firecnt)
 | 
			
		||||
 | 
			
		||||
	/* if the current time is not specified, get it from the system */
 | 
			
		||||
	if (tm) now = *tm;
 | 
			
		||||
	else mio_gettime (&now);
 | 
			
		||||
	else mio_sys_gettime (&now);
 | 
			
		||||
 | 
			
		||||
	while (mio->tmr.size > 0)
 | 
			
		||||
	{
 | 
			
		||||
		if (mio_cmptime(&mio->tmr.jobs[0].when, &now) > 0) break;
 | 
			
		||||
		if (MIO_CMP_NTIME(&mio->tmr.jobs[0].when, &now) > 0) break;
 | 
			
		||||
 | 
			
		||||
		tmrjob = mio->tmr.jobs[0]; /* copy the scheduled job */
 | 
			
		||||
		mio_deltmrjob (mio, 0); /* deschedule the job */
 | 
			
		||||
@ -202,10 +202,10 @@ int mio_gettmrtmout (mio_t* mio, const mio_ntime_t* tm, mio_ntime_t* tmout)
 | 
			
		||||
 | 
			
		||||
	/* if the current time is not specified, get it from the system */
 | 
			
		||||
	if (tm) now = *tm;
 | 
			
		||||
	else mio_gettime (&now);
 | 
			
		||||
	else mio_sys_gettime (&now);
 | 
			
		||||
 | 
			
		||||
	mio_subtime (&mio->tmr.jobs[0].when, &now, tmout);
 | 
			
		||||
	if (tmout->sec < 0) mio_cleartime (tmout);
 | 
			
		||||
	MIO_SUB_NTIME (tmout, &mio->tmr.jobs[0].when, &now);
 | 
			
		||||
	if (tmout->sec < 0) MIO_CLEAR_NTIME (tmout);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user