added aio files. some file restructuring in progress

This commit is contained in:
2016-04-27 14:57:50 +00:00
parent 632a4d7181
commit 61a6cf281f
68 changed files with 7385 additions and 143 deletions

View File

@ -1,4 +1,4 @@
SUBDIRS = cmn sys awk sed xli http
SUBDIRS = cmn sys io awk sed xli http
pkgincludedir = $(includedir)/qse

View File

@ -390,7 +390,7 @@ target_alias = @target_alias@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
SUBDIRS = cmn sys awk sed xli http
SUBDIRS = cmn sys io awk sed xli http
pkginclude_HEADERS = conf-msw.h conf-os2.h conf-dos.h conf-vms.h \
conf-mac.h conf-inf.h types.h macros.h pack1.h unpack.h \
$(am__append_1)

View File

@ -8,7 +8,6 @@ pkginclude_HEADERS = \
dir.h \
dll.h \
env.h \
fio.h \
fma.h \
fmt.h \
fs.h \
@ -25,22 +24,17 @@ pkginclude_HEADERS = \
mem.h \
nwad.h \
nwif.h \
nwio.h \
oht.h \
opt.h \
path.h \
pio.h \
pma.h \
rbt.h \
rex.h \
sck.h \
sio.h \
sll.h \
slmb.h \
str.h \
task.h \
time.h \
tio.h \
tmr.h \
tre.h \
uni.h \

View File

@ -123,14 +123,14 @@ am__can_run_installinfo = \
*) (install-info --version) >/dev/null 2>&1;; \
esac
am__pkginclude_HEADERS_DIST = alg.h chr.h cp949.h cp950.h dir.h dll.h \
env.h fio.h fma.h fmt.h fs.h gdl.h glob.h htb.h hton.h ipad.h \
lda.h main.h map.h mb8.h mbwc.h mem.h nwad.h nwif.h nwio.h \
oht.h opt.h path.h pio.h pma.h rbt.h rex.h sck.h sio.h sll.h \
slmb.h str.h task.h time.h tio.h tmr.h tre.h uni.h uri.h \
utf8.h xma.h Mmgr.hpp StdMmgr.hpp HeapMmgr.hpp Mmged.hpp \
ScopedPtr.hpp SharedPtr.hpp StrBase.hpp String.hpp Mpool.hpp \
Association.hpp LinkedList.hpp HashList.hpp HashTable.hpp \
RedBlackTree.hpp RedBlackTable.hpp Array.hpp BinaryHeap.hpp
env.h fma.h fmt.h fs.h gdl.h glob.h htb.h hton.h ipad.h lda.h \
main.h map.h mb8.h mbwc.h mem.h nwad.h nwif.h oht.h opt.h \
path.h pma.h rbt.h rex.h sck.h sll.h slmb.h str.h time.h tmr.h \
tre.h uni.h uri.h utf8.h xma.h Mmgr.hpp StdMmgr.hpp \
HeapMmgr.hpp Mmged.hpp ScopedPtr.hpp SharedPtr.hpp StrBase.hpp \
String.hpp Mpool.hpp Association.hpp LinkedList.hpp \
HashList.hpp HashTable.hpp RedBlackTree.hpp RedBlackTable.hpp \
Array.hpp BinaryHeap.hpp
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
@ -357,11 +357,10 @@ top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
pkginclude_HEADERS = alg.h chr.h cp949.h cp950.h dir.h dll.h env.h \
fio.h fma.h fmt.h fs.h gdl.h glob.h htb.h hton.h ipad.h lda.h \
main.h map.h mb8.h mbwc.h mem.h nwad.h nwif.h nwio.h oht.h \
opt.h path.h pio.h pma.h rbt.h rex.h sck.h sio.h sll.h slmb.h \
str.h task.h time.h tio.h tmr.h tre.h uni.h uri.h utf8.h xma.h \
$(am__append_1)
fma.h fmt.h fs.h gdl.h glob.h htb.h hton.h ipad.h lda.h main.h \
map.h mb8.h mbwc.h mem.h nwad.h nwif.h oht.h opt.h path.h \
pma.h rbt.h rex.h sck.h sll.h slmb.h str.h time.h tmr.h tre.h \
uni.h uri.h utf8.h xma.h $(am__append_1)
all: all-am
.SUFFIXES:

View File

