diff --git a/mio/configure b/mio/configure index 4ed0c5d..227626c 100755 --- a/mio/configure +++ b/mio/configure @@ -20136,6 +20136,7 @@ cat >>confdefs.h <<_ACEOF _ACEOF + # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. @@ -20172,7 +20173,6 @@ cat >>confdefs.h <<_ACEOF _ACEOF - if test ${ac_cv_sizeof_socklen_t} -gt 0 then @@ -20215,6 +20215,104 @@ $as_echo "#define MIO_SOCKLEN_T_IS_SIGNED 1" >>confdefs.h fi fi + + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of sa_family_t" >&5 +$as_echo_n "checking size of sa_family_t... " >&6; } +if ${ac_cv_sizeof_sa_family_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (sa_family_t))" "ac_cv_sizeof_sa_family_t" " + #include + #include +"; then : + +else + if test "$ac_cv_type_sa_family_t" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (sa_family_t) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_sa_family_t=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_sa_family_t" >&5 +$as_echo "$ac_cv_sizeof_sa_family_t" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_SA_FAMILY_T $ac_cv_sizeof_sa_family_t +_ACEOF + + + if test ${ac_cv_sizeof_sa_family_t} -gt 0 + then + + typename=`echo sa_family_t | sed "s/[^a-zA-Z0-9_]/_/g"` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sa_family_t is signed" >&5 +$as_echo_n "checking whether sa_family_t is signed... " >&6; } +if eval \${ax_cv_decl_${typename}_signed+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include +int +main () +{ + int foo [ 1 - 2 * !(((sa_family_t) -1) < 0) ] + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "ax_cv_decl_${typename}_signed=\"yes\"" +else + eval "ax_cv_decl_${typename}_signed=\"no\"" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$ax_cv_decl_${typename}_signed + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + symbolname=`echo sa_family_t | sed "s/[^a-zA-Z0-9_]/_/g" | tr "a-z" "A-Z"` + if eval "test \"\${ax_cv_decl_${typename}_signed}\" = \"yes\""; then + +$as_echo "#define MIO_SA_FAMILY_T_IS_SIGNED 1" >>confdefs.h + + elif eval "test \"\${ax_cv_decl_${typename}_signed}\" = \"no\""; then + $as_echo_n "" + fi + + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking offset of sa_family in struct sockaddr" >&5 +$as_echo_n "checking offset of sa_family in struct sockaddr... " >&6; } + if ac_fn_c_compute_int "$LINENO" "offsetof(struct sockaddr, sa_family)" "ac_cv_offsetof_sa_family" "#include + #include + #include "; then : + +else + ac_cv_offsteof_sa_family=0 +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_offsetof_sa_family" >&5 +$as_echo "$ac_cv_offsetof_sa_family" >&6; } + +cat >>confdefs.h <<_ACEOF +#define MIO_OFFSETOF_SA_FAMILY ${ac_cv_offsetof_sa_family} +_ACEOF + + else # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects @@ -20226,6 +20324,7 @@ if ${ac_cv_sizeof_struct_sockaddr_in+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (struct sockaddr_in))" "ac_cv_sizeof_struct_sockaddr_in" " + #include #include #include "; then : @@ -20262,6 +20361,7 @@ if ${ac_cv_sizeof_struct_sockaddr_in6+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (struct sockaddr_in6))" "ac_cv_sizeof_struct_sockaddr_in6" " + #include #include #include "; then : @@ -20298,6 +20398,7 @@ if ${ac_cv_sizeof_struct_sockaddr_un+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (struct sockaddr_un))" "ac_cv_sizeof_struct_sockaddr_un" " + #include #include #include "; then : @@ -20334,6 +20435,7 @@ if ${ac_cv_sizeof_struct_sockaddr_ll+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (struct sockaddr_ll))" "ac_cv_sizeof_struct_sockaddr_ll" " + #include #include #include "; then : @@ -20370,8 +20472,8 @@ if ${ac_cv_sizeof_struct_sockaddr_dl+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (struct sockaddr_dl))" "ac_cv_sizeof_struct_sockaddr_dl" " - #include #include + #include #include "; then : @@ -20397,6 +20499,8 @@ cat >>confdefs.h <<_ACEOF _ACEOF + + # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. @@ -20407,8 +20511,8 @@ if ${ac_cv_sizeof_socklen_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (socklen_t))" "ac_cv_sizeof_socklen_t" " + #include #include - #include "; then : else @@ -20433,7 +20537,6 @@ cat >>confdefs.h <<_ACEOF _ACEOF - if test ${ac_cv_sizeof_socklen_t} -gt 0 then @@ -20446,7 +20549,8 @@ else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include +#include + #include int main () { @@ -20475,8 +20579,303 @@ $as_echo "#define MIO_SOCKLEN_T_IS_SIGNED 1" >>confdefs.h fi fi + + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of sa_family_t" >&5 +$as_echo_n "checking size of sa_family_t... " >&6; } +if ${ac_cv_sizeof_sa_family_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (sa_family_t))" "ac_cv_sizeof_sa_family_t" " + #include + #include + #include +"; then : + +else + if test "$ac_cv_type_sa_family_t" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (sa_family_t) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_sa_family_t=0 + fi fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_sa_family_t" >&5 +$as_echo "$ac_cv_sizeof_sa_family_t" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_SA_FAMILY_T $ac_cv_sizeof_sa_family_t +_ACEOF + + + if test ${ac_cv_sizeof_sa_family_t} -gt 0 + then + + typename=`echo sa_family_t | sed "s/[^a-zA-Z0-9_]/_/g"` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sa_family_t is signed" >&5 +$as_echo_n "checking whether sa_family_t is signed... " >&6; } +if eval \${ax_cv_decl_${typename}_signed+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + #include +int +main () +{ + int foo [ 1 - 2 * !(((sa_family_t) -1) < 0) ] + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "ax_cv_decl_${typename}_signed=\"yes\"" +else + eval "ax_cv_decl_${typename}_signed=\"no\"" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$ax_cv_decl_${typename}_signed + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + symbolname=`echo sa_family_t | sed "s/[^a-zA-Z0-9_]/_/g" | tr "a-z" "A-Z"` + if eval "test \"\${ax_cv_decl_${typename}_signed}\" = \"yes\""; then + +$as_echo "#define MIO_SA_FAMILY_T_IS_SIGNED 1" >>confdefs.h + + elif eval "test \"\${ax_cv_decl_${typename}_signed}\" = \"no\""; then + $as_echo_n "" + fi + + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking offset of sa_family in struct sockaddr" >&5 +$as_echo_n "checking offset of sa_family in struct sockaddr... " >&6; } + if ac_fn_c_compute_int "$LINENO" "offsetof(struct sockaddr, sa_family)" "ac_cv_offsetof_sa_family" "#include + #include + #include "; then : + +else + ac_cv_offsteof_sa_family=0 +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_offsetof_sa_family" >&5 +$as_echo "$ac_cv_offsetof_sa_family" >&6; } + +cat >>confdefs.h <<_ACEOF +#define MIO_OFFSETOF_SA_FAMILY ${ac_cv_offsetof_sa_family} +_ACEOF + +fi + +if test ${ac_cv_sizeof___int128_t} -gt 0 +then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking __int128_t with % and va_arg" >&5 +$as_echo_n "checking __int128_t with % and va_arg... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + volatile __int128_t x, base; + va_list ap; + va_arg(ap, __int128_t); + x = (__int128_t)&base; + base = (__int128_t)&x; + x = x % base; + return (int)x; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ac_cv_sizeof___int128_t=0 + ac_cv_sizeof___uint128_t=0 + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +if test ${ac_cv_sizeof___float128} -gt 0 +then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking __float128 with linking" >&5 +$as_echo_n "checking __float128 with linking... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + __float128 x, y, z; + z = x * y + x; + printf ("%p", (char*)(int)z); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ac_cv_sizeof___float128=0 + + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi + +if test ${ac_cv_sizeof___float128} -gt 0 +then + for ac_func in quadmath_snprintf +do : + ac_fn_c_check_func "$LINENO" "quadmath_snprintf" "ac_cv_func_quadmath_snprintf" +if test "x$ac_cv_func_quadmath_snprintf" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_QUADMATH_SNPRINTF 1 +_ACEOF + +fi +done + + if test "$ac_cv_func_quadmath_snprintf" = "no" + then + OLDLIBS="$LIBS" + LIBS="$LIBM $LIBS" + for ac_func in quadmath_snprintf +do : + ac_fn_c_check_func "$LINENO" "quadmath_snprintf" "ac_cv_func_quadmath_snprintf" +if test "x$ac_cv_func_quadmath_snprintf" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_QUADMATH_SNPRINTF 1 +_ACEOF + +fi +done + + LIBS="$OLDLIBS" + + if test "$ac_cv_func_quadmath_snprintf" = "no" + then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for quadmath_snprintf in -lquadmath" >&5 +$as_echo_n "checking for quadmath_snprintf in -lquadmath... " >&6; } +if ${ac_cv_lib_quadmath_quadmath_snprintf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lquadmath $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char quadmath_snprintf (); +int +main () +{ +return quadmath_snprintf (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_quadmath_quadmath_snprintf=yes +else + ac_cv_lib_quadmath_quadmath_snprintf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_quadmath_quadmath_snprintf" >&5 +$as_echo "$ac_cv_lib_quadmath_quadmath_snprintf" >&6; } +if test "x$ac_cv_lib_quadmath_quadmath_snprintf" = xyes; then : + + QUADMATH_LIBS="-lquadmath" + LIBM="$LIBM -lquadmath" + $as_echo "#define HAVE_QUADMATH_SNPRINTF 1" >>confdefs.h + + +fi + + + if test "$ac_cv_lib_quadmath_quadmath_snprintf" = "no" + then + + ac_cv_sizeof___float128=0 + fi + + else + QUADMATH_LIBS="$LIBM" + fi + fi + + if test ${ac_cv_sizeof___float128} -gt 0 + then + OLDLIBS="$LIBS" + LIBS="$LIBM $LIBS" + for ac_func in powq fmodq sinq cosq tanq sinhq coshq tanhq asinq acosq atanq atan2q logq log10q expq sqrtq ceilq floorq roundq +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 + + for ac_func in strtoflt128 +do : + ac_fn_c_check_func "$LINENO" "strtoflt128" "ac_cv_func_strtoflt128" +if test "x$ac_cv_func_strtoflt128" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRTOFLT128 1 +_ACEOF + +fi +done + + LIBS="$OLDLIBS" + fi +fi + + if test ${ac_cv_sizeof___int128_t} -gt 0 then diff --git a/mio/configure.ac b/mio/configure.ac index 301f765..5bd094a 100644 --- a/mio/configure.ac +++ b/mio/configure.ac @@ -416,10 +416,10 @@ then AC_CHECK_SIZEOF(struct sockaddr_dl,,[ #include #include ]) + AC_CHECK_SIZEOF(socklen_t,, [ #include #include ]) - if test ${ac_cv_sizeof_socklen_t} -gt 0 then AX_CHECK_SIGN([socklen_t], @@ -428,35 +428,189 @@ then [#include #include ]) fi + + AC_CHECK_SIZEOF(sa_family_t,, [ + #include + #include ]) + if test ${ac_cv_sizeof_sa_family_t} -gt 0 + then + AX_CHECK_SIGN([sa_family_t], + [ AC_DEFINE(MIO_SA_FAMILY_T_IS_SIGNED, 1, [Define if sa_family_t is signed]) ], + [ AS_ECHO_N("") ], + [#include + #include ]) + fi + + AC_MSG_CHECKING([offset of sa_family in struct sockaddr]) + AC_COMPUTE_INT([ac_cv_offsetof_sa_family], + [[offsetof(struct sockaddr, sa_family)]], + [#include + #include + #include ], [ac_cv_offsteof_sa_family=0]) + AC_MSG_RESULT([$ac_cv_offsetof_sa_family]) + AC_DEFINE_UNQUOTED(MIO_OFFSETOF_SA_FAMILY, ${ac_cv_offsetof_sa_family}, [offsetof(struct sockaddr, sa_family)]) + else AC_CHECK_SIZEOF(struct sockaddr_in,,[ + #include #include #include ]) AC_CHECK_SIZEOF(struct sockaddr_in6,,[ + #include #include #include ]) AC_CHECK_SIZEOF(struct sockaddr_un,,[ + #include #include #include ]) AC_CHECK_SIZEOF(struct sockaddr_ll,,[ + #include #include #include ]) AC_CHECK_SIZEOF(struct sockaddr_dl,,[ - #include #include - #include ]) - AC_CHECK_SIZEOF(socklen_t,, [ #include - #include ]) + #include ]) + + AC_CHECK_SIZEOF(socklen_t,, [ + #include + #include ]) if test ${ac_cv_sizeof_socklen_t} -gt 0 then AX_CHECK_SIGN([socklen_t], [ AC_DEFINE(MIO_SOCKLEN_T_IS_SIGNED, 1, [Define if socklen_t is signed]) ], [ AS_ECHO_N("") ], - [#include ]) + [#include + #include ]) + fi + + AC_CHECK_SIZEOF(sa_family_t,, [ + #include + #include + #include ]) + if test ${ac_cv_sizeof_sa_family_t} -gt 0 + then + AX_CHECK_SIGN([sa_family_t], + [ AC_DEFINE(MIO_SA_FAMILY_T_IS_SIGNED, 1, [Define if sa_family_t is signed]) ], + [ AS_ECHO_N("") ], + [#include + #include + #include ]) + fi + + AC_MSG_CHECKING([offset of sa_family in struct sockaddr]) + AC_COMPUTE_INT([ac_cv_offsetof_sa_family], + [[offsetof(struct sockaddr, sa_family)]], + [#include + #include + #include ], [ac_cv_offsteof_sa_family=0]) + AC_MSG_RESULT([$ac_cv_offsetof_sa_family]) + AC_DEFINE_UNQUOTED(MIO_OFFSETOF_SA_FAMILY, ${ac_cv_offsetof_sa_family}, [offsetof(struct sockaddr, sa_family)]) +fi + +dnl gcc 3.4.3 on opensolaris x86 gave this warning without -msse or +dnl something similar. +dnl SSE vector argument without SSE enabled changes the ABI +dnl it also ended with an internal compiler error while compiling +dnl some expressions like 'v % base' where v is of the __int128_t type. +dnl so i've added this check to determine if the compiler has +dnl proper support for __int128_t. +dnl +dnl Changing ac_cv_sizeof___int128_t here doesn't corret SIZEOF___INT128_T +dnl since it's already generated. It only affects MIO_SIZEOF___INT128_T below. +if test ${ac_cv_sizeof___int128_t} -gt 0 +then + AC_MSG_CHECKING([__int128_t with % and va_arg]) + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([#include ], [ + volatile __int128_t x, base; + va_list ap; + va_arg(ap, __int128_t); + x = (__int128_t)&base; + base = (__int128_t)&x; + x = x % base; + return (int)x; + ])], + + [ + AC_MSG_RESULT(yes) + ], + [ + AC_MSG_RESULT(no) + ac_cv_sizeof___int128_t=0 + ac_cv_sizeof___uint128_t=0 + ] + ) +fi + +dnl Some compilers doesn't seem to have full support for __float128 +dnl even if the type is available. +if test ${ac_cv_sizeof___float128} -gt 0 +then + AC_MSG_CHECKING([__float128 with linking]) + AC_TRY_LINK( + [#include ], + [ + __float128 x, y, z; + z = x * y + x; + printf ("%p", (char*)(int)z); + ], + [AC_MSG_RESULT(yes)], + [ + AC_MSG_RESULT(no) + ac_cv_sizeof___float128=0 + ] + ) +fi + +dnl Quadmath functions may not be in the default c library. +dnl Find a library containing them. Disable the float128 type +dnl if they are not available. +if test ${ac_cv_sizeof___float128} -gt 0 +then + AC_CHECK_FUNCS([quadmath_snprintf]) + if test "$ac_cv_func_quadmath_snprintf" = "no" + then + OLDLIBS="$LIBS" + LIBS="$LIBM $LIBS" + AC_CHECK_FUNCS([quadmath_snprintf]) + LIBS="$OLDLIBS" + + if test "$ac_cv_func_quadmath_snprintf" = "no" + then + dnl quadmath_snprintf not avalable in the + dnl standard math lib. + + AC_CHECK_LIB([quadmath], [quadmath_snprintf], [ + QUADMATH_LIBS="-lquadmath" + LIBM="$LIBM -lquadmath" + AC_DEFINE(HAVE_QUADMATH_SNPRINTF, 1) + ]) + + if test "$ac_cv_lib_quadmath_quadmath_snprintf" = "no" + then + dnl quadmath_snprintf not avalable in the + dnl quadmath lib. + + ac_cv_sizeof___float128=0 + fi + + else + QUADMATH_LIBS="$LIBM" + fi + fi + + if test ${ac_cv_sizeof___float128} -gt 0 + then + OLDLIBS="$LIBS" + LIBS="$LIBM $LIBS" + AC_CHECK_FUNCS([powq fmodq sinq cosq tanq sinhq coshq tanhq asinq acosq atanq atan2q logq log10q expq sqrtq ceilq floorq roundq]) + AC_CHECK_FUNCS([strtoflt128]) + LIBS="$OLDLIBS" fi fi +AC_SUBST(QUADMATH_LIBS) dnl gcc 3.4.3 on opensolaris x86 gave this warning without -msse or diff --git a/mio/lib/main.c b/mio/lib/main.c index 0e002fc..1c15d07 100644 --- a/mio/lib/main.c +++ b/mio/lib/main.c @@ -395,7 +395,7 @@ static void send_icmp (mio_dev_sck_t* dev, mio_uint16_t seq) memset (&buf[MIO_SIZEOF(*icmphdr)], 'A', MIO_SIZEOF(buf) - MIO_SIZEOF(*icmphdr)); icmphdr->checksum = mio_checksumip (icmphdr, MIO_SIZEOF(buf)); - if (mio_dev_sck_write (dev, buf, MIO_SIZEOF(buf), MIO_NULL, &dstaddr) <= -1) + if (mio_dev_sck_write(dev, buf, MIO_SIZEOF(buf), MIO_NULL, &dstaddr) <= -1) { printf ("CANNOT WRITE ICMP...\n"); mio_dev_sck_halt (dev); diff --git a/mio/lib/mio-cfg.h.in b/mio/lib/mio-cfg.h.in index 224f8d9..ce57774 100644 --- a/mio/lib/mio-cfg.h.in +++ b/mio/lib/mio-cfg.h.in @@ -741,6 +741,9 @@ /* MB_LEN_MAX */ #undef MIO_MBLEN_MAX +/* offsetof(struct sockaddr, sa_family) */ +#undef MIO_OFFSETOF_SA_FAMILY + /* Author */ #undef MIO_PACKAGE_AUTHOR @@ -762,6 +765,9 @@ /* Patch level */ #undef MIO_PACKAGE_VERSION_PATCH +/* Define if sa_family_t is signed */ +#undef MIO_SA_FAMILY_T_IS_SIGNED + /* sizeof(char) */ #undef MIO_SIZEOF_CHAR @@ -900,6 +906,9 @@ /* The size of `off_t', as computed by sizeof. */ #undef SIZEOF_OFF_T +/* The size of `sa_family_t', as computed by sizeof. */ +#undef SIZEOF_SA_FAMILY_T + /* The size of `short', as computed by sizeof. */ #undef SIZEOF_SHORT diff --git a/mio/lib/mio-prv.h b/mio/lib/mio-prv.h index 2468e38..c66a890 100644 --- a/mio/lib/mio-prv.h +++ b/mio/lib/mio-prv.h @@ -40,6 +40,9 @@ #define MIO_MEMCMP(dst,src,count) memcmp(dst,src,count) #define MIO_ASSERT assert +#define MIO_CWQFL_SIZE 16 +#define MIO_CWQFL_ALIGN 16 + typedef struct mio_mux_t mio_mux_t; struct mio_t @@ -79,7 +82,7 @@ struct mio_t } tmr; mio_cwq_t cwq; - mio_cwq_t* cwq_zdf; /* list of free cwq objects with 0-sized dstaddr */ + mio_cwq_t* cwqfl[MIO_CWQFL_SIZE]; /* list of free cwq objects */ /* platform specific fields below */ #if defined(_WIN32) diff --git a/mio/lib/mio-sck.h b/mio/lib/mio-sck.h index bd715ea..ecc79cc 100644 --- a/mio/lib/mio-sck.h +++ b/mio/lib/mio-sck.h @@ -215,6 +215,9 @@ typedef int mio_sckfam_t; struct mio_sckaddr_t { +#if defined(MIO_OFFSETOF_SA_FAMILY) && (MIO_OFFSETOF_SA_FAMILY > 0) + mio_uint8_t filler[MIO_OFFSETOF_SA_FAMILY]; +#endif mio_sckfam_t family; mio_uint8_t data[128]; /* TODO: use the actual sockaddr size */ }; diff --git a/mio/lib/mio.c b/mio/lib/mio.c index 77231d1..ecbd910 100644 --- a/mio/lib/mio.c +++ b/mio/lib/mio.c @@ -394,12 +394,17 @@ void mio_fini (mio_t* mio) mio_dev_t* head; mio_dev_t* tail; } diehard; + mio_oow_t i; - while (mio->cwq_zdf) + /* clean up free cwq list */ + for (i = 0; i < MIO_COUNTOF(mio->cwqfl); i++) { - mio_cwq_t* cwq = mio->cwq_zdf; - mio->cwq_zdf = cwq->next; - MIO_MMGR_FREE (mio->mmgr, cwq); + mio_cwq_t* cwq; + while ((cwq = mio->cwqfl[i])) + { + mio->cwqfl[i] = cwq->next; + MIO_MMGR_FREE (mio->mmgr, cwq); + } } /* kill all registered devices */ @@ -408,6 +413,7 @@ void mio_fini (mio_t* mio) mio_killdev (mio, mio->actdev.head); } + /* kill all halted devices */ while (mio->hltdev.head) { mio_killdev (mio, mio->hltdev.head); @@ -735,16 +741,19 @@ static MIO_INLINE int __exec (mio_t* mio) while (!MIO_CWQ_ISEMPTY(&mio->cwq)) { mio_cwq_t* cwq; + mio_oow_t cwqfl_index; + cwq = MIO_CWQ_HEAD(&mio->cwq); if (cwq->dev->dev_evcb->on_write(cwq->dev, cwq->olen, cwq->ctx, &cwq->dstaddr) <= -1) return -1; cwq->dev->cw_count--; MIO_CWQ_UNLINK (cwq); - if (cwq->dstaddr.len == 0) + cwqfl_index = MIO_ALIGN_POW2(cwq->dstaddr.len, MIO_CWQFL_ALIGN) / MIO_CWQFL_SIZE; + if (cwqfl_index < MIO_COUNTOF(mio->cwqfl)) { /* reuse the cwq object if dstaddr is 0 in size. chain it to the free list */ - cwq->next = mio->cwq_zdf; - mio->cwq_zdf = cwq; + cwq->next = mio->cwqfl[cwqfl_index]; + mio->cwqfl[cwqfl_index] = cwq; } else { @@ -1291,6 +1300,7 @@ static int __dev_write (mio_dev_t* dev, const void* data, mio_iolen_t len, const mio_iolen_t urem, ulen; mio_wq_t* q; mio_cwq_t* cwq; + mio_oow_t cwq_extra_aligned, cwqfl_index; int x; if (dev->dev_capa & MIO_DEV_CAPA_OUT_CLOSED) @@ -1341,7 +1351,11 @@ static int __dev_write (mio_dev_t* dev, const void* data, mio_iolen_t len, const dev->dev_capa |= MIO_DEV_CAPA_OUT_CLOSED; } - //if (dev->dev_evcb->on_write(dev, len, wrctx, dstaddr) <= -1) return -1; + /* if i trigger the write completion callback here, the performance + * may increase, but there can be annoying recursion issues if the + * callback requests another writing operation. it's imperative to + * delay the callback until this write function is finished. + * ---> if (dev->dev_evcb->on_write(dev, len, wrctx, dstaddr) <= -1) return -1; */ goto enqueue_completed_write; } else @@ -1352,8 +1366,11 @@ static int __dev_write (mio_dev_t* dev, const void* data, mio_iolen_t len, const if (x <= -1) return -1; else if (x == 0) goto enqueue_data; - /* partial writing is still considered ok for a non-stream device */ - //if (dev->dev_evcb->on_write(dev, ulen, wrctx, dstaddr) <= -1) return -1; + /* partial writing is still considered ok for a non-stream device. */ + + /* read the comment in the 'if' block above for why i enqueue the write completion event + * instead of calling the event callback here... + * --> if (dev->dev_evcb->on_write(dev, ulen, wrctx, dstaddr) <= -1) return -1; */ goto enqueue_completed_write; } @@ -1434,14 +1451,19 @@ enqueue_data: enqueue_completed_write: /* queue the remaining data*/ - if (!dstaddr && dev->mio->cwq_zdf) + cwq_extra_aligned = (dstaddr? dstaddr->len: 0); + cwq_extra_aligned = MIO_ALIGN_POW2(cwq_extra_aligned, MIO_CWQFL_ALIGN); + cwqfl_index = cwq_extra_aligned / MIO_CWQFL_SIZE; + + if (cwqfl_index < MIO_COUNTOF(dev->mio->cwqfl) && dev->mio->cwqfl[cwqfl_index]) { - cwq = dev->mio->cwq_zdf; - dev->mio->cwq_zdf = cwq->next; + /* take an available cwq object from the free cwq list */ + cwq = dev->mio->cwqfl[cwqfl_index]; + dev->mio->cwqfl[cwqfl_index] = cwq->next; } else { - cwq = (mio_cwq_t*)MIO_MMGR_ALLOC(dev->mio->mmgr, MIO_SIZEOF(*cwq) + (dstaddr? dstaddr->len: 0)); + cwq = (mio_cwq_t*)MIO_MMGR_ALLOC(dev->mio->mmgr, MIO_SIZEOF(*cwq) + cwq_extra_aligned); if (!cwq) { dev->mio->errnum = MIO_ENOMEM;