@ -30,6 +30,30 @@
#include <qse/types.h>
#include <qse/macros.h>
#define QSE_CONST_SWAP16(x) \
((qse_uint16_t)((((qse_uint16_t)(x) & (qse_uint16_t)0x00ffU) << 8) | \
(((qse_uint16_t)(x) & (qse_uint16_t)0xff00U) >> 8) ))
#define QSE_CONST_SWAP32(x) \
((qse_uint32_t)((((qse_uint32_t)(x) & (qse_uint32_t)0x000000ffUL) << 24) | \
(((qse_uint32_t)(x) & (qse_uint32_t)0x0000ff00UL) << 8) | \
(((qse_uint32_t)(x) & (qse_uint32_t)0x00ff0000UL) >> 8) | \
(((qse_uint32_t)(x) & (qse_uint32_t)0xff000000UL) >> 24) ))
#if defined(QSE_ENDIAN_LITTLE)
# define QSE_CONST_NTOH16(x) QSE_CONST_SWAP16(x)
# define QSE_CONST_HTON16(x) QSE_CONST_SWAP16(x)
# define QSE_CONST_NTOH32(x) QSE_CONST_SWAP32(x)
# define QSE_CONST_HTON32(x) QSE_CONST_SWAP32(x)
#elif defined(QSE_ENDIAN_BIG)
# define QSE_CONST_NTOH16(x) (x)
# define QSE_CONST_HTON16(x) (x)
# define QSE_CONST_NTOH32(x) (x)
# define QSE_CONST_HTON32(x) (x)
#else
# error UNKNOWN ENDIAN
#endif
#if defined(__cplusplus)
extern "C" {
#endif

View File

@ -121,11 +121,17 @@ struct qse_btime_t
#define qse_inittime(x,s,ns) (((x)->sec = (s)), ((x)->nsec = (ns)))
#define qse_cleartime(x) qse_inittime(x,0,0)
/*#define qse_cleartime(x) ((x)->sec = (x)->nsec = 0)*/
#define qse_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 qse_isnegtime(x) ((x)->sec < 0)
#define qse_ispostime(x) ((x)->sec > 0 || ((x)->sec == 0 && (x)->nsec > 0))
#define qse_iszerotime(x) ((x)->sec == 0 && (x)->nsec == 0)
#if defined(__cplusplus)
extern "C" {
#endif

View File

@ -946,12 +946,18 @@
/* sizeof(socklen_t) */
#undef QSE_SIZEOF_SOCKLEN_T
/* sizeof(struct sockaddr_dl) */
#undef QSE_SIZEOF_STRUCT_SOCKADDR_DL
/* sizeof(struct sockaddr_in) */
#undef QSE_SIZEOF_STRUCT_SOCKADDR_IN
/* sizeof(struct sockaddr_in6) */
#undef QSE_SIZEOF_STRUCT_SOCKADDR_IN6
/* sizeof(struct sockaddr_ll) */
#undef QSE_SIZEOF_STRUCT_SOCKADDR_LL
/* sizeof(struct sockaddr_un) */
#undef QSE_SIZEOF_STRUCT_SOCKADDR_UN
@ -1039,12 +1045,18 @@
/* The size of `socklen_t', as computed by sizeof. */
#undef SIZEOF_SOCKLEN_T
/* The size of `struct sockaddr_dl', as computed by sizeof. */
#undef SIZEOF_STRUCT_SOCKADDR_DL
/* The size of `struct sockaddr_in', as computed by sizeof. */
#undef SIZEOF_STRUCT_SOCKADDR_IN
/* The size of `struct sockaddr_in6', as computed by sizeof. */
#undef SIZEOF_STRUCT_SOCKADDR_IN6
/* The size of `struct sockaddr_ll', as computed by sizeof. */
#undef SIZEOF_STRUCT_SOCKADDR_LL
/* The size of `struct sockaddr_un', as computed by sizeof. */
#undef SIZEOF_STRUCT_SOCKADDR_UN

View File

@ -0,0 +1,11 @@
pkgincludedir = $(includedir)/qse/io
pkginclude_HEADERS = \
aio.h \
aio-pro.h \
aio-sck.h
fio.h \
nwio.h \
pio.h \
sio.h \
tio.h

View File

@ -0,0 +1,617 @@
# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
VPATH = @srcdir@
am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
am__make_running_with_option = \
case $${target_option-} in \
?) ;; \
*) echo "am__make_running_with_option: internal error: invalid" \
"target option '$${target_option-}' specified" >&2; \
exit 1;; \
esac; \
has_opt=no; \
sane_makeflags=$$MAKEFLAGS; \
if $(am__is_gnu_make); then \
sane_makeflags=$$MFLAGS; \
else \
case $$MAKEFLAGS in \
*\\[\ \ ]*) \
bs=\\; \
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
esac; \
fi; \
skip_next=no; \
strip_trailopt () \
{ \
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
}; \
for flg in $$sane_makeflags; do \
test $$skip_next = yes && { skip_next=no; continue; }; \
case $$flg in \
*=*|--*) continue;; \
-*I) strip_trailopt 'I'; skip_next=yes;; \
-*I?*) strip_trailopt 'I';; \
-*O) strip_trailopt 'O'; skip_next=yes;; \
-*O?*) strip_trailopt 'O';; \
-*l) strip_trailopt 'l'; skip_next=yes;; \
-*l?*) strip_trailopt 'l';; \
-[dEDm]) skip_next=yes;; \
-[JT]) skip_next=yes;; \
esac; \
case $$flg in \
*$$target_option*) has_opt=yes; break;; \
esac; \
done; \
test $$has_opt = yes
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkglibexecdir = $(libexecdir)/@PACKAGE@
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
subdir = include/qse/io
DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
$(pkginclude_HEADERS)
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/argz.m4 \
$(top_srcdir)/m4/ax_check_sign.m4 \
$(top_srcdir)/m4/ax_cxx_namespace.m4 \
$(top_srcdir)/m4/ax_numval.m4 $(top_srcdir)/m4/ax_pthread.m4 \
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltdl.m4 \
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
$(top_srcdir)/m4/lx_find_mpi.m4 $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/include/qse/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@)
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
am__v_P_0 = false
am__v_P_1 = :
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
am__v_GEN_0 = @echo " GEN " $@;
am__v_GEN_1 =
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
am__v_at_1 =
SOURCES =
DIST_SOURCES =
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
*) (install-info --version) >/dev/null 2>&1;; \
esac
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
*) f=$$p;; \
esac;
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
am__install_max = 40
am__nobase_strip_setup = \
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
am__nobase_strip = \
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
am__nobase_list = $(am__nobase_strip_setup); \
for p in $$list; do echo "$$p $$p"; done | \
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
if (++n[$$2] == $(am__install_max)) \
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
END { for (dir in files) print dir, files[dir] }'
am__base_list = \
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
am__uninstall_files_from_dir = { \
test -z "$$files" \
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
$(am__cd) "$$dir" && rm -f $$files; }; \
}
am__installdirs = "$(DESTDIR)$(pkgincludedir)"
HEADERS = $(pkginclude_HEADERS)
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
# Read a list of newline-separated strings from the standard input,
# and print each of them once, without duplicates. Input order is
# *not* preserved.
am__uniquify_input = $(AWK) '\
BEGIN { nonempty = 0; } \
{ items[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in items) print i; }; } \
'
# Make sure the list of sources is unique. This is necessary because,
# e.g., the same source file might be shared among _SOURCES variables
# for different programs/libraries.
am__define_uniq_tagged_files = \
list='$(am__tagged_files)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | $(am__uniquify_input)`
ETAGS = etags
CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
pkgincludedir = $(includedir)/qse/io
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
AR = @AR@
ARGZ_H = @ARGZ_H@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
BUILD_MODE = @BUILD_MODE@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CHAR_MODE = @CHAR_MODE@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
DLLTOOL = @DLLTOOL@
DSYMUTIL = @DSYMUTIL@
DUMPBIN = @DUMPBIN@
ECHO = @ECHO@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
GREP = @GREP@
HAVE_CXX = @HAVE_CXX@
INCLTDL = @INCLTDL@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LD = @LD@
LDFLAGS = @LDFLAGS@
LIBADD_DL = @LIBADD_DL@
LIBADD_DLD_LINK = @LIBADD_DLD_LINK@
LIBADD_DLOPEN = @LIBADD_DLOPEN@
LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@
LIBLTDL = @LIBLTDL@
LIBM = @LIBM@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LIBTOOL_DEPS = @LIBTOOL_DEPS@
LIPO = @LIPO@
LN_S = @LN_S@
LTDLDEPS = @LTDLDEPS@
LTDLINCL = @LTDLINCL@
LTDLOPEN = @LTDLOPEN@
LTLIBOBJS = @LTLIBOBJS@
LT_CONFIG_H = @LT_CONFIG_H@
LT_DLLOADERS = @LT_DLLOADERS@
LT_DLPREOPEN = @LT_DLPREOPEN@
MAKEINFO = @MAKEINFO@
MANIFEST_TOOL = @MANIFEST_TOOL@
MKDIR_P = @MKDIR_P@
MPICC = @MPICC@
MPI_CFLAGS = @MPI_CFLAGS@
MPI_CLDFLAGS = @MPI_CLDFLAGS@
NM = @NM@
NMEDIT = @NMEDIT@
OBJDUMP = @OBJDUMP@
OBJEXT = @OBJEXT@
OTOOL = @OTOOL@
OTOOL64 = @OTOOL64@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
PACKAGE_VERSION_PATCH = @PACKAGE_VERSION_PATCH@
PATH_SEPARATOR = @PATH_SEPARATOR@
PTHREAD_CC = @PTHREAD_CC@
PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
PTHREAD_LIBS = @PTHREAD_LIBS@
QSE_PROJECT_AUTHOR = @QSE_PROJECT_AUTHOR@
QSE_PROJECT_URL = @QSE_PROJECT_URL@
QSE_SIZEOF_CHAR = @QSE_SIZEOF_CHAR@
QSE_SIZEOF_DOUBLE = @QSE_SIZEOF_DOUBLE@
QSE_SIZEOF_FLOAT = @QSE_SIZEOF_FLOAT@
QSE_SIZEOF_INT = @QSE_SIZEOF_INT@
QSE_SIZEOF_LONG = @QSE_SIZEOF_LONG@
QSE_SIZEOF_LONG_DOUBLE = @QSE_SIZEOF_LONG_DOUBLE@
QSE_SIZEOF_LONG_LONG = @QSE_SIZEOF_LONG_LONG@
QSE_SIZEOF_OFF64_T = @QSE_SIZEOF_OFF64_T@
QSE_SIZEOF_OFF_T = @QSE_SIZEOF_OFF_T@
QSE_SIZEOF_SHORT = @QSE_SIZEOF_SHORT@
QSE_SIZEOF_VOID_P = @QSE_SIZEOF_VOID_P@
QSE_SIZEOF_WCHAR_T = @QSE_SIZEOF_WCHAR_T@
QUADMATH_LIBS = @QUADMATH_LIBS@
RANLIB = @RANLIB@
RM = @RM@
RMDIR = @RMDIR@
SED = @SED@
SENDFILE_LIBS = @SENDFILE_LIBS@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
SOCKET_LIBS = @SOCKET_LIBS@
SSL_LIBS = @SSL_LIBS@
STRIP = @STRIP@
TRUE = @TRUE@
UCI_LIBS = @UCI_LIBS@
UNICOWS_LIBS = @UNICOWS_LIBS@
VERSION = @VERSION@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
abs_top_srcdir = @abs_top_srcdir@
ac_ct_AR = @ac_ct_AR@
ac_ct_CC = @ac_ct_CC@
ac_ct_CXX = @ac_ct_CXX@
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
docdir = @docdir@
dvidir = @dvidir@
exec_prefix = @exec_prefix@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
ltdl_LIBOBJS = @ltdl_LIBOBJS@
ltdl_LTLIBOBJS = @ltdl_LTLIBOBJS@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
pdfdir = @pdfdir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
subdirs = @subdirs@
sys_symbol_underscore = @sys_symbol_underscore@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
pkginclude_HEADERS = \
aio.h \
aio-pro.h \
aio-sck.h
all: all-am
.SUFFIXES:
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
&& { if test -f $@; then exit 0; else break; fi; }; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/qse/io/Makefile'; \
$(am__cd) $(top_srcdir) && \
$(AUTOMAKE) --foreign include/qse/io/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(top_srcdir)/configure: $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
install-pkgincludeHEADERS: $(pkginclude_HEADERS)
@$(NORMAL_INSTALL)
@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
if test -n "$$list"; then \
echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \
$(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \
fi; \
for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
echo "$$d$$p"; \
done | $(am__base_list) | \
while read files; do \
echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
$(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
done
uninstall-pkgincludeHEADERS:
@$(NORMAL_UNINSTALL)
@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir)
ID: $(am__tagged_files)
$(am__define_uniq_tagged_files); mkid -fID $$unique
tags: tags-am
TAGS: tags
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
set x; \
here=`pwd`; \
$(am__define_uniq_tagged_files); \
shift; \
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
if test $$# -gt 0; then \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
"$$@" $$unique; \
else \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
$$unique; \
fi; \
fi
ctags: ctags-am
CTAGS: ctags
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
$(am__define_uniq_tagged_files); \
test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
cscopelist: cscopelist-am
cscopelist-am: $(am__tagged_files)
list='$(am__tagged_files)'; \
case "$(srcdir)" in \
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
*) sdir=$(subdir)/$(srcdir) ;; \
esac; \
for i in $$list; do \
if test -f "$$i"; then \
echo "$(subdir)/$$i"; \
else \
echo "$$sdir/$$i"; \
fi; \
done >> $(top_builddir)/cscope.files
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
list='$(DISTFILES)'; \
dist_files=`for file in $$list; do echo $$file; done | \
sed -e "s|^$$srcdirstrip/||;t" \
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
case $$dist_files in \
*/*) $(MKDIR_P) `echo "$$dist_files" | \
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
sort -u` ;; \
esac; \
for file in $$dist_files; do \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
if test -d $$d/$$file; then \
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
if test -d "$(distdir)/$$file"; then \
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
else \
test -f "$(distdir)/$$file" \
|| cp -p $$d/$$file "$(distdir)/$$file" \
|| exit 1; \
fi; \
done
check-am: all-am
check: check-am
all-am: Makefile $(HEADERS)
installdirs:
for dir in "$(DESTDIR)$(pkgincludedir)"; do \
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
done
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-am
install-strip:
if test -z '$(STRIP)'; then \
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
install; \
else \
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
clean-generic:
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
clean-am: clean-generic clean-libtool mostlyclean-am
distclean: distclean-am
-rm -f Makefile
distclean-am: clean-am distclean-generic distclean-tags
dvi: dvi-am
dvi-am:
html: html-am
html-am:
info: info-am
info-am:
install-data-am: install-pkgincludeHEADERS
install-dvi: install-dvi-am
install-dvi-am:
install-exec-am:
install-html: install-html-am
install-html-am:
install-info: install-info-am
install-info-am:
install-man:
install-pdf: install-pdf-am
install-pdf-am:
install-ps: install-ps-am
install-ps-am:
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
pdf: pdf-am
pdf-am:
ps: ps-am
ps-am:
uninstall-am: uninstall-pkgincludeHEADERS
.MAKE: install-am install-strip
.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
clean-libtool cscopelist-am ctags ctags-am distclean \
distclean-generic distclean-libtool distclean-tags distdir dvi \
dvi-am html html-am info info-am install install-am \
install-data install-data-am install-dvi install-dvi-am \
install-exec install-exec-am install-html install-html-am \
install-info install-info-am install-man install-pdf \
install-pdf-am install-pkgincludeHEADERS install-ps \
install-ps-am install-strip installcheck installcheck-am \
installdirs maintainer-clean maintainer-clean-generic \
mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
ps ps-am tags tags-am uninstall uninstall-am \
uninstall-pkgincludeHEADERS
fio.h \
nwio.h \
pio.h \
sio.h \
tio.h
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

View File

@ -0,0 +1,164 @@
/*
* $Id$
*
Copyright (c) 2006-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.
*/
#ifndef _QSE_IO_AIO_PRO_H_
#define _QSE_IO_AIO_PRO_H_
#include <qse/io/aio.h>
enum qse_aio_dev_pro_sid_t
{
QSE_AIO_DEV_PRO_MASTER = -1,
QSE_AIO_DEV_PRO_IN = 0,
QSE_AIO_DEV_PRO_OUT = 1,
QSE_AIO_DEV_PRO_ERR = 2
};
typedef enum qse_aio_dev_pro_sid_t qse_aio_dev_pro_sid_t;
typedef struct qse_aio_dev_pro_t qse_aio_dev_pro_t;
typedef struct qse_aio_dev_pro_slave_t qse_aio_dev_pro_slave_t;
typedef int (*qse_aio_dev_pro_on_read_t) (qse_aio_dev_pro_t* dev, const void* data, qse_aio_iolen_t len, qse_aio_dev_pro_sid_t sid);
typedef int (*qse_aio_dev_pro_on_write_t) (qse_aio_dev_pro_t* dev, qse_aio_iolen_t wrlen, void* wrctx);
typedef void (*qse_aio_dev_pro_on_close_t) (qse_aio_dev_pro_t* dev, qse_aio_dev_pro_sid_t sid);
struct qse_aio_dev_pro_t
{
QSE_AIO_DEV_HEADERS;
int flags;
qse_intptr_t child_pid; /* defined to qse_intptr_t to hide pid_t */
qse_aio_dev_pro_slave_t* slave[3];
int slave_count;
qse_aio_dev_pro_on_read_t on_read;
qse_aio_dev_pro_on_write_t on_write;
qse_aio_dev_pro_on_close_t on_close;
qse_mchar_t* mcmd;
};
struct qse_aio_dev_pro_slave_t
{
QSE_AIO_DEV_HEADERS;
qse_aio_dev_pro_sid_t id;
qse_aio_syshnd_t pfd;
qse_aio_dev_pro_t* master; /* parent device */
};
enum qse_aio_dev_pro_make_flag_t
{
QSE_AIO_DEV_PRO_WRITEIN = (1 << 0),
QSE_AIO_DEV_PRO_READOUT = (1 << 1),
QSE_AIO_DEV_PRO_READERR = (1 << 2),
QSE_AIO_DEV_PRO_ERRTOOUT = (1 << 3),
QSE_AIO_DEV_PRO_OUTTOERR = (1 << 4),
QSE_AIO_DEV_PRO_INTONUL = (1 << 5),
QSE_AIO_DEV_PRO_OUTTONUL = (1 << 6),
QSE_AIO_DEV_PRO_ERRTONUL = (1 << 7),
STUO_DEV_PRO_DROPIN = (1 << 8),
STUO_DEV_PRO_DROPOUT = (1 << 9),
STUO_DEV_PRO_DROPERR = (1 << 10),
QSE_AIO_DEV_PRO_SHELL = (1 << 13),
/* perform no waitpid() on a child process upon device destruction.
* you should set this flag if your application has automatic child
* process reaping enabled. for instance, SIGCHLD is set to SIG_IGN
* on POSIX.1-2001 compliant systems */
QSE_AIO_DEV_PRO_FORGET_CHILD = (1 << 14),
QSE_AIO_DEV_PRO_FORGET_DIEHARD_CHILD = (1 << 15)
};
typedef enum qse_aio_dev_pro_make_flag_t qse_aio_dev_pro_make_flag_t;
typedef struct qse_aio_dev_pro_make_t qse_aio_dev_pro_make_t;
struct qse_aio_dev_pro_make_t
{
int flags; /**< bitwise-ORed of qse_aio_dev_pro_make_flag_t enumerators */
const void* cmd;
qse_aio_dev_pro_on_write_t on_write; /* mandatory */
qse_aio_dev_pro_on_read_t on_read; /* mandatory */
qse_aio_dev_pro_on_close_t on_close; /* optional */
};
enum qse_aio_dev_pro_ioctl_cmd_t
{
QSE_AIO_DEV_PRO_CLOSE,
QSE_AIO_DEV_PRO_KILL_CHILD
};
typedef enum qse_aio_dev_pro_ioctl_cmd_t qse_aio_dev_pro_ioctl_cmd_t;
#ifdef __cplusplus
extern "C" {
#endif
QSE_EXPORT qse_aio_dev_pro_t* qse_aio_dev_pro_make (
qse_aio_t* aio,
qse_size_t xtnsize,
const qse_aio_dev_pro_make_t* data
);
QSE_EXPORT void qse_aio_dev_pro_kill (
qse_aio_dev_pro_t* pro
);
QSE_EXPORT int qse_aio_dev_pro_write (
qse_aio_dev_pro_t* pro,
const void* data,
qse_aio_iolen_t len,
void* wrctx
);
QSE_EXPORT int qse_aio_dev_pro_timedwrite (
qse_aio_dev_pro_t* pro,
const void* data,
qse_aio_iolen_t len,
const qse_ntime_t* tmout,
void* wrctx
);
QSE_EXPORT int qse_aio_dev_pro_close (
qse_aio_dev_pro_t* pro,
qse_aio_dev_pro_sid_t sid
);
QSE_EXPORT int qse_aio_dev_pro_killchild (
qse_aio_dev_pro_t* pro
);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,598 @@
/*
* $Id$
*
Copyright (c) 2006-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.
*/
#ifndef _QSE_IO_AIO_SCK_H_
#define _QSE_IO_AIO_SCK_H_
#include <qse/io/aio.h>
/* ========================================================================= */
/* TOOD: move these to a separte file */
#define QSE_AIO_ETHHDR_PROTO_IP4 0x0800
#define QSE_AIO_ETHHDR_PROTO_ARP 0x0806
#define QSE_AIO_ETHHDR_PROTO_8021Q 0x8100 /* 802.1Q VLAN */
#define QSE_AIO_ETHHDR_PROTO_IP6 0x86DD
#define QSE_AIO_ARPHDR_OPCODE_REQUEST 1
#define QSE_AIO_ARPHDR_OPCODE_REPLY 2
#define QSE_AIO_ARPHDR_HTYPE_ETH 0x0001
#define QSE_AIO_ARPHDR_PTYPE_IP4 0x0800
#define QSE_AIO_ETHADDR_LEN 6
#define QSE_AIO_IP4ADDR_LEN 4
#define QSE_AIO_IP6ADDR_LEN 16
#if defined(__GNUC__)
# define QSE_AIO_PACKED __attribute__((__packed__))
#else
# define QSE_AIO_PACKED
# QSE_AIO_PACK_PUSH pack(push)
# QSE_AIO_PACK_PUSH pack(push)
# QSE_AIO_PACK(x) pack(x)
#endif
#if defined(__GNUC__)
/* nothing */
#else
#pragma pack(push)
#pragma pack(1)
#endif
struct QSE_AIO_PACKED qse_aio_ethaddr_t
{
qse_uint8_t v[QSE_AIO_ETHADDR_LEN];
};
typedef struct qse_aio_ethaddr_t qse_aio_ethaddr_t;
struct QSE_AIO_PACKED qse_aio_ip4addr_t
{
qse_uint8_t v[QSE_AIO_IP4ADDR_LEN];
};
typedef struct qse_aio_ip4addr_t qse_aio_ip4addr_t;
struct QSE_AIO_PACKED qse_aio_ip6addr_t
{
qse_uint8_t v[QSE_AIO_IP6ADDR_LEN];
};
typedef struct qse_aio_ip6addr_t qse_aio_ip6addr_t;
struct QSE_AIO_PACKED qse_aio_ethhdr_t
{
qse_uint8_t dest[QSE_AIO_ETHADDR_LEN];
qse_uint8_t source[QSE_AIO_ETHADDR_LEN];
qse_uint16_t proto;
};
typedef struct qse_aio_ethhdr_t qse_aio_ethhdr_t;
struct QSE_AIO_PACKED qse_aio_arphdr_t
{
qse_uint16_t htype; /* hardware type (ethernet: 0x0001) */
qse_uint16_t ptype; /* protocol type (ipv4: 0x0800) */
qse_uint8_t hlen; /* hardware address length (ethernet: 6) */
qse_uint8_t plen; /* protocol address length (ipv4 :4) */
qse_uint16_t opcode; /* operation code */
};
typedef struct qse_aio_arphdr_t qse_aio_arphdr_t;
/* arp payload for ipv4 over ethernet */
struct QSE_AIO_PACKED qse_aio_etharp_t
{
qse_uint8_t sha[QSE_AIO_ETHADDR_LEN]; /* source hardware address */
qse_uint8_t spa[QSE_AIO_IP4ADDR_LEN]; /* source protocol address */
qse_uint8_t tha[QSE_AIO_ETHADDR_LEN]; /* target hardware address */
qse_uint8_t tpa[QSE_AIO_IP4ADDR_LEN]; /* target protocol address */
};
typedef struct qse_aio_etharp_t qse_aio_etharp_t;
struct QSE_AIO_PACKED qse_aio_etharp_pkt_t
{
qse_aio_ethhdr_t ethhdr;
qse_aio_arphdr_t arphdr;
qse_aio_etharp_t arppld;
};
typedef struct qse_aio_etharp_pkt_t qse_aio_etharp_pkt_t;
struct qse_aio_iphdr_t
{
#if defined(QSE_ENDIAN_LITTLE)
qse_uint8_t ihl:4;
qse_uint8_t version:4;
#elif defined(QSE_ENDIAN_BIG)
qse_uint8_t version:4;
qse_uint8_t ihl:4;
#else
# UNSUPPORTED ENDIAN
#endif
qse_int8_t tos;
qse_int16_t tot_len;
qse_int16_t id;
qse_int16_t frag_off;
qse_int8_t ttl;
qse_int8_t protocol;
qse_int16_t check;
qse_int32_t saddr;
qse_int32_t daddr;
/*The options start here. */
};
typedef struct qse_aio_iphdr_t qse_aio_iphdr_t;
struct QSE_AIO_PACKED qse_aio_icmphdr_t
{
qse_uint8_t type; /* message type */
qse_uint8_t code; /* subcode */
qse_uint16_t checksum;
union
{
struct
{
qse_uint16_t id;
qse_uint16_t seq;
} echo;
qse_uint32_t gateway;
struct
{
qse_uint16_t frag_unused;
qse_uint16_t mtu;
} frag; /* path mut discovery */
} u;
};
typedef struct qse_aio_icmphdr_t qse_aio_icmphdr_t;
#if defined(__GNUC__)
/* nothing */
#else
#pragma pack(pop)
#endif
/* ICMP types */
#define QSE_AIO_ICMP_ECHO_REPLY 0
#define QSE_AIO_ICMP_UNREACH 3 /* destination unreachable */
#define QSE_AIO_ICMP_SOURCE_QUENCE 4
#define QSE_AIO_ICMP_REDIRECT 5
#define QSE_AIO_ICMP_ECHO_REQUEST 8
#define QSE_AIO_ICMP_TIME_EXCEEDED 11
#define QSE_AIO_ICMP_PARAM_PROBLEM 12
#define QSE_AIO_ICMP_TIMESTAMP_REQUEST 13
#define QSE_AIO_ICMP_TIMESTAMP_REPLY 14
#define QSE_AIO_ICMP_INFO_REQUEST 15
#define QSE_AIO_ICMP_INFO_REPLY 16
#define QSE_AIO_ICMP_ADDR_MASK_REQUEST 17
#define QSE_AIO_ICMP_ADDR_MASK_REPLY 18
/* Subcode for QSE_AIO_ICMP_UNREACH */
#define QSE_AIO_ICMP_UNREACH_NET 0
#define QSE_AIO_ICMP_UNREACH_HOST 1
#define QSE_AIO_ICMP_UNREACH_PROTOCOL 2
#define QSE_AIO_ICMP_UNREACH_PORT 3
#define QSE_AIO_ICMP_UNREACH_FRAG_NEEDED 4
/* Subcode for QSE_AIO_ICMP_REDIRECT */
#define QSE_AIO_ICMP_REDIRECT_NET 0
#define QSE_AIO_ICMP_REDIRECT_HOST 1
#define QSE_AIO_ICMP_REDIRECT_NETTOS 2
#define QSE_AIO_ICMP_REDIRECT_HOSTTOS 3
/* Subcode for QSE_AIO_ICMP_TIME_EXCEEDED */
#define QSE_AIO_ICMP_TIME_EXCEEDED_TTL 0
#define QSE_AIO_ICMP_TIME_EXCEEDED_FRAGTIME 1
/* ========================================================================= */
typedef int qse_aio_sckfam_t;
struct qse_aio_sckaddr_t
{
qse_aio_sckfam_t family;
qse_uint8_t data[128]; /* TODO: use the actual sockaddr size */
};
typedef struct qse_aio_sckaddr_t qse_aio_sckaddr_t;
#if (QSE_SIZEOF_SOCKLEN_T == QSE_SIZEOF_INT)
#if defined(QSE_AIO_SOCKLEN_T_IS_SIGNED)
typedef int qse_aio_scklen_t;
#else
typedef unsigned int qse_aio_scklen_t;
#endif
#elif (QSE_SIZEOF_SOCKLEN_T == QSE_SIZEOF_LONG)
#if defined(QSE_AIO_SOCKLEN_T_IS_SIGNED)
typedef long qse_aio_scklen_t;
#else
typedef unsigned long qse_aio_scklen_t;
#endif
#else
typedef int qse_aio_scklen_t;
#endif
#if defined(_WIN32)
# define QSE_AIO_IOCP_KEY 1
/*
typedef HANDLE qse_aio_syshnd_t;
typedef SOCKET qse_aio_sckhnd_t;
# define QSE_AIO_SCKHND_INVALID (INVALID_SOCKET)
*/
typedef qse_uintptr_t qse_aio_sckhnd_t;
# define QSE_AIO_SCKHND_INVALID (~(qse_aio_sck_hnd_t)0)
#else
typedef int qse_aio_sckhnd_t;
# define QSE_AIO_SCKHND_INVALID (-1)
#endif
/* ========================================================================= */
enum qse_aio_dev_sck_ioctl_cmd_t
{
QSE_AIO_DEV_SCK_BIND,
QSE_AIO_DEV_SCK_CONNECT,
QSE_AIO_DEV_SCK_LISTEN
};
typedef enum qse_aio_dev_sck_ioctl_cmd_t qse_aio_dev_sck_ioctl_cmd_t;
#define QSE_AIO_DEV_SCK_SET_PROGRESS(dev,bit) do { \
(dev)->state &= ~QSE_AIO_DEV_SCK_ALL_PROGRESS_BITS; \
(dev)->state |= (bit); \
} while(0)
#define QSE_AIO_DEV_SCK_GET_PROGRESS(dev) ((dev)->state & QSE_AIO_DEV_SCK_ALL_PROGRESS_BITS)
enum qse_aio_dev_sck_state_t
{
/* the following items(progress bits) are mutually exclusive */
QSE_AIO_DEV_SCK_CONNECTING = (1 << 0),
QSE_AIO_DEV_SCK_CONNECTING_SSL = (1 << 1),
QSE_AIO_DEV_SCK_CONNECTED = (1 << 2),
QSE_AIO_DEV_SCK_LISTENING = (1 << 3),
QSE_AIO_DEV_SCK_ACCEPTING_SSL = (1 << 4),
QSE_AIO_DEV_SCK_ACCEPTED = (1 << 5),
/* the following items can be bitwise-ORed with an exclusive item above */
QSE_AIO_DEV_SCK_INTERCEPTED = (1 << 15),
/* convenience bit masks */
QSE_AIO_DEV_SCK_ALL_PROGRESS_BITS = (QSE_AIO_DEV_SCK_CONNECTING |
QSE_AIO_DEV_SCK_CONNECTING_SSL |
QSE_AIO_DEV_SCK_CONNECTED |
QSE_AIO_DEV_SCK_LISTENING |
QSE_AIO_DEV_SCK_ACCEPTING_SSL |
QSE_AIO_DEV_SCK_ACCEPTED)
};
typedef enum qse_aio_dev_sck_state_t qse_aio_dev_sck_state_t;
typedef struct qse_aio_dev_sck_t qse_aio_dev_sck_t;
typedef int (*qse_aio_dev_sck_on_read_t) (
qse_aio_dev_sck_t* dev,
const void* data,
qse_aio_iolen_t dlen,
const qse_aio_sckaddr_t* srcaddr
);
typedef int (*qse_aio_dev_sck_on_write_t) (
qse_aio_dev_sck_t* dev,
qse_aio_iolen_t wrlen,
void* wrctx,
const qse_aio_sckaddr_t* dstaddr
);
typedef void (*qse_aio_dev_sck_on_disconnect_t) (
qse_aio_dev_sck_t* dev
);
typedef int (*qse_aio_dev_sck_on_connect_t) (
qse_aio_dev_sck_t* dev
);
enum qse_aio_dev_sck_type_t
{
QSE_AIO_DEV_SCK_TCP4,
QSE_AIO_DEV_SCK_TCP6,
QSE_AIO_DEV_SCK_UPD4,
QSE_AIO_DEV_SCK_UDP6,
/* ARP at the ethernet layer */
QSE_AIO_DEV_SCK_ARP,
QSE_AIO_DEV_SCK_ARP_DGRAM,
/* ICMP at the IPv4 layer */
QSE_AIO_DEV_SCK_ICMP4,
/* ICMP at the IPv6 layer */
QSE_AIO_DEV_SCK_ICMP6
#if 0
QSE_AIO_DEV_SCK_RAW, /* raw L2-level packet */
#endif
};
typedef enum qse_aio_dev_sck_type_t qse_aio_dev_sck_type_t;
typedef struct qse_aio_dev_sck_make_t qse_aio_dev_sck_make_t;
struct qse_aio_dev_sck_make_t
{
qse_aio_dev_sck_type_t type;
qse_aio_dev_sck_on_write_t on_write;
qse_aio_dev_sck_on_read_t on_read;
qse_aio_dev_sck_on_disconnect_t on_disconnect;
};
enum qse_aio_dev_sck_bind_option_t
{
QSE_AIO_DEV_SCK_BIND_BROADCAST = (1 << 0),
QSE_AIO_DEV_SCK_BIND_REUSEADDR = (1 << 1),
QSE_AIO_DEV_SCK_BIND_REUSEPORT = (1 << 2),
QSE_AIO_DEV_SCK_BIND_TRANSPARENT = (1 << 3),
/* TODO: more options --- SO_RCVBUF, SO_SNDBUF, SO_RCVTIMEO, SO_SNDTIMEO, SO_KEEPALIVE */
/* BINDTODEVICE??? */
QSE_AIO_DEV_SCK_BIND_SSL = (1 << 15)
};
typedef enum qse_aio_dev_sck_bind_option_t qse_aio_dev_sck_bind_option_t;
typedef struct qse_aio_dev_sck_bind_t qse_aio_dev_sck_bind_t;
struct qse_aio_dev_sck_bind_t
{
int options;
qse_aio_sckaddr_t localaddr;
/* TODO: add device name for BIND_TO_DEVICE */
const qse_mchar_t* ssl_certfile;
const qse_mchar_t* ssl_keyfile;
qse_ntime_t accept_tmout;
};
enum qse_aio_def_sck_connect_option_t
{
QSE_AIO_DEV_SCK_CONNECT_SSL = (1 << 15)
};
typedef enum qse_aio_dev_sck_connect_option_t qse_aio_dev_sck_connect_option_t;
typedef struct qse_aio_dev_sck_connect_t qse_aio_dev_sck_connect_t;
struct qse_aio_dev_sck_connect_t
{
int options;
qse_aio_sckaddr_t remoteaddr;
qse_ntime_t connect_tmout;
qse_aio_dev_sck_on_connect_t on_connect;
};
typedef struct qse_aio_dev_sck_listen_t qse_aio_dev_sck_listen_t;
struct qse_aio_dev_sck_listen_t
{
int backlogs;
qse_aio_dev_sck_on_connect_t on_connect; /* optional, but new connections are dropped immediately without this */
};
typedef struct qse_aio_dev_sck_accept_t qse_aio_dev_sck_accept_t;
struct qse_aio_dev_sck_accept_t
{
qse_aio_syshnd_t sck;
/* TODO: add timeout */
qse_aio_sckaddr_t remoteaddr;
};
struct qse_aio_dev_sck_t
{
QSE_AIO_DEV_HEADERS;
qse_aio_dev_sck_type_t type;
qse_aio_sckhnd_t sck;
int state;
/* remote peer address for a stateful stream socket. valid if one of the
* followings is set in state:
* QSE_AIO_DEV_TCP_ACCEPTING_SSL
* QSE_AIO_DEV_TCP_ACCEPTED
* QSE_AIO_DEV_TCP_CONNECTED
* QSE_AIO_DEV_TCP_CONNECTING
* QSE_AIO_DEV_TCP_CONNECTING_SSL
*
* also used as a placeholder to store source address for
* a stateless socket */
qse_aio_sckaddr_t remoteaddr;
/* local socket address */
qse_aio_sckaddr_t localaddr;
/* original destination address */
qse_aio_sckaddr_t orgdstaddr;
qse_aio_dev_sck_on_write_t on_write;
qse_aio_dev_sck_on_read_t on_read;
/* return 0 on succes, -1 on failure.
* called on a new tcp device for an accepted client or
* on a tcp device conntected to a remote server */
qse_aio_dev_sck_on_connect_t on_connect;
qse_aio_dev_sck_on_disconnect_t on_disconnect;
/* timer job index for handling
* - connect() timeout for a connecting socket.
* - SSL_accept() timeout for a socket accepting SSL */
qse_aio_tmridx_t tmrjob_index;
/* connect timeout, ssl-connect timeout, ssl-accept timeout.
* it denotes timeout duration under some circumstances
* or an absolute expiry time under some other circumstances. */
qse_ntime_t tmout;
void* ssl_ctx;
void* ssl;
};
#ifdef __cplusplus
extern "C" {
#endif
QSE_EXPORT qse_aio_sckhnd_t qse_aio_openasyncsck (
qse_aio_t* aio,
int domain,
int type,
int proto
);
QSE_EXPORT void qse_aio_closeasyncsck (
qse_aio_t* aio,
qse_aio_sckhnd_t sck
);
QSE_EXPORT int qse_aio_makesckasync (
qse_aio_t* aio,
qse_aio_sckhnd_t sck
);
QSE_EXPORT int qse_aio_getsckaddrinfo (
qse_aio_t* aio,
const qse_aio_sckaddr_t* addr,
qse_aio_scklen_t* len,
qse_aio_sckfam_t* family
);
/*
* The qse_aio_getsckaddrport() function returns the port number of a socket
* address in the host byte order. If the address doesn't support the port
* number, it returns 0.
*/
QSE_EXPORT qse_uint16_t qse_aio_getsckaddrport (
const qse_aio_sckaddr_t* addr
);
/*
* The qse_aio_getsckaddrifindex() function returns an interface number.
* If the address doesn't support the interface number, it returns 0. */
QSE_EXPORT int qse_aio_getsckaddrifindex (
const qse_aio_sckaddr_t* addr
);
QSE_EXPORT void qse_aio_sckaddr_initforip4 (
qse_aio_sckaddr_t* sckaddr,
qse_uint16_t port,
qse_aio_ip4addr_t* ip4addr
);
QSE_EXPORT void qse_aio_sckaddr_initforip6 (
qse_aio_sckaddr_t* sckaddr,
qse_uint16_t port,
qse_aio_ip6addr_t* ip6addr
);
QSE_EXPORT void qse_aio_sckaddr_initforeth (
qse_aio_sckaddr_t* sckaddr,
int ifindex,
qse_aio_ethaddr_t* ethaddr
);
/* ========================================================================= */
QSE_EXPORT qse_aio_dev_sck_t* qse_aio_dev_sck_make (
qse_aio_t* aio,
qse_size_t xtnsize,
const qse_aio_dev_sck_make_t* info
);
QSE_EXPORT int qse_aio_dev_sck_bind (
qse_aio_dev_sck_t* dev,
qse_aio_dev_sck_bind_t* info
);
QSE_EXPORT int qse_aio_dev_sck_connect (
qse_aio_dev_sck_t* dev,
qse_aio_dev_sck_connect_t* info
);
QSE_EXPORT int qse_aio_dev_sck_listen (
qse_aio_dev_sck_t* dev,
qse_aio_dev_sck_listen_t* info
);
QSE_EXPORT int qse_aio_dev_sck_write (
qse_aio_dev_sck_t* dev,
const void* data,
qse_aio_iolen_t len,
void* wrctx,
const qse_aio_sckaddr_t* dstaddr
);
QSE_EXPORT int qse_aio_dev_sck_timedwrite (
qse_aio_dev_sck_t* dev,
const void* data,
qse_aio_iolen_t len,
const qse_ntime_t* tmout,
void* wrctx,
const qse_aio_sckaddr_t* dstaddr
);
#if defined(QSE_AIO_HAVE_INLINE)
static QSE_INLINE void qse_aio_dev_sck_halt (qse_aio_dev_sck_t* sck)
{
qse_aio_dev_halt ((qse_aio_dev_t*)sck);
}
static QSE_INLINE int qse_aio_dev_sck_read (qse_aio_dev_sck_t* sck, int enabled)
{
return qse_aio_dev_read ((qse_aio_dev_t*)sck, enabled);
}
#else
#define qse_aio_dev_sck_halt(sck) qse_aio_dev_halt((qse_aio_dev_t*)sck)
#define qse_aio_dev_sck_read(sck,enabled) qse_aio_dev_read((qse_aio_dev_t*)sck, enabled)
#endif
QSE_EXPORT qse_uint16_t qse_aio_checksumip (
const void* hdr,
qse_size_t len
);
#ifdef __cplusplus
}
#endif
#endif

438
qse/include/qse/io/aio.h Normal file
View File

@ -0,0 +1,438 @@
/*
* $Id$
*
Copyright (c) 2006-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.
*/
#ifndef _QSE_IO_AIO_H_
#define _QSE_IO_AIO_H_
#include <qse/types.h>
#include <qse/macros.h>
#include <qse/cmn/time.h>
#if defined(_WIN32)
typedef qse_uintptr_t qse_aio_syshnd_t;
#define QSE_AIO_SYSHND_INVALID (~(qse_uintptr_t)0)
#else
typedef int qse_aio_syshnd_t;
#define QSE_AIO_SYSHND_INVALID (-1)
#endif
typedef struct qse_aio_devaddr_t qse_aio_devaddr_t;
struct qse_aio_devaddr_t
{
int len;
void* ptr;
};
/* ========================================================================= */
typedef struct qse_aio_t qse_aio_t;
typedef struct qse_aio_dev_t qse_aio_dev_t;
typedef struct qse_aio_dev_mth_t qse_aio_dev_mth_t;
typedef struct qse_aio_dev_evcb_t qse_aio_dev_evcb_t;
typedef struct qse_aio_wq_t qse_aio_wq_t;
typedef qse_intptr_t qse_aio_iolen_t; /* NOTE: this is a signed type */
enum qse_aio_errnum_t
{
QSE_AIO_ENOERR,
QSE_AIO_ENOIMPL,
QSE_AIO_ESYSERR,
QSE_AIO_EINTERN,
QSE_AIO_ENOMEM,
QSE_AIO_EINVAL,
QSE_AIO_EEXIST,
QSE_AIO_ENOENT,
QSE_AIO_ENOSUP, /* not supported */
QSE_AIO_EMFILE, /* too many open files */
QSE_AIO_ENFILE,
QSE_AIO_EAGAIN,
QSE_AIO_ECONRF, /* connection refused */
QSE_AIO_ECONRS, /* connection reset */
QSE_AIO_ENOCAPA, /* no capability */
QSE_AIO_ETMOUT, /* timed out */
QSE_AIO_EPERM, /* operation not permitted */
QSE_AIO_EDEVMAKE,
QSE_AIO_EDEVERR,
QSE_AIO_EDEVHUP
};
typedef enum qse_aio_errnum_t qse_aio_errnum_t;
enum qse_aio_stopreq_t
{
QSE_AIO_STOPREQ_NONE = 0,
QSE_AIO_STOPREQ_TERMINATION,
QSE_AIO_STOPREQ_WATCHER_ERROR
};
typedef enum qse_aio_stopreq_t qse_aio_stopreq_t;
/* ========================================================================= */
#define QSE_AIO_TMRIDX_INVALID ((qse_aio_tmridx_t)-1)
typedef qse_size_t qse_aio_tmridx_t;
typedef struct qse_aio_tmrjob_t qse_aio_tmrjob_t;
typedef void (*qse_aio_tmrjob_handler_t) (
qse_aio_t* aio,
const qse_ntime_t* now,
qse_aio_tmrjob_t* tmrjob
);
struct qse_aio_tmrjob_t
{
void* ctx;
qse_ntime_t when;
qse_aio_tmrjob_handler_t handler;
qse_aio_tmridx_t* idxptr; /* pointer to the index holder */
};
/* ========================================================================= */
struct qse_aio_dev_mth_t
{
/* ------------------------------------------------------------------ */
/* mandatory. called in qse_aio_makedev() */
int (*make) (qse_aio_dev_t* dev, void* ctx);
/* ------------------------------------------------------------------ */
/* mandatory. called in qse_aio_killdev(). also called in qse_aio_makedev() upon
* failure after make() success.
*
* when 'force' is 0, the return value of -1 causes the device to be a
* zombie. the kill method is called periodically on a zombie device
* until the method returns 0.
*
* when 'force' is 1, the called should not return -1. If it does, the
* method is called once more only with the 'force' value of 2.
*
* when 'force' is 2, the device is destroyed regardless of the return value.
*/
int (*kill) (qse_aio_dev_t* dev, int force);
/* ------------------------------------------------------------------ */
qse_aio_syshnd_t (*getsyshnd) (qse_aio_dev_t* dev); /* mandatory. called in qse_aio_makedev() after successful make() */
/* ------------------------------------------------------------------ */
/* return -1 on failure, 0 if no data is availble, 1 otherwise.
* when returning 1, *len must be sent to the length of data read.
* if *len is set to 0, it's treated as EOF. */
int (*read) (qse_aio_dev_t* dev, void* data, qse_aio_iolen_t* len, qse_aio_devaddr_t* srcaddr);
/* ------------------------------------------------------------------ */
int (*write) (qse_aio_dev_t* dev, const void* data, qse_aio_iolen_t* len, const qse_aio_devaddr_t* dstaddr);
/* ------------------------------------------------------------------ */
int (*ioctl) (qse_aio_dev_t* dev, int cmd, void* arg);
};
struct qse_aio_dev_evcb_t
{
/* return -1 on failure. 0 or 1 on success.
* when 0 is returned, it doesn't attempt to perform actual I/O.
* when 1 is returned, it attempts to perform actual I/O. */
int (*ready) (qse_aio_dev_t* dev, int events);
/* return -1 on failure, 0 or 1 on success.
* when 0 is returned, the main loop stops the attempt to read more data.
* when 1 is returned, the main loop attempts to read more data without*/
int (*on_read) (qse_aio_dev_t* dev, const void* data, qse_aio_iolen_t len, const qse_aio_devaddr_t* srcaddr);
/* return -1 on failure, 0 on success.
* wrlen is the length of data written. it is the length of the originally
* posted writing request for a stream device. For a non stream device, it
* may be shorter than the originally posted length. */
int (*on_write) (qse_aio_dev_t* dev, qse_aio_iolen_t wrlen, void* wrctx, const qse_aio_devaddr_t* dstaddr);
};
struct qse_aio_wq_t
{
qse_aio_wq_t* next;
qse_aio_wq_t* prev;
qse_aio_iolen_t olen; /* original data length */
qse_uint8_t* ptr; /* pointer to data */
qse_aio_iolen_t len; /* remaining data length */
void* ctx;
qse_aio_dev_t* dev; /* back-pointer to the device */
qse_aio_tmridx_t tmridx;
qse_aio_devaddr_t dstaddr;
};
#define QSE_AIO_WQ_INIT(wq) ((wq)->next = (wq)->prev = (wq))
#define QSE_AIO_WQ_TAIL(wq) ((wq)->prev)
#define QSE_AIO_WQ_HEAD(wq) ((wq)->next)
#define QSE_AIO_WQ_ISEMPTY(wq) (QSE_AIO_WQ_HEAD(wq) == (wq))
#define QSE_AIO_WQ_ISNODE(wq,x) ((wq) != (x))
#define QSE_AIO_WQ_ISHEAD(wq,x) (QSE_AIO_WQ_HEAD(wq) == (x))
#define QSE_AIO_WQ_ISTAIL(wq,x) (QSE_AIO_WQ_TAIL(wq) == (x))
#define QSE_AIO_WQ_NEXT(x) ((x)->next)
#define QSE_AIO_WQ_PREV(x) ((x)->prev)
#define QSE_AIO_WQ_LINK(p,x,n) do { \
qse_aio_wq_t* pp = (p), * nn = (n); \
(x)->prev = (p); \
(x)->next = (n); \
nn->prev = (x); \
pp->next = (x); \
} while (0)
#define QSE_AIO_WQ_UNLINK(x) do { \
qse_aio_wq_t* pp = (x)->prev, * nn = (x)->next; \
nn->prev = pp; pp->next = nn; \
} while (0)
#define QSE_AIO_WQ_REPL(o,n) do { \
qse_aio_wq_t* oo = (o), * nn = (n); \
nn->next = oo->next; \
nn->next->prev = nn; \
nn->prev = oo->prev; \
nn->prev->next = nn; \
} while (0)
/* insert an item at the back of the queue */
/*#define QSE_AIO_WQ_ENQ(wq,x) QSE_AIO_WQ_LINK(QSE_AIO_WQ_TAIL(wq), x, QSE_AIO_WQ_TAIL(wq)->next)*/
#define QSE_AIO_WQ_ENQ(wq,x) QSE_AIO_WQ_LINK(QSE_AIO_WQ_TAIL(wq), x, wq)
/* remove an item in the front from the queue */
#define QSE_AIO_WQ_DEQ(wq) QSE_AIO_WQ_UNLINK(QSE_AIO_WQ_HEAD(wq))
#define QSE_AIO_DEV_HEADERS \
qse_aio_t* aio; \
qse_size_t dev_size; \
int dev_capa; \
qse_aio_dev_mth_t* dev_mth; \
qse_aio_dev_evcb_t* dev_evcb; \
qse_aio_wq_t wq; \
qse_aio_dev_t* dev_prev; \
qse_aio_dev_t* dev_next
struct qse_aio_dev_t
{
QSE_AIO_DEV_HEADERS;
};
enum qse_aio_dev_capa_t
{
QSE_AIO_DEV_CAPA_VIRTUAL = (1 << 0),
QSE_AIO_DEV_CAPA_IN = (1 << 1),
QSE_AIO_DEV_CAPA_OUT = (1 << 2),
/* #QSE_AIO_DEV_CAPA_PRI is meaningful only if #QSE_AIO_DEV_CAPA_IN is set */
QSE_AIO_DEV_CAPA_PRI = (1 << 3),
QSE_AIO_DEV_CAPA_STREAM = (1 << 4),
QSE_AIO_DEV_CAPA_OUT_QUEUED = (1 << 5),
/* internal use only. never set this bit to the dev_capa field */
QSE_AIO_DEV_CAPA_IN_DISABLED = (1 << 9),
QSE_AIO_DEV_CAPA_IN_CLOSED = (1 << 10),
QSE_AIO_DEV_CAPA_OUT_CLOSED = (1 << 11),
QSE_AIO_DEV_CAPA_IN_WATCHED = (1 << 12),
QSE_AIO_DEV_CAPA_OUT_WATCHED = (1 << 13),
QSE_AIO_DEV_CAPA_PRI_WATCHED = (1 << 14), /**< can be set only if QSE_AIO_DEV_CAPA_IN_WATCHED is set */
QSE_AIO_DEV_CAPA_ACTIVE = (1 << 15),
QSE_AIO_DEV_CAPA_HALTED = (1 << 16),
QSE_AIO_DEV_CAPA_ZOMBIE = (1 << 17)
};
typedef enum qse_aio_dev_capa_t qse_aio_dev_capa_t;
enum qse_aio_dev_watch_cmd_t
{
QSE_AIO_DEV_WATCH_START,
QSE_AIO_DEV_WATCH_UPDATE,
QSE_AIO_DEV_WATCH_RENEW, /* automatic update */
QSE_AIO_DEV_WATCH_STOP
};
typedef enum qse_aio_dev_watch_cmd_t qse_aio_dev_watch_cmd_t;
enum qse_aio_dev_event_t
{
QSE_AIO_DEV_EVENT_IN = (1 << 0),
QSE_AIO_DEV_EVENT_OUT = (1 << 1),
QSE_AIO_DEV_EVENT_PRI = (1 << 2),
QSE_AIO_DEV_EVENT_HUP = (1 << 3),
QSE_AIO_DEV_EVENT_ERR = (1 << 4)
};
typedef enum qse_aio_dev_event_t qse_aio_dev_event_t;
/* ========================================================================= */
#ifdef __cplusplus
extern "C" {
#endif
QSE_EXPORT qse_aio_t* qse_aio_open (
qse_mmgr_t* mmgr,
qse_size_t xtnsize,
qse_size_t tmrcapa, /**< initial timer capacity */
qse_aio_errnum_t* errnum
);
QSE_EXPORT void qse_aio_close (
qse_aio_t* aio
);
QSE_EXPORT int qse_aio_init (
qse_aio_t* aio,
qse_mmgr_t* mmgr,
qse_size_t tmrcapa
);
QSE_EXPORT void qse_aio_fini (
qse_aio_t* aio
);
QSE_EXPORT int qse_aio_exec (
qse_aio_t* aio
);
QSE_EXPORT int qse_aio_loop (
qse_aio_t* aio
);
QSE_EXPORT void qse_aio_stop (
qse_aio_t* aio,
qse_aio_stopreq_t stopreq
);
QSE_EXPORT qse_aio_dev_t* qse_aio_makedev (
qse_aio_t* aio,
qse_size_t dev_size,
qse_aio_dev_mth_t* dev_mth,
qse_aio_dev_evcb_t* dev_evcb,
void* make_ctx
);
QSE_EXPORT void qse_aio_killdev (
qse_aio_t* aio,
qse_aio_dev_t* dev
);
QSE_EXPORT int qse_aio_dev_ioctl (
qse_aio_dev_t* dev,
int cmd,
void* arg
);
QSE_EXPORT int qse_aio_dev_watch (
qse_aio_dev_t* dev,
qse_aio_dev_watch_cmd_t cmd,
/** 0 or bitwise-ORed of #QSE_AIO_DEV_EVENT_IN and #QSE_AIO_DEV_EVENT_OUT */
int events
);
QSE_EXPORT int qse_aio_dev_read (
qse_aio_dev_t* dev,
int enabled
);
/**
* The qse_aio_dev_write() function posts a writing request.
* It attempts to write data immediately if there is no pending requests.
* If writing fails, it returns -1. If writing succeeds, it calls the
* on_write callback. If the callback fails, it returns -1. If the callback
* succeeds, it returns 1. If no immediate writing is possible, the request
* is enqueued to a pending request list. If enqueing gets successful,
* it returns 0. otherwise it returns -1.
*/
QSE_EXPORT int qse_aio_dev_write (
qse_aio_dev_t* dev,
const void* data,
qse_aio_iolen_t len,
void* wrctx,
const qse_aio_devaddr_t* dstaddr
);
QSE_EXPORT int qse_aio_dev_timedwrite (
qse_aio_dev_t* dev,
const void* data,
qse_aio_iolen_t len,
const qse_ntime_t* tmout,
void* wrctx,
const qse_aio_devaddr_t* dstaddr
);
QSE_EXPORT void qse_aio_dev_halt (
qse_aio_dev_t* dev
);
/**
* The qse_aio_instmrjob() function schedules a new event.
*
* \return #QSE_AIO_TMRIDX_INVALID on failure, valid index on success.
*/
QSE_EXPORT qse_aio_tmridx_t qse_aio_instmrjob (
qse_aio_t* aio,
const qse_aio_tmrjob_t* job
);
QSE_EXPORT qse_aio_tmridx_t qse_aio_updtmrjob (
qse_aio_t* aio,
qse_aio_tmridx_t index,
const qse_aio_tmrjob_t* job
);
QSE_EXPORT void qse_aio_deltmrjob (
qse_aio_t* aio,
qse_aio_tmridx_t index
);
/**
* The qse_aio_gettmrjob() function returns the
* pointer to the registered event at the given index.
*/
QSE_EXPORT qse_aio_tmrjob_t* qse_aio_gettmrjob (
qse_aio_t* aio,
qse_aio_tmridx_t index
);
QSE_EXPORT int qse_aio_gettmrjobdeadline (
qse_aio_t* aio,
qse_aio_tmridx_t index,
qse_ntime_t* deadline
);
/* ========================================================================= */
#ifdef __cplusplus
}
#endif
#endif

View File

@ -33,7 +33,7 @@
#include <qse/types.h>
#include <qse/macros.h>
#include <qse/cmn/tio.h>
#include <qse/io/tio.h>
#include <qse/cmn/nwad.h>
#include <qse/cmn/time.h>
#include <qse/cmn/sck.h>

View File

@ -29,7 +29,7 @@
#include <qse/types.h>
#include <qse/macros.h>
#include <qse/cmn/tio.h>
#include <qse/io/tio.h>
#include <qse/cmn/env.h>
/** \file

View File

@ -33,8 +33,8 @@
#include <qse/types.h>
#include <qse/macros.h>
#include <qse/cmn/fio.h>
#include <qse/cmn/tio.h>
#include <qse/io/fio.h>
#include <qse/io/tio.h>
#include <stdarg.h>
enum qse_sio_flag_t

View File

@ -28,7 +28,7 @@
#define _QSE_SED_STDSED_H_
#include <qse/sed/sed.h>
#include <qse/cmn/sio.h>
#include <qse/io/sio.h>
/** \file
* This file defines easier-to-use helper interface for a stream editor.

View File

@ -6,6 +6,7 @@ pkginclude_HEADERS = \
mtx.h \
mux.h \
rwl.h \
task.h \
thr.h
if ENABLE_CXX

View File

@ -118,8 +118,8 @@ am__can_run_installinfo = \
n|no|NO) false;; \
*) (install-info --version) >/dev/null 2>&1;; \
esac
am__pkginclude_HEADERS_DIST = cnd.h intr.h mtx.h mux.h rwl.h thr.h \
SocketAddress.hpp Socket.hpp
am__pkginclude_HEADERS_DIST = cnd.h intr.h mtx.h mux.h rwl.h task.h \
thr.h SocketAddress.hpp Socket.hpp
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
@ -345,7 +345,7 @@ target_alias = @target_alias@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
pkginclude_HEADERS = cnd.h intr.h mtx.h mux.h rwl.h thr.h \
pkginclude_HEADERS = cnd.h intr.h mtx.h mux.h rwl.h task.h thr.h \
$(am__append_1)
all: all-am

View File

@ -28,7 +28,7 @@
#define _QSE_XLI_STDXLI_H_
#include <qse/xli/xli.h>
#include <qse/cmn/sio.h>
#include <qse/io/sio.h>
/** \file
* This file provides easier interface to a qse_xli_t object.