From 31d626536ff0cdfa875075e092bf8c86a5e43710 Mon Sep 17 00:00:00 2001 From: mquinson Date: Tue, 6 Apr 2004 22:12:59 +0000 Subject: [PATCH] J'en ai marre de faire des messages detailles. 'Current state' ;) git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@70 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- bootstrap | 2 +- configure | 322 +++----------- include/data_description.h | 375 ----------------- include/datadesc.h | 162 ++++--- include/datadesc_simple.h | 110 ----- include/dd_type_bag.h | 97 ----- include/gras.h | 16 - include/messages.h | 6 +- include/modules/base.h | 2 +- include/socket.h | 223 ---------- include/transport.h | 23 +- ltmain.sh | 92 ++-- src/gras/Common/gras_msg.c | 510 ----------------------- src/gras/DataDesc/datadesc.c | 99 ++++- src/gras/DataDesc/datadesc_interface.h | 39 +- src/gras/DataDesc/datadesc_private.h | 61 ++- src/gras/DataDesc/ddt_create.c | 141 +++++-- src/gras/DataDesc/ddt_declare.c | 44 +- src/gras/DataDesc/ddt_remote.c | 180 +------- src/gras/DataDesc/ddt_use.c | 75 +++- src/gras/Makefile.am | 52 +-- src/gras/Transport/rl_transport.c | 195 +++++++++ src/gras/Transport/sg_transport.c | 31 ++ src/gras/Transport/transport.c | 75 +++- src/gras/Transport/transport_interface.h | 76 ++++ src/gras/Transport/transport_private.h | 118 ++---- src/gras/Transport/transport_sg.c | 44 ++ src/gras/Transport/transport_tcp.c | 368 ++++++++++++++-- src/gras/gras_private.h | 229 +--------- 29 files changed, 1443 insertions(+), 2324 deletions(-) delete mode 100644 include/data_description.h delete mode 100644 include/datadesc_simple.h delete mode 100644 include/dd_type_bag.h delete mode 100644 include/socket.h delete mode 100644 src/gras/Common/gras_msg.c create mode 100644 src/gras/Transport/rl_transport.c create mode 100644 src/gras/Transport/sg_transport.c create mode 100644 src/gras/Transport/transport_interface.h diff --git a/bootstrap b/bootstrap index 3989daa7ab..25e00abdb5 100755 --- a/bootstrap +++ b/bootstrap @@ -97,7 +97,7 @@ if test -z "$*"; then echo \`$0\'" command line, or rerun aci_configurator and save the new ones." echo else - configure_args="--enable-maintainer-mode" + configure_args="--enable-maintainer-mode --enable-gtk-doc" echo "**Warning**: I am going to run \`configure' with no arguments." echo "If you wish to pass any to it, please specify them on the" echo \`$0\'" command line." diff --git a/configure b/configure index 5b0a00740b..589babd046 100755 --- a/configure +++ b/configure @@ -1,7 +1,7 @@ #! /bin/sh -# From configure.ac Revision: 1.3 . +# From configure.ac Revision: 1.4 . # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.59 for GRAS 0.0.040205. +# Generated by GNU Autoconf 2.59 for GRAS 0.0.040304. # # Report bugs to . # @@ -424,12 +424,11 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='GRAS' PACKAGE_TARNAME='gras' -PACKAGE_VERSION='0.0.040205' -PACKAGE_STRING='GRAS 0.0.040205' +PACKAGE_VERSION='0.0.040304' +PACKAGE_STRING='GRAS 0.0.040304' PACKAGE_BUGREPORT='martin.quinson@ens-lyon.fr' ac_unique_file="src/include/gras.h" -ac_subdirs_all="$ac_subdirs_all src/nws_portability" # Factoring default headers for most tests. ac_includes_default="\ #include @@ -467,7 +466,7 @@ ac_includes_default="\ # include #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS subdirs build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO AMTAR install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM AWK SET_MAKE am__leading_dot CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CPP CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL LIBOBJS HTML_DIR PKG_CONFIG ENABLE_GTK_DOC_TRUE ENABLE_GTK_DOC_FALSE GTK_DOC_USE_LIBTOOL_TRUE GTK_DOC_USE_LIBTOOL_FALSE ACI_CACHE_PROG aci_module_desc_XML aci_pkg_config_XML HAVE_XML CFLAGS_XML LIBS_XML aci_module_desc_SimGrid aci_pkg_prefix_SimGrid aci_pkg_inc_SimGrid aci_pkg_lib_SimGrid aci_pkg_extra_SimGrid HAVE_SimGrid CFLAGS_SimGrid LIBS_SimGrid MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT cflags_set BASH WARNING LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO AMTAR install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM AWK SET_MAKE am__leading_dot CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CPP CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL LIBOBJS HTML_DIR PKG_CONFIG ENABLE_GTK_DOC_TRUE ENABLE_GTK_DOC_FALSE GTK_DOC_USE_LIBTOOL_TRUE GTK_DOC_USE_LIBTOOL_FALSE ACI_CACHE_PROG aci_module_desc_XML aci_pkg_config_XML HAVE_XML CFLAGS_XML LIBS_XML aci_module_desc_SimGrid aci_pkg_prefix_SimGrid aci_pkg_inc_SimGrid aci_pkg_lib_SimGrid aci_pkg_extra_SimGrid HAVE_SimGrid CFLAGS_SimGrid LIBS_SimGrid MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT cflags_set BASH WARNING LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. @@ -956,7 +955,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures GRAS 0.0.040205 to adapt to many kinds of systems. +\`configure' configures GRAS 0.0.040304 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1023,7 +1022,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of GRAS 0.0.040205:";; + short | recursive ) echo "Configuration of GRAS 0.0.040304:";; esac cat <<\_ACEOF @@ -1177,7 +1176,7 @@ fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF -GRAS configure 0.0.040205 +GRAS configure 0.0.040304 generated by GNU Autoconf 2.59 Copyright (C) 2003 Free Software Foundation, Inc. @@ -1191,7 +1190,7 @@ cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by GRAS $as_me 0.0.040205, which was +It was created by GRAS $as_me 0.0.040304, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ @@ -1527,6 +1526,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + ac_aux_dir= @@ -1554,11 +1554,6 @@ ac_config_guess="$SHELL $ac_aux_dir/config.guess" ac_config_sub="$SHELL $ac_aux_dir/config.sub" ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. - - -subdirs="$subdirs src/nws_portability" - - # Make sure we can run config.sub. $ac_config_sub sun4 >/dev/null 2>&1 || { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 @@ -1900,7 +1895,7 @@ fi # Define the identity of the package. PACKAGE='gras' - VERSION='0.0.040205' + VERSION='0.0.040304' cat >>confdefs.h <<_ACEOF @@ -3546,7 +3541,7 @@ linux*) lt_cv_deplibs_check_method=pass_all ;; -netbsd*) +netbsd* | knetbsd*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else @@ -3663,7 +3658,7 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 3666 "configure"' > conftest.$ac_ext + echo '#line 3661 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -5220,7 +5215,7 @@ fi # Provide some information about the compiler. -echo "$as_me:5223:" \ +echo "$as_me:5218:" \ "checking for Fortran 77 compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 @@ -6252,11 +6247,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6255: $lt_compile\"" >&5) + (eval echo "\"\$as_me:6250: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:6259: \$? = $ac_status" >&5 + echo "$as_me:6254: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -6485,11 +6480,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6488: $lt_compile\"" >&5) + (eval echo "\"\$as_me:6483: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:6492: \$? = $ac_status" >&5 + echo "$as_me:6487: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -6536,13 +6531,6 @@ else mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext - # According to Tom Tromey, Ian Lance Taylor reported there are C compilers - # that will create temporary files in the current directory regardless of - # the output directory. Thus, making CWD read-only will cause this test - # to fail, enabling locking or at least warning the user not to do parallel - # builds. - chmod -w . - lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. @@ -6552,11 +6540,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6555: $lt_compile\"" >&5) + (eval echo "\"\$as_me:6543: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:6559: \$? = $ac_status" >&5 + echo "$as_me:6547: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -6729,7 +6717,7 @@ EOF fi ;; - netbsd*) + netbsd* | knetbsd*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= @@ -7246,7 +7234,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi link_all_deplibs=yes ;; - netbsd*) + netbsd* | knetbsd*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else @@ -7916,7 +7904,7 @@ netbsd*) finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} ${libname}${shared_ext}' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi @@ -8727,7 +8715,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext </dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= @@ -10891,7 +10879,7 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 ;; esac ;; - netbsd*) + netbsd* | knetbsd*-gnu) ;; osf3* | osf4* | osf5*) case $cc_basename in @@ -11002,11 +10990,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:11005: $lt_compile\"" >&5) + (eval echo "\"\$as_me:10993: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:11009: \$? = $ac_status" >&5 + echo "$as_me:10997: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -11053,13 +11041,6 @@ else mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext - # According to Tom Tromey, Ian Lance Taylor reported there are C compilers - # that will create temporary files in the current directory regardless of - # the output directory. Thus, making CWD read-only will cause this test - # to fail, enabling locking or at least warning the user not to do parallel - # builds. - chmod -w . - lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. @@ -11069,11 +11050,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:11072: $lt_compile\"" >&5) + (eval echo "\"\$as_me:11053: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:11076: \$? = $ac_status" >&5 + echo "$as_me:11057: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -11612,7 +11593,7 @@ netbsd*) finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} ${libname}${shared_ext}' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi @@ -12423,7 +12404,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&5) + (eval echo "\"\$as_me:13332: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:13355: \$? = $ac_status" >&5 + echo "$as_me:13336: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -13399,13 +13380,6 @@ else mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext - # According to Tom Tromey, Ian Lance Taylor reported there are C compilers - # that will create temporary files in the current directory regardless of - # the output directory. Thus, making CWD read-only will cause this test - # to fail, enabling locking or at least warning the user not to do parallel - # builds. - chmod -w . - lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. @@ -13415,11 +13389,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:13418: $lt_compile\"" >&5) + (eval echo "\"\$as_me:13392: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:13422: \$? = $ac_status" >&5 + echo "$as_me:13396: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -13592,7 +13566,7 @@ EOF fi ;; - netbsd*) + netbsd* | knetbsd*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= @@ -14089,7 +14063,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi link_all_deplibs_F77=yes ;; - netbsd*) + netbsd* | knetbsd*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else @@ -14759,7 +14733,7 @@ netbsd*) finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} ${libname}${shared_ext}' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi @@ -15447,11 +15421,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15450: $lt_compile\"" >&5) + (eval echo "\"\$as_me:15424: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:15454: \$? = $ac_status" >&5 + echo "$as_me:15428: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -15680,11 +15654,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15683: $lt_compile\"" >&5) + (eval echo "\"\$as_me:15657: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:15687: \$? = $ac_status" >&5 + echo "$as_me:15661: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -15731,13 +15705,6 @@ else mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext - # According to Tom Tromey, Ian Lance Taylor reported there are C compilers - # that will create temporary files in the current directory regardless of - # the output directory. Thus, making CWD read-only will cause this test - # to fail, enabling locking or at least warning the user not to do parallel - # builds. - chmod -w . - lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. @@ -15747,11 +15714,11 @@ else -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15750: $lt_compile\"" >&5) + (eval echo "\"\$as_me:15717: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:15754: \$? = $ac_status" >&5 + echo "$as_me:15721: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -15924,7 +15891,7 @@ EOF fi ;; - netbsd*) + netbsd* | knetbsd*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= @@ -16441,7 +16408,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi link_all_deplibs_GCJ=yes ;; - netbsd*) + netbsd* | knetbsd*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else @@ -17111,7 +17078,7 @@ netbsd*) finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} ${libname}${shared_ext}' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi @@ -17922,7 +17889,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&5 @@ -23747,7 +23715,7 @@ _ASBOX } >&5 cat >&5 <<_CSEOF -This file was extended by GRAS $as_me 0.0.040205, which was +This file was extended by GRAS $as_me 0.0.040304, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -23810,7 +23778,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ -GRAS config.status 0.0.040205 +GRAS config.status 0.0.040304 configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" @@ -24022,7 +23990,6 @@ s,@ECHO_C@,$ECHO_C,;t t s,@ECHO_N@,$ECHO_N,;t t s,@ECHO_T@,$ECHO_T,;t t s,@LIBS@,$LIBS,;t t -s,@subdirs@,$subdirs,;t t s,@build@,$build,;t t s,@build_cpu@,$build_cpu,;t t s,@build_vendor@,$build_vendor,;t t @@ -24887,183 +24854,6 @@ if test "$no_create" != yes; then $ac_cs_success || { (exit 1); exit 1; } fi -# -# CONFIG_SUBDIRS section. -# -if test "$no_recursion" != yes; then - - # Remove --cache-file and --srcdir arguments so they do not pile up. - ac_sub_configure_args= - ac_prev= - for ac_arg in $ac_configure_args; do - if test -n "$ac_prev"; then - ac_prev= - continue - fi - case $ac_arg in - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ - | --c=*) - ;; - --config-cache | -C) - ;; - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - ;; - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - ;; - *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;; - esac - done - - # Always prepend --prefix to ensure using the same prefix - # in subdir configurations. - ac_sub_configure_args="--prefix=$prefix $ac_sub_configure_args" - - ac_popdir=`pwd` - for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue - - # Do not complain, so a configure script can configure whichever - # parts of a large source tree are present. - test -d $srcdir/$ac_dir || continue - - { echo "$as_me:$LINENO: configuring in $ac_dir" >&5 -echo "$as_me: configuring in $ac_dir" >&6;} - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } - - ac_builddir=. - -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi - -case $srcdir in - .) # No --srcdir option. We are building in place. - ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; -esac - -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; -esac - - - cd $ac_dir - - # Check for guested configure; otherwise get Cygnus style configure. - if test -f $ac_srcdir/configure.gnu; then - ac_sub_configure="$SHELL '$ac_srcdir/configure.gnu'" - elif test -f $ac_srcdir/configure; then - ac_sub_configure="$SHELL '$ac_srcdir/configure'" - elif test -f $ac_srcdir/configure.in; then - ac_sub_configure=$ac_configure - else - { echo "$as_me:$LINENO: WARNING: no configuration information is in $ac_dir" >&5 -echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} - ac_sub_configure= - fi - - # The recursion is here. - if test -n "$ac_sub_configure"; then - # Make the cache file name correct relative to the subdirectory. - case $cache_file in - [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; - *) # Relative path. - ac_sub_cache_file=$ac_top_builddir$cache_file ;; - esac - - { echo "$as_me:$LINENO: running $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 -echo "$as_me: running $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} - # The eval makes quoting arguments work. - eval $ac_sub_configure $ac_sub_configure_args \ - --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir || - { { echo "$as_me:$LINENO: error: $ac_sub_configure failed for $ac_dir" >&5 -echo "$as_me: error: $ac_sub_configure failed for $ac_dir" >&2;} - { (exit 1); exit 1; }; } - fi - - cd "$ac_popdir" - done -fi - echo " diff --git a/include/data_description.h b/include/data_description.h deleted file mode 100644 index 949fac3a22..0000000000 --- a/include/data_description.h +++ /dev/null @@ -1,375 +0,0 @@ -/* gs_interface.h */ -#ifndef GS_INTERFACE_H -#define GS_INTERFACE_H - -/* Mask internal structures to users */ -typedef struct s_gs_type_bag gras_type_bag_t; -typedef struct s_gs_connection gras_connection_t; -typedef struct s_gs_type gras_type_t; -typedef struct s_gs_message gras_message_t; -typedef struct s_gs_net_driver gras_net_driver_t; -typedef struct s_gs_message_instance gras_message_instance_t; -typedef struct s_gs_type_driver gras_type_driver_t; - - -/* public functions */ -void -gs_init(int argc, - char **argv); - -void -gs_purge_cmd_line(int *argc, - char **argv); - -void -gs_exit(void); - -/* -- */ - -gras_type_t * -gs_type_new_unsigned_integer_elemental(gras_type_bag_t *p_bag, - gras_connection_t *p_connection, - const char *name, - long int size); - -gras_type_t * -gs_type_new_signed_integer_elemental(gras_type_bag_t *p_bag, - gras_connection_t *p_connection, - const char *name, - long int size); - -gras_type_t * -gs_type_new_floating_point_elemental(gras_type_bag_t *p_bag, - gras_connection_t *p_connection, - const char *name, - long int size); - -gras_type_t * -gs_type_new_struct(gras_type_bag_t *p_bag, - gras_connection_t *p_connection, - const char *name); - -void -gs_type_struct_append_field(gras_type_t *p_struct_type, - const char *name, - gras_type_t *p_field_type); - -gras_type_t * -gs_type_new_union(gras_type_bag_t *p_bag, - gras_connection_t *p_connection, - const char *name, - - int (*field_callback)(void *vars, - gras_type_t *p_type, - void *data)); - -void -gs_type_union_append_field(gras_type_t *p_union_type, - const char *name, - gras_type_t *p_field_type); - -gras_type_t * -gs_type_new_ref(gras_type_bag_t *p_bag, - gras_connection_t *p_connection, - const char *name, - gras_type_t *p_referenced_type); - -gras_type_t * -gs_type_new_array(gras_type_bag_t *p_bag, - gras_connection_t *p_connection, - const char *name, - long int size, - gras_type_t *p_array_element_type); - -gras_type_t * -gs_type_new_ignored(gras_type_bag_t *p_bag, - gras_connection_t *p_connection, - const char *name, - long int size, - long int alignment, - void *default_value); - -/* -- */ - -gras_type_t * -gs_type_new_unsigned_integer_elemental_with_callback(gras_type_bag_t *p_bag, - gras_connection_t *p_connection, - const char *name, - long int size, - - void (*callback)(void *vars, - gras_type_t *p_type, - void *data)); - -gras_type_t * -gs_type_new_signed_integer_elemental_with_callback(gras_type_bag_t *p_bag, - gras_connection_t *p_connection, - const char *name, - long int size, - - void (*callback)(void *vars, - gras_type_t *p_type, - void *data)); - -gras_type_t * -gs_type_new_floating_point_elemental_with_callback(gras_type_bag_t *p_bag, - gras_connection_t *p_connection, - const char *name, - long int size, - - void (*callback)(void *vars, - gras_type_t *p_type, - void *data)); - -gras_type_t * -gs_type_new_struct_with_callback(gras_type_bag_t *p_bag, - gras_connection_t *p_connection, - const char *name, - - void (*before_callback)(void *vars, - gras_type_t *p_type, - void *data), - - void (*after_callback)(void *vars, - gras_type_t *p_type, - void *data)); - -void -gs_type_struct_append_field_with_callback(gras_type_t *p_struct_type, - const char *name, - gras_type_t *p_field_type, - - void (*before_callback)(void *vars, - gras_type_t *p_type, - void *data), - - void (*after_callback)(void *vars, - gras_type_t *p_type, - void *data)); - - -gras_type_t * -gs_type_new_union_with_callback(gras_type_bag_t *p_bag, - gras_connection_t *p_connection, - const char *name, - - int (*field_callback)(void *vars, - gras_type_t *p_type, - void *data), - - void (*after_callback)(void *vars, - gras_type_t *p_type, - void *data)); - -void -gs_type_union_append_field_with_callback(gras_type_t *p_union_type, - const char *name, - gras_type_t *p_field_type, - - void (*before_callback)(void *vars, - gras_type_t *p_type, - void *data), - - void (*after_callback)(void *vars, - gras_type_t *p_type, - void *data)); - -gras_type_t * -gs_type_new_ref_with_callback(gras_type_bag_t *p_bag, - gras_connection_t *p_connection, - const char *name, - gras_type_t *p_referenced_type, - - int (*type_callback)(void *vars, - gras_type_t *p_type, - void *data), - - void (*after_callback)(void *vars, - gras_type_t *p_type, - void *data)); - -gras_type_t * -gs_type_new_array_with_callback(gras_type_bag_t *p_bag, - gras_connection_t *p_connection, - const char *name, - long int size, - gras_type_t *p_array_element_type, - - long int (*size_callback)(void *vars, - gras_type_t *p_type, - void *data), - - void (*after_callback)(void *vars, - gras_type_t *p_type, - void *data)); - -gras_type_t * -gs_type_new_ignored_with_callback(gras_type_bag_t *p_bag, - gras_connection_t *p_connection, - const char *name, - long int size, - long int alignment, - void *default_value, - void (*callback)(void *vars, - gras_type_t *p_type, - void *data)); - -/* Automatic parsing of datatypes */ -gras_type_t * -_gs_type_parse(gras_type_bag_t *p_bag, - const char *definition); - -#define GRAS_DEFINE_TYPE(name,def) \ - static const char * _gs_this_type_symbol_does_not_exist__##name=#def; def - -#define gras_type_symbol_parse(bag,name) \ - _gs_type_parse(bag, _gs_this_type_symbol_does_not_exist__##name) - -#define gs_type_get_by_symbol(bag,name) \ - (bag->bag_ops->get_type_by_name(bag, NULL, #name) ? \ - bag->bag_ops->get_type_by_name(bag, NULL, #name) : \ - gras_type_symbol_parse(bag, name) \ - ) - -/* -- */ - -void -gs_bootstrap_incoming_connection(gras_type_bag_t *p_bag, - gras_connection_t *p_cnx); - -void -gs_bootstrap_type_bag(gras_type_bag_t *p_bag); - - -void -gs_bootstrap_outgoing_connection(gras_type_bag_t *p_bag, - gras_connection_t *p_cnx); - -/* -- */ - -gras_message_t * -gs_message_new(gras_type_bag_t *p_bag, - gras_connection_t *p_connection, - const char *name); - - -void -gs_message_append_new_sequence(gras_message_t *p_message, - gras_type_t *p_type); - -gras_message_instance_t * -gs_message_init_send_by_ref(gras_type_bag_t *p_bag, - gras_connection_t *p_connection, - gras_message_t *p_message); - -gras_message_instance_t * -gs_message_init_send_by_name(gras_type_bag_t *p_bag, - gras_connection_t *p_connection, - const char *name); - -gras_message_instance_t * -gs_message_init_send_by_code(gras_type_bag_t *p_bag, - gras_connection_t *p_connection, - int code); - - -void -gs_message_send_next_sequence_ext(void *vars, - gras_message_instance_t *p_message_instance, - void *data); - -void -gs_message_send_next_sequence(gras_message_instance_t *p_message_instance, - void *data); - -void * -gs_message_receive_next_sequence(gras_message_instance_t *p_message_instance); - -gras_message_instance_t * -gs_message_init_receive(gras_type_bag_t *p_bag, - gras_connection_t *p_cnx); - -/* -- */ - -void * -gs_vars_alloc(void); - -void -gs_vars_free(void *p_vars); - -void -gs_vars_enter(void *p_vars); - -void -gs_vars_leave(void *p_vars); - -void -gs_vars_push(void *p_vars, - gras_type_t *p_type, - const char *name, - void *data); - -void * -gs_vars_get(void *p_vars, - const char *name, - gras_type_t **pp_type); - -void -gs_vars_set(void *p_vars, - gras_type_t *p_type, - const char *name, - void *data); - -void * -gs_vars_pop(void *p_vars, - const char *name, - gras_type_t **pp_type); - -/* -- */ - -void -gs_net_drivers_init(void); - -gras_net_driver_t * -gs_net_driver_init(const char *name); - -void -gs_net_driver_exit(gras_net_driver_t *p_net_driver); - -gras_connection_t * -gs_net_connection_connect(gras_net_driver_t *p_net_driver, - void *arg); - -gras_connection_t * -gs_net_connection_accept(gras_net_driver_t *p_net_driver, - void *arg); - -void -gs_net_connection_close(gras_connection_t *p_connection); - -/* -- */ - -void -gs_type_drivers_init(void); - -gras_type_driver_t * -gs_type_driver_init(const char *name); - -void -gs_type_driver_exit(gras_type_driver_t *p_type_driver); - - -gras_type_bag_t * -gs_type_bag_alloc(gras_type_driver_t *p_driver); - -void -gs_type_bag_free(gras_type_bag_t *p_bag); - -/* -- */ - -void * -gs_memdup(const void * const ptr, - const size_t length); - - -#endif /* GS_INTERFACE_H */ diff --git a/include/datadesc.h b/include/datadesc.h index 81cd2479ca..a8cfa40023 100644 --- a/include/datadesc.h +++ b/include/datadesc.h @@ -37,60 +37,49 @@ BEGIN_DECL -/** - * Basic types we can embeed in DataDescriptors. - */ -typedef enum - {CHAR_TYPE, DOUBLE_TYPE, FLOAT_TYPE, INT_TYPE, LONG_TYPE, SHORT_TYPE, - UNSIGNED_INT_TYPE, UNSIGNED_LONG_TYPE, UNSIGNED_SHORT_TYPE, STRUCT_TYPE} - DataTypes; -#define SIMPLE_TYPE_COUNT 9 - -/*! \brief Describe a collection of data. - * -** A description of a collection of #type# data. #repetitions# is used only -** for arrays; it contains the number of elements. #offset# is used only for -** struct members in host format; it contains the offset of the member from the -** beginning of the struct, taking into account internal padding added by the -** compiler for alignment purposes. #members#, #length#, and #tailPadding# are -** used only for STRUCT_TYPE data; the #length#-long array #members# describes -** the members of the nested struct, and #tailPadding# indicates how many -** padding bytes the compiler adds to the end of the structure. -*/ - -typedef struct DataDescriptorStruct { - DataTypes type; - size_t repetitions; - size_t offset; - /*@null@*/ struct DataDescriptorStruct *members; - size_t length; - size_t tailPadding; -} DataDescriptor; -/** DataDescriptor for an array */ -#define SIMPLE_DATA(type,repetitions) \ - {type, repetitions, 0, NULL, 0, 0} -/** DataDescriptor for an structure member */ -#define SIMPLE_MEMBER(type,repetitions,offset) \ - {type, repetitions, offset, NULL, 0, 0} -/** DataDescriptor for padding bytes */ -#define PAD_BYTES(structType,lastMember,memberType,repetitions) \ - sizeof(structType) - offsetof(structType, lastMember) - \ - sizeof(memberType) * repetitions - -/* -gras_error_t gras_datadesc_parse(const char *def, - gras_datadesc__t **dst); -gras_error_t gras_datadesc_from_nws(const DataDescriptor *desc, - size_t howmany, - gras_datadesc_t **dst); -gras_error_t gras_datadesc_sizeof_host(gras_datadesc_t *desc, - size_t *dst); -gras_error_t gras_datadesc_sizeof_network(gras_datadesc_t *desc, - size_t *dst); -*/ typedef struct s_gras_datadesc_type gras_datadesc_type_t; +/*********************************************** + **** Search and retrieve declared datatype **** + ***********************************************/ +long int gras_datadesc_get_id_from_name(const char *name); + +/********************************************* + **** DataDesc callback persistent states **** + *********************************************/ +typedef struct s_gras_dd_cbps gras_dd_cbps_t; + +void * +gras_dd_cbps_pop (gras_dd_cbps_t *ps, + const char *name, + gras_datadesc_type_t **ddt); +void +gras_dd_cbps_push(gras_dd_cbps_t *ps, + const char *name, + void *data, + gras_datadesc_type_t *ddt); +void +gras_dd_cbps_set (gras_dd_cbps_t *ps, + const char *name, + void *data, + gras_datadesc_type_t *ddt); + +void * +gras_dd_cbps_get (gras_dd_cbps_t *ps, + const char *name, + gras_datadesc_type_t **ddt); + +void +gras_dd_cbps_block_begin(gras_dd_cbps_t *ps); +void +gras_dd_cbps_block_end(gras_dd_cbps_t *ps); + + +/****************************************** + **** Declare datadescription manually **** + ******************************************/ + typedef void (*gras_datadesc_type_cb_void_t)(void *vars, gras_datadesc_type_t *p_type, void *data); @@ -181,15 +170,74 @@ gras_datadesc_declare_array_cb(const char *name, gras_datadesc_type_cb_void_t post, long int *code); +/**************************** + **** Parse C statements **** + ****************************/ +gras_error_t +gras_datadesc_parse(const char *name, + const char *Cdefinition, + long int *code); +#define GRAS_DEFINE_TYPE(name,def) \ + static const char * _gras_this_type_symbol_does_not_exist__##name=#def; def + +#define gras_type_symbol_parse(bag,name) \ + _gs_type_parse(bag, _gs_this_type_symbol_does_not_exist__##name) + +#define gs_type_get_by_symbol(bag,name) \ + (bag->bag_ops->get_type_by_name(bag, NULL, #name) ? \ + bag->bag_ops->get_type_by_name(bag, NULL, #name) : \ + gras_type_symbol_parse(bag, name) \ + ) + +/***************************** + **** NWS datadescription **** + *****************************/ -/* Use the datadescriptions */ -int -gras_datadesc_type_cmp(const gras_datadesc_type_t *d1, - const gras_datadesc_type_t *d2); +/** + * Basic types we can embeed in DataDescriptors. + */ +typedef enum + {CHAR_TYPE, DOUBLE_TYPE, FLOAT_TYPE, INT_TYPE, LONG_TYPE, SHORT_TYPE, + UNSIGNED_INT_TYPE, UNSIGNED_LONG_TYPE, UNSIGNED_SHORT_TYPE, STRUCT_TYPE} + DataTypes; +#define SIMPLE_TYPE_COUNT 9 +/*! \brief Describe a collection of data. + * +** A description of a collection of #type# data. #repetitions# is used only +** for arrays; it contains the number of elements. #offset# is used only for +** struct members in host format; it contains the offset of the member from the +** beginning of the struct, taking into account internal padding added by the +** compiler for alignment purposes. #members#, #length#, and #tailPadding# are +** used only for STRUCT_TYPE data; the #length#-long array #members# describes +** the members of the nested struct, and #tailPadding# indicates how many +** padding bytes the compiler adds to the end of the structure. +*/ -gras_error_t -gras_datadesc_cpy(gras_datadesc_type_t *type, void *src, void **dst); +typedef struct DataDescriptorStruct { + DataTypes type; + size_t repetitions; + size_t offset; + /*@null@*/ struct DataDescriptorStruct *members; + size_t length; + size_t tailPadding; +} DataDescriptor; +/** DataDescriptor for an array */ +#define SIMPLE_DATA(type,repetitions) \ + {type, repetitions, 0, NULL, 0, 0} +/** DataDescriptor for an structure member */ +#define SIMPLE_MEMBER(type,repetitions,offset) \ + {type, repetitions, offset, NULL, 0, 0} +/** DataDescriptor for padding bytes */ +#define PAD_BYTES(structType,lastMember,memberType,repetitions) \ + sizeof(structType) - offsetof(structType, lastMember) - \ + sizeof(memberType) * repetitions + +gras_error_t +gras_datadesc_from_nws(const char *name, + const DataDescriptor *desc, + size_t howmany, + long int *code); END_DECL diff --git a/include/datadesc_simple.h b/include/datadesc_simple.h deleted file mode 100644 index 5b2b21115d..0000000000 --- a/include/datadesc_simple.h +++ /dev/null @@ -1,110 +0,0 @@ -/* $Id$ */ - -/* gras/datadesc.h - Describing the data you want to exchange */ - -/* Authors: Martin Quinson */ -/* Copyright (C) 2003 the OURAGAN project. */ - -/* This program is free software; you can redistribute it and/or modify it - under the terms of the license (GNU LGPL) which comes with this package. */ - -#ifndef GRAS_DATADESC_SIMPLE_H -#define GRAS_DATADESC_SIMPLE_H - -#include /* offsetof() */ -#include /* size_t */ -#include - - -/*! C++ users need love */ -#ifndef BEGIN_DECL -# ifdef __cplusplus -# define BEGIN_DECL extern "C" { -# else -# define BEGIN_DECL -# endif -#endif - -/*! C++ users need love */ -#ifndef END_DECL -# ifdef __cplusplus -# define END_DECL } -# else -# define END_DECL -# endif -#endif -/* End of cruft for C++ */ - -BEGIN_DECL - -/**** - **** The NWS type and constructors - ****/ - -typedef enum - {CHAR_TYPE, DOUBLE_TYPE, FLOAT_TYPE, INT_TYPE, LONG_TYPE, SHORT_TYPE, - UNSIGNED_INT_TYPE, UNSIGNED_LONG_TYPE, UNSIGNED_SHORT_TYPE, STRUCT_TYPE} - DataTypes; -#define SIMPLE_TYPE_COUNT 9 - -typedef struct DataDescriptorStruct { - DataTypes type; - size_t repetitions; - size_t offset; - struct DataDescriptorStruct *members; - size_t length; - size_t tailPadding; -} DataDescriptor; -#ifndef NULL -#define NULL 0 -#endif -#define SIMPLE_DATA(type,repetitions) {type, repetitions, 0, NULL, 0, 0} -#define SIMPLE_MEMBER(type,repetitions,offset) \ - {type, repetitions, offset, NULL, 0, 0} -#define PAD_BYTES(structType,lastMember,memberType,repetitions) \ - sizeof(structType) - offsetof(structType, lastMember) - \ - sizeof(memberType) * repetitions - -/**** - **** Gras (opaque) type, constructors and functions - ****/ - -typedef struct gras_datadesc_ gras_datadesc_t; - -/* constructors, memory management */ -gras_error_t gras_datadesc_parse(const char *def, - gras_datadesc_t **dst); -gras_error_t gras_datadesc_from_nws(const DataDescriptor *desc, - size_t howmany, - gras_datadesc_t **dst); - -gras_error_t gras_datadesc_cpy(gras_datadesc_t *src, - gras_datadesc_t **dst); -void gras_datadesc_free(gras_datadesc_t **dd); - -/* basic functionnalities */ -int gras_datadesc_cmp(const gras_datadesc_t *d1, - const gras_datadesc_t *d2); - -gras_error_t gras_datadesc_sizeof_host(gras_datadesc_t *desc, - size_t *dst); -gras_error_t gras_datadesc_sizeof_network(gras_datadesc_t *desc, - size_t *dst); - -/* high level function needed in SG */ -gras_error_t gras_datadesc_data_cpy(const gras_datadesc_t *dd, - const void *src, - void **dst); - -/* high level functions needed in RL */ -gras_error_t gras_datadesc_convert_recv(const gras_datadesc_t *dd, - gras_trp_plugin_t *trp, - void **dst); -gras_error_t gras_datadesc_convert_send(const gras_datadesc_t *dd, - gras_trp_plugin_t *trp, - void *src); - -END_DECL - -#endif /* GRAS_DATADESC_SIMPLE_H */ - diff --git a/include/dd_type_bag.h b/include/dd_type_bag.h deleted file mode 100644 index c8d8772ffe..0000000000 --- a/include/dd_type_bag.h +++ /dev/null @@ -1,97 +0,0 @@ -/* gs_type_bag.h */ -#ifndef GS_TYPE_BAG_H -#define GS_TYPE_BAG_H - -/* used structs */ -struct s_gs_type_bag; -struct s_gs_type_driver; - -struct s_gs_type_bag_ops { - - void - (*_init) (struct s_gs_type_bag *p_type_bag); - - void - (*_exit) (struct s_gs_type_bag *p_type_bag); - - - void - (*register_incoming_connection) (struct s_gs_type_bag *p_type_bag, - struct s_gs_connection *p_connection); - - void - (*register_outgoing_connection) (struct s_gs_type_bag *p_type_bag, - struct s_gs_connection *p_connection); - - - void - (*store_type) (struct s_gs_type_bag *p_type_bag, - struct s_gs_connection *p_connection, - struct s_gs_type *p_type); - - void - (*store_incoming_type) (struct s_gs_type_bag *p_type_bag, - struct s_gs_connection *p_connection, - struct s_gs_type *p_type); - - struct s_gs_type * - (*get_type_by_name) (struct s_gs_type_bag *p_type_bag, - struct s_gs_connection *p_connection, - const char *name); - - struct s_gs_type * - (*get_type_by_code) (struct s_gs_type_bag *p_type_bag, - struct s_gs_connection *p_connection, - int code); - - void - (*mark_type) (struct s_gs_type_bag *p_type_bag, - struct s_gs_connection *p_connection, - const char *name); - - int - (*check_type_mark) (struct s_gs_type_bag *p_type_bag, - struct s_gs_connection *p_connection, - const char *name); - - - void - (*store_message) (struct s_gs_type_bag *p_type_bag, - struct s_gs_connection *p_connection, - struct s_gs_message *p_message); - - void - (*store_incoming_message) (struct s_gs_type_bag *p_type_bag, - struct s_gs_connection *p_connection, - struct s_gs_message *p_message); - - struct s_gs_message * - (*get_message_by_name) (struct s_gs_type_bag *p_type_bag, - struct s_gs_connection *p_connection, - const char *name); - - struct s_gs_message * - (*get_message_by_code) (struct s_gs_type_bag *p_type_bag, - struct s_gs_connection *p_connection, - int code); - - void - (*mark_message) (struct s_gs_type_bag *p_type_bag, - struct s_gs_connection *p_connection, - const char *name); - - int - (*check_message_mark) (struct s_gs_type_bag *p_type_bag, - struct s_gs_connection *p_connection, - const char *name); - -}; - -struct s_gs_type_bag { - struct s_gs_type_bag_ops *bag_ops; - struct s_gs_type_driver *p_type_driver; - void *specific; -}; - - -#endif /* GS_TYPE_BAG_H */ diff --git a/include/gras.h b/include/gras.h index 39fd95d791..6cc6123bbe 100644 --- a/include/gras.h +++ b/include/gras.h @@ -11,23 +11,12 @@ #ifndef GRAS_H #define GRAS_H -/* Oli's macro */ -#ifndef GS_FAILURE_CONTEXT -# define GS_FAILURE_CONTEXT -#endif /* GS_FAILURE_CONTEXT */ - -#define GS_FAILURE(str) \ - (fprintf(stderr, "FAILURE: %s(%s:%d)" GS_FAILURE_CONTEXT "%s\n", __func__, __FILE__, __LINE__, (str)), \ - abort()) - #define max(a, b) (((a) > (b))?(a):(b)) #define min(a, b) (((a) < (b))?(a):(b)) #define TRUE 1 #define FALSE 0 -/* end of Oli's cruft */ - #include #include @@ -45,13 +34,8 @@ #include #include -//#include -#include #include -#include -#include - #include #include diff --git a/include/messages.h b/include/messages.h index 5887aa5e3d..598886da40 100644 --- a/include/messages.h +++ b/include/messages.h @@ -53,7 +53,7 @@ typedef struct gras_msgentry_s gras_msgentry_t; */ typedef struct { /* public */ - gras_sock_t *sock; /** the socket on which the message was received (to answer) */ + gras_socket_t *sock; /** the socket on which the message was received (to answer) */ /* private */ gras_msgheader_t *header; @@ -92,7 +92,7 @@ gras_msgtype_register(gras_msgid_t msgId, * Create a new message, and send it on the network through the given socket. */ gras_error_t -gras_msg_new_and_send(gras_sock_t *sd, +gras_msg_new_and_send(gras_socket_t *sd, gras_msgid_t msgId, int seqCount, ...); @@ -210,7 +210,7 @@ gras_error_t gras_msg_handle(double timeOut); */ gras_error_t -gras_msg_send(gras_sock_t *sd, +gras_msg_send(gras_socket_t *sd, gras_msg_t *msg, e_gras_free_directive_t freeDirective); diff --git a/include/modules/base.h b/include/modules/base.h index e0a674881b..856cd0f14a 100644 --- a/include/modules/base.h +++ b/include/modules/base.h @@ -83,7 +83,7 @@ static const DataDescriptor msgResultDesc[] = * on localhost's stderr. */ void -grasRepportError (gras_sock_t *sock, gras_msgid_t id, int SeqCount, +grasRepportError (gras_socket_t *sock, gras_msgid_t id, int SeqCount, const char *severeError, gras_error_t errcode, const char* format,...); diff --git a/include/socket.h b/include/socket.h deleted file mode 100644 index c0169ad6ea..0000000000 --- a/include/socket.h +++ /dev/null @@ -1,223 +0,0 @@ -/* $Id$ */ - -/* gras/socket.h - handling sockets in GRAS */ - -/* Authors: Martin Quinson */ -/* Copyright (C) 2003 the OURAGAN project. */ - -/* This program is free software; you can redistribute it and/or modify it - under the terms of the license (GNU LGPL) which comes with this package. */ - - -#ifndef GRAS_SOCK_H -#define GRAS_SOCK_H - -#include /* offsetof() */ -#include /* size_t */ -#include - - -/*! C++ users need love */ -#ifndef BEGIN_DECL -# ifdef __cplusplus -# define BEGIN_DECL extern "C" { -# else -# define BEGIN_DECL -# endif -#endif - -/*! C++ users need love */ -#ifndef END_DECL -# ifdef __cplusplus -# define END_DECL } -# else -# define END_DECL -# endif -#endif -/* End of cruft for C++ */ - -BEGIN_DECL - -/****************************************************************************/ -/* Openning/Maintaining/Closing connexions */ -/****************************************************************************/ -/** Number of channel opened at most on a given host within SimGrid */ -#define MAX_CHANNEL 10 - -/*! Type of a communication socket */ -typedef struct gras_sock_s gras_sock_t; - -/** - * gras_sock_client_open: - * @host: name of the host we want to connect to - * @Param2: port on which we want to connect on this host - * @sock: Newly created socket - * @Returns: an errcode - * - * Attempts to establish a connection to the server listening to host:port - */ -gras_error_t -gras_sock_client_open(const char *host, short port, - /* OUT */ gras_sock_t **sock); - -/** - * gras_sock_server_open: - * @Param1: starting port - * @Param2: ending port - * @sock: Newly create socket - * @Returns: an errcode - * - * Attempts to bind to any port between #startingPort# and #endingPort#, - * inclusive. - * - * You can get the port on which you connected using grasSockGetPort(). - */ -gras_error_t -gras_sock_server_open(unsigned short startingPort, - unsigned short endingPort, - /* OUT */ gras_sock_t **sock); - -/** - * gras_sock_close: - * @sock: The socket to close. - * @Returns: an errcode - * - * Tears down a socket. - */ -gras_error_t gras_sock_close(gras_sock_t *sock); - - -/****************************************************************************/ -/* Converting DNS name <-> IP */ -/****************************************************************************/ -/** - * gras_sock_get_peer_name: - * @sd: - * @Returns: the DNS name of the host connected to #sd#, or descriptive text if - * #sd# is not an inter-host connection: returns NULL in case of error - * - * The value returned should not be freed. - */ -char * -gras_sock_get_peer_name(gras_sock_t *sd); - -/** - * gras_sock_get_peer_port: - * @sd: - * @Returns: the port number on the other side of socket sd. -1 is returned - * if pipes or unknown - */ -unsigned short -gras_sock_get_peer_port(gras_sock_t *sd); - -/** - * gras_sock_get_peer_addr: - * @sd: - * @Returns: the IP address of the other side of this socket. - * - * can return NULL (out of memory condition). - * Do not free the result. - */ -char * -gras_sock_get_peer_addr(gras_sock_t *sd); - -/** - * gras_sock_get_my_port: - * @sd: - * @Returns: the port number on the this side of socket sd. -1 is returned - * if pipes or unknown - */ -unsigned short -gras_sock_get_my_port(gras_sock_t *sd); - -/* ************************************************************************** - * Raw sockets and BW experiments (should be placed in another file) - * **************************************************************************/ -typedef struct gras_rawsock_s gras_rawsock_t; - -/** - * gras_rawsock_client_open: - * - * Establishes a connection to @machine : @port on which the buffer sizes have - * been set to @bufSize bytes. - * - * Those sockets are meant to send raw data without any conversion, for example - * for bandwidth tests. - */ -gras_error_t -gras_rawsock_client_open(const char *host, short port, unsigned int bufSize, - /* OUT */ gras_rawsock_t **sock); - -/** - * gras_rawsock_server_open: - * - * Open a connexion waiting for external input, on which the buffer sizes have - * been set to @bufSize bytes. - * - * Those sockets are meant to send raw data without any conversion, for example - * for bandwidth tests. - */ -gras_error_t -gras_rawsock_server_open(unsigned short startingPort, unsigned short endingPort, - unsigned int bufSize, /* OUT */ gras_rawsock_t **sock); - -/** - * gras_rawsock_close: - * - * Close a raw socket. - * - * Those sockets are meant to send raw data without any conversion, for example - * for bandwidth tests. - */ -gras_error_t -gras_rawsock_close(gras_rawsock_t *sock); - -/** - * gras_rawsocket_get_my_port: - * @sd: - * @Returns: the port number on the this side of socket sd. -1 is returned - * if pipes or unknown - */ -unsigned short -gras_rawsocket_get_my_port(gras_rawsock_t *sd); - -/** - * gras_rawsocket_get_peer_port: - * @sd: - * @Returns: the port number on the other side of socket sd. -1 is returned - * if pipes or unknown - */ -unsigned short -gras_rawsock_get_peer_port(gras_rawsock_t *sd); - -/** - * gras_rawsock_send: - * @sock: on which raw socket to send the data - * @expSize: total size of data sent - * @msgSize: size of each message sent one after the other - * - * Send a raw bunch of data, for example for a bandwith test. - */ - -gras_error_t -gras_rawsock_send(gras_rawsock_t *sd, unsigned int expSize, unsigned int msgSize); - -/** - * gras_rawsock_recv: - * @sock: on which raw socket to read the data - * @expSize: total size of data received - * @msgSize: size of each message received one after the other - * @timeout: time to wait for that data - * - * Receive a raw bunch of data, for example for a bandwith test. - */ - -gras_error_t -gras_rawsock_recv(gras_rawsock_t *sd, unsigned int expSize, unsigned int msgSize, - unsigned int timeout); - - -END_DECL - -#endif /* GRAS_SOCK_H */ - diff --git a/include/transport.h b/include/transport.h index ffe6e6e4c7..2b88d120fc 100644 --- a/include/transport.h +++ b/include/transport.h @@ -14,8 +14,7 @@ #ifndef GRAS_TRANSPORT_H #define GRAS_TRANSPORT_H -/* each plugin implements the socket the way it wants */ -typedef void gras_trp_sock_t; +typedef struct s_gras_socket gras_socket_t; /* A plugin type */ typedef struct gras_trp_plugin_ gras_trp_plugin_t; @@ -25,9 +24,21 @@ gras_error_t gras_trp_init(void); void gras_trp_exit(void); -gras_error_t gras_trp_plugin_get_by_name(const char *name, - gras_trp_plugin_t **dst); - - +gras_error_t gras_socket_client(const char *host, + unsigned short port, + unsigned int bufSize, + /* OUT */ gras_socket_t **dst); +gras_error_t gras_socket_server(unsigned short port, + unsigned int bufSize, + /* OUT */ gras_socket_t **dst); +void gras_socket_close(gras_socket_t *sd); + + +gras_error_t gras_trp_bloc_send(gras_socket_t *sd, + void *data, + size_t size); +gras_error_t gras_trp_bloc_recv(gras_socket_t *sd, + void *data, + size_t size); #endif /* GRAS_TRANSPORT_H */ diff --git a/ltmain.sh b/ltmain.sh index 99938a5c09..4b9f940539 100644 --- a/ltmain.sh +++ b/ltmain.sh @@ -55,8 +55,8 @@ modename="$progname" # Constants. PROGRAM=ltmain.sh PACKAGE=libtool -VERSION=1.5.0a -TIMESTAMP=" (1.1220.2.35 2003/11/12 18:51:58) Debian$Rev: 179 $" +VERSION=1.5.2 +TIMESTAMP=" (1.1220.2.60 2004/01/25 12:25:08) Debian$Rev: 192 $" default_mode= help="Try \`$progname --help' for more information." @@ -890,6 +890,7 @@ EOF no_install=no objs= non_pic_objects= + precious_files_regex= prefer_static_libs=no preload=no prev= @@ -1053,6 +1054,11 @@ EOF prev= continue ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; release) release="-$arg" prev= @@ -1419,6 +1425,11 @@ EOF -o) prev=output ;; + -precious-files-regex) + prev=precious_regex + continue + ;; + -release) prev=release continue @@ -2321,9 +2332,10 @@ EOF else $show "extracting exported symbol list from \`$soname'" save_ifs="$IFS"; IFS='~' - eval cmds=\"$extract_expsyms_cmds\" + cmds=$extract_expsyms_cmds for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done @@ -2334,9 +2346,10 @@ EOF if test -f "$output_objdir/$newlib"; then :; else $show "generating import library for \`$soname'" save_ifs="$IFS"; IFS='~' - eval cmds=\"$old_archive_from_expsyms_cmds\" + cmds=$old_archive_from_expsyms_cmds for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done @@ -2615,8 +2628,8 @@ EOF *" $path "*) ;; *) newlib_search_path="$newlib_search_path $path";; esac - path="" fi + path="" ;; *) path="-L$path" @@ -3084,6 +3097,10 @@ EOF *.$objext) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi removelist="$removelist $p" ;; *) ;; @@ -3593,10 +3610,11 @@ EOF $show "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $run $rm $export_symbols - eval cmds=\"$export_symbols_cmds\" + cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" if len=`expr "X$cmd" : ".*"` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then $show "$cmd" @@ -3713,19 +3731,23 @@ EOF # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then - eval cmds=\"$module_expsym_cmds\" + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds else - eval cmds=\"$module_cmds\" + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - eval cmds=\"$archive_expsym_cmds\" + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds else - eval cmds=\"$archive_cmds\" + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds fi fi - if test "X$skipped_export" != "X:" && len=`expr "X$cmds" : ".*"` && + if test "X$skipped_export" != "X:" && len=`expr "X$test_cmds" : ".*"` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else @@ -3810,6 +3832,7 @@ EOF save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done @@ -3826,19 +3849,28 @@ EOF # value of $libobjs for piecewise linking. # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - eval cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds else - eval cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi fi # Append the command to remove the reloadable object files # to the just-reset $cmds. - eval cmds=\"\$cmds~$rm $delfiles\" + eval cmds=\"\$cmds~\$rm $delfiles\" fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done @@ -3989,10 +4021,11 @@ EOF reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" - eval cmds=\"$reload_cmds\" + cmds=$reload_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done @@ -4025,10 +4058,11 @@ EOF # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" - eval cmds=\"$reload_cmds\" + cmds=$reload_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done @@ -5000,13 +5034,13 @@ fi\ # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then - eval cmds=\"$old_archive_from_new_cmds\" + cmds=$old_archive_from_new_cmds else eval cmds=\"$old_archive_cmds\" if len=`expr "X$cmds" : ".*"` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then - : + cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts $echo "using piecewise archive linking..." @@ -5058,12 +5092,13 @@ fi\ if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else - eval cmds=\"\$concat_cmds~$old_archive_cmds\" + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do + eval cmd=\"$cmd\" IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? @@ -5481,10 +5516,11 @@ relink_command=\"$relink_command\"" # Do each command in the postinstall commands. lib="$destdir/$realname" - eval cmds=\"$postinstall_cmds\" + cmds=$postinstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done @@ -5697,16 +5733,17 @@ relink_command=\"$relink_command\"" $show "$install_prog $file $oldlib" $run eval "$install_prog \$file \$oldlib" || exit $? - if test -n "$stripme" && test -n "$striplib"; then + if test -n "$stripme" && test -n "$old_striplib"; then $show "$old_striplib $oldlib" $run eval "$old_striplib $oldlib" || exit $? fi # Do each command in the postinstall commands. - eval cmds=\"$old_postinstall_cmds\" + cmds=$old_postinstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done @@ -5741,10 +5778,11 @@ relink_command=\"$relink_command\"" for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. - eval cmds=\"$finish_cmds\" + cmds=$finish_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || admincmds="$admincmds $cmd" @@ -6018,10 +6056,11 @@ relink_command=\"$relink_command\"" if test "$mode" = uninstall; then if test -n "$library_names"; then # Do each command in the postuninstall commands. - eval cmds=\"$postuninstall_cmds\" + cmds=$postuninstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" if test "$?" -ne 0 && test "$rmforce" != yes; then @@ -6033,10 +6072,11 @@ relink_command=\"$relink_command\"" if test -n "$old_library"; then # Do each command in the old_postuninstall commands. - eval cmds=\"$old_postuninstall_cmds\" + cmds=$old_postuninstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" + eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" if test "$?" -ne 0 && test "$rmforce" != yes; then @@ -6281,6 +6321,8 @@ The following components of LINK-COMMAND are treated specially: -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries diff --git a/src/gras/Common/gras_msg.c b/src/gras/Common/gras_msg.c deleted file mode 100644 index eafe695971..0000000000 --- a/src/gras/Common/gras_msg.c +++ /dev/null @@ -1,510 +0,0 @@ -/* $Id$ */ - -/* grasMsg - Function related to messaging (code shared between RL and SG) */ - -/* Authors: Martin Quinson */ -/* Copyright (C) 2003 the OURAGAN project. */ - -/* This program is free software; you can redistribute it and/or modify it - under the terms of the license (GNU LGPL) which comes with this package. */ - -#include "gras_private.h" -#include - -/*@null@*/static gras_msgentry_t *grasMsgList = NULL; -static unsigned int grasMsgCount = 0; - -/** - * Register a new message type to the system - */ - -gras_error_t -gras_msgtype_register(gras_msgid_t message, - const char *name, - int sequence_count, - ...) { - gras_msgentry_t *entry=grasMsgEntryGet(message); - gras_cblist_t *cbl=gras_cb_get(message); - int i; - DataDescriptor *dd; - size_t ddCount; - va_list ap; - - // fprintf(stderr,"Register message '%s' under ID %d. Sequence count=%d\n", - //name,(int)message,sequence_count); - - if (entry) { /* Check that it's the same entry re-registered */ - if (strcmp(name,entry->name)) { - fprintf(stderr,"Second registration of message %d with another name. (old=%s,new=%s)\n", - (int)message,entry->name,name); - return malloc_error; - } - if (sequence_count != entry->seqCount) { - fprintf(stderr, - "Second registration of message %s with another sequence count. (old=%d,new=%d)\n", - entry->name,entry->seqCount,sequence_count); - return mismatch_error; - } - - va_start(ap, sequence_count); - for (i=0;iddCount[i]) { - fprintf(stderr, - "Different re-registration of message %s: DataDescriptor count is different in sequence %d (is %d, was %d)\n", - entry->name, i, ddCount, entry->ddCount[i]); - return sanity_error; - } - if (gras_datadesc_cmp(dd,ddCount, entry->dd[i],ddCount)) { - fprintf(stderr, - "Different re-registration of message %s: DataDescriptor of sequence %d is different\n", - entry->name, i); - return sanity_error; - } - } - va_end(ap); - - } else { /* build a new entry */ - if (grasMsgCount++) { - grasMsgList = (gras_msgentry_t *)realloc(grasMsgList,sizeof(gras_msgentry_t)*grasMsgCount); - } else { - grasMsgList = (gras_msgentry_t *)malloc(sizeof(gras_msgentry_t)*grasMsgCount); - } - if (!grasMsgList) { - fprintf(stderr, "PANIC: memory allocation of %d bytes in gras_msgtype_register() failed (Message table LOST).\n", - sizeof(gras_msgentry_t)*grasMsgCount); - grasMsgCount=0; - return malloc_error; - } - entry = &(grasMsgList[grasMsgCount-1]); - - entry->id = message; - if (!(entry->name = strdup(name))) { - fprintf(stderr, "gras_msgtype_register: memory allocation failed.\n"); - grasMsgCount--; - return malloc_error; - } - entry->seqCount = sequence_count; - if (sequence_count) { - if (!(entry->dd = (DataDescriptor**)malloc(sizeof(DataDescriptor*)*sequence_count))) { - fprintf(stderr, "gras_msgtype_register: memory allocation of %d bytes failed.\n", - sizeof(DataDescriptor*)*sequence_count); - free(entry->name); - grasMsgCount--; - return malloc_error; - } - if (!(entry->ddCount = (size_t*)malloc(sizeof(size_t)*sequence_count))) { - fprintf(stderr, "gras_msgtype_register: memory allocation of %d bytes failed.\n", - sizeof(size_t)*sequence_count); - free(entry->dd); - free(entry->name); - grasMsgCount--; - return malloc_error; - } - } else { - entry->dd=NULL; - entry->ddCount=NULL; - } - va_start(ap, sequence_count); - for (i=0;iddCount[i]=ddCount; - if (ddCount) { - if (!(entry->dd[i] = (DataDescriptor*)malloc(sizeof(DataDescriptor)*ddCount))) { - fprintf(stderr, "gras_msgtype_register: memory allocation of %d bytes failed.\n", - sizeof(DataDescriptor)*ddCount); - for (i--;i>=0;i--) free(entry->dd[i]); - free(entry->ddCount); - free(entry->dd); - free(entry->name); - grasMsgCount--; - return malloc_error; - } - } else { - entry->dd[i]=NULL; - } - memcpy(entry->dd[i],dd,sizeof(DataDescriptor)*ddCount); - } - va_end(ap); - } - if (cbl) { - fprintf(stderr,"Warning, message type %s registered twice on this host\n", - entry->name); - } else { - return gras_cb_create(entry->id); - } - - return no_error; -} - -/* - * Retrieve the entry associated with a message id - */ -gras_msgentry_t * -grasMsgEntryGet(gras_msgid_t id) { - int i; - - for (i=0 ; iversion,0,sizeof(res->version)); - strcpy(res->version,GRASVERSION); - res->message = msgId; - res->dataSize = dataSize; - res->seqCount = seqCount; - - return res; -} - -gras_msg_t *gras_msg_new_va(gras_msgid_t msgId, - e_gras_free_directive_t free_data, - int seqCount, - va_list ap) { - gras_msg_t *res; - int i; - unsigned int networkSize=0; - - /* malloc the needed room, and sanity check */ - if (!(res=(gras_msg_t*)malloc(sizeof(gras_msg_t)))) { - fprintf(stderr,"gras_msg_new(): Malloc error (wanted %d bytes)\n",sizeof(gras_msg_t)); - return NULL; - } - res->freeDirective=free_data; - - if (!(res->entry=grasMsgEntryGet(msgId))) { - fprintf(stderr,"gras_msg_new(): unknown msg id %d\n",msgId); - free(res); - return NULL; - } - if (res->entry->seqCount != seqCount) { - fprintf(stderr,"Damnit: you passed %d sequences to build a %s msg, where %d were expected\n", - seqCount,res->entry->name,res->entry->seqCount); - free(res); - return NULL; - } - if (seqCount) { - if (!(res->dataCount=(unsigned int*)malloc(sizeof(unsigned int)*seqCount))) { - fprintf(stderr,"gras_msg_new(): Malloc error (wanted %d bytes)\n", - (sizeof(unsigned int)*seqCount)); - free(res); - return NULL; - } - if (!(res->data=(void**)malloc(sizeof(void*)*seqCount))) { - fprintf(stderr,"gras_msg_new(): Malloc error (wanted %d bytes)\n", - (sizeof(void*)*seqCount)); - free(res->dataCount); - free(res); - return NULL; - } - } else { - res->dataCount = NULL; - res->data = NULL; - } - - /* populate the message */ - networkSize += DataSize(headerDescriptor,headerDescriptorCount,NETWORK_FORMAT); - networkSize += DataSize(countDescriptor,countDescriptorCount,NETWORK_FORMAT) * seqCount; - - for (i=0; idata[i]=va_arg(ap, void*); - res->dataCount[i]=va_arg(ap, int); - if (res->dataCount[i] > 1000) { - fprintf(stderr,"GRAS WARNING: datacount>1000 in a message. You may want to check the arguments passed to gras_msg_new().\n"); - } - if (res->dataCount[i] < 0) { - fprintf(stderr,"GRAS ERROR: datacount<0 in a message. Check the arguments passed to gras_msg_new().\n"); - free(res->dataCount); - free(res->data); - free(res); - return NULL; - } - - networkSize += res->dataCount[i] * - DataSize(res->entry->dd[i],res->entry->ddCount[i],NETWORK_FORMAT); - } - - /* finish filling the fields */ - if (!(res->header=grasMsgHeaderNew(msgId,networkSize,seqCount))) { - free(res->data); - free(res->dataCount); - free(res); - return NULL; - } - res->sock=NULL; - return res; -} - -gras_msg_t *gras_msg_new(gras_msgid_t msgId, - e_gras_free_directive_t free_data, - int seqCount, - ...) { - gras_msg_t *res; - va_list ap; - - va_start(ap, seqCount); - res=gras_msg_new_va(msgId,free_data,seqCount,ap); - va_end(ap); - - return res; -} - -gras_error_t -gras_msg_new_and_send(gras_sock_t *sd, - gras_msgid_t msgId, - int seqCount, - ...) { - - gras_msg_t *msg; - va_list ap; - - va_start(ap, seqCount); - msg=gras_msg_new_va(msgId,free_after_use,seqCount,ap); - va_end(ap); - if (!msg) return unknown_error; - - return gras_msg_send(sd,msg,free_after_use); -} - - -gras_msg_t *gras_msg_copy(gras_msg_t *msg) { - gras_msg_t *res; - int i; - - fprintf(stderr,"gras_msg_copy: \n"); - - /* malloc the needed room, and sanity check */ - if (!(res=(gras_msg_t*)malloc(sizeof(gras_msg_t)))) { - fprintf(stderr,"gras_msg_new(): Malloc error (wanted %d bytes)\n",sizeof(gras_msg_t)); - return NULL; - } - res->freeDirective=free_after_use; - res->entry=msg->entry; - - if (!(res->dataCount=(unsigned int*)malloc(sizeof(unsigned int)*res->entry->seqCount))) { - fprintf(stderr,"gras_msg_new(): Malloc error (wanted %d bytes)\n", - (sizeof(unsigned int)*res->entry->seqCount)); - free(res); - return NULL; - } - if (!(res->data=(void**)malloc(sizeof(void*)*res->entry->seqCount))) { - fprintf(stderr,"gras_msg_new(): Malloc error (wanted %d bytes)\n", - (sizeof(void*)*res->entry->seqCount)); - free(res->dataCount); - free(res); - return NULL; - } - - /* populate the message */ - for (i=0; ientry->seqCount; i++) { - res->data[i]= gras_datadesc_copy_data(msg->entry->dd[i],msg->entry->ddCount[i],res->data[i]); - res->dataCount[i]=msg->dataCount[i]; - } - - /* finish filling the fields */ - if (!(res->header=grasMsgHeaderNew(msg->header->message, - msg->header->dataSize, - msg->header->seqCount))) { - free(res->data); - free(res->dataCount); - free(res); - return NULL; - } - res->sock=msg->sock; - - return res; -} - - -void gras_msg_free(gras_msg_t *msg) { - int i; - - if (!msg) return; - if (msg->freeDirective == free_after_use) - for (i=0; ientry->seqCount; i++) - free(msg->data[i]); - gras_sock_close(msg->sock); - free(msg->header); - // data isn't copied by MsgNew - free (msg->data); - free (msg->dataCount); - free (msg); -} - -gras_error_t gras_msg_handle(double timeOut) { - grasProcessData_t *pd=grasProcessDataGet(); - int i; - gras_error_t errcode; - gras_msg_t *msg; - gras_cblist_t *cbl; - - if (pd->grasMsgQueueLen) { - /* handle queued message */ - - msg = pd->grasMsgQueue[0]; - memmove(pd->grasMsgQueue[0],pd->grasMsgQueue[1],(pd->grasMsgQueueLen-1)*sizeof(gras_msg_t)); - pd->grasMsgQueueLen--; - if (pd->grasMsgQueueLen == 0) { - /* size reached 0. Free the queue so that the next enlargement (with malloc) don't leak*/ - free(pd->grasMsgQueue); - /* if size!=0 don't loose the time to realloc to only gain 4 bytes */ - } - fprintf(stderr,"%s:%d: gras_msg_handle: The message was queued\n",__FILE__,__LINE__); - return no_error; - } else { - /* receive a message from the net */ - if ((errcode=grasMsgRecv(&msg,timeOut))) { - if (errcode == timeout_error) { - return no_error; - } else { - fprintf(stderr,"gras_msg_handle: error '%s' while receiving\n",gras_error_name(errcode)); - return errcode; - } - } - } - - /* - fprintf(stderr,"GRAS: Handle an incomming message '%s' (datasize=%d, sd=%p)\n", - msg->entry->name,msg->header->dataSize,msg->sock); - */ - - if (!(cbl=gras_cb_get(msg->entry->id))) { - fprintf(stderr,"Message %s is not registered on this host.\n", - msg->entry->name); - gras_msg_free(msg); - return mismatch_error; - } - - for (i = cbl->cbCount - 1; i>=0 ; i--) { - if ((*(cbl->cb[i]))(msg)) { - // if (cbl->cbTTL[i] > 0 && (!--(cbl->cbTTL[i]))) { - //fprintf(stderr,"GRAS FIXME: Remove the callback from the queue after use if needed.\n"); - //} - break; - } - } - - if (i<0) { - fprintf(stderr, - "No callback of msg type %s accepts this message. Discarding it\n", - msg->entry->name); - gras_msg_free(msg); - return mismatch_error; - } - return no_error; -} - -gras_error_t -gras_msg_wait(double timeOut, - gras_msgid_t id, - gras_msg_t **message) { - int i; - gras_error_t errcode; - double start,now; - gras_msgentry_t *entry=grasMsgEntryGet(id); - grasProcessData_t *pd=grasProcessDataGet(); - - if (!entry) { - fprintf(stderr,"gras_msg_wait: message id %d is not registered\n",id); - return mismatch_error; - } - - *message = NULL; - start=now=gras_time(); - - for (i=0;igrasMsgQueueLen;i++) { - if (pd->grasMsgQueue[i]->header->message == id) { - *message = pd->grasMsgQueue[i]; - memmove(pd->grasMsgQueue[i],pd->grasMsgQueue[i+1],(pd->grasMsgQueueLen-i-1)*sizeof(gras_msg_t)); - pd->grasMsgQueueLen--; - if (pd->grasMsgQueueLen == 0) { - /* size reached 0. Free the queue so that the next enlargement (with malloc) don't leak*/ - free(pd->grasMsgQueue); - /* if size!=0 don't loose the time to realloc to only gain 4 bytes */ - } - fprintf(stderr,"%s:%d: gras_msg_wait: The message was queued\n",__FILE__,__LINE__); - return no_error; - } - } - - while (1) { - if ((errcode=grasMsgRecv(message,timeOut))) { - if (errcode != timeout_error) - fprintf(stderr,"gras_msg_wait: error '%s' while receiving\n",gras_error_name(errcode)); - return errcode; - } - - if ((*message)->header->message != id) { - fprintf(stderr,"gras_msg_wait: Got message %s while waiting for message %s. Queue it.\n", - (*message)->entry->name,entry->name); - if (pd->grasMsgQueueLen++) { - pd->grasMsgQueue = (gras_msg_t **)realloc(pd->grasMsgQueue, - sizeof(gras_msg_t)*pd->grasMsgQueueLen); - } else { - pd->grasMsgQueue = (gras_msg_t **)malloc(sizeof(gras_msg_t)*pd->grasMsgQueueLen); - } - if (!pd->grasMsgQueue) { - fprintf(stderr, "PANIC: memory allocation of %d bytes in gras_msg_wait() failed (Queued messages are LOST).\n", - sizeof(gras_msg_t)*pd->grasMsgQueueLen); - pd->grasMsgQueueLen=0; - return malloc_error; - } - pd->grasMsgQueue[pd->grasMsgQueueLen - 1] = *message; - *message=NULL; - } else { - // fprintf(stderr,"Waited for %s successfully\n",(*message)->entry->name); - return no_error; - } - now=gras_time(); - if (now - start + 0.001 < timeOut) - return timeout_error; - } -} - - -gras_error_t -gras_cb_register(gras_msgid_t message, - int TTL, - gras_cb_t cb) { - - gras_cblist_t *cbl=gras_cb_get(message); - - if (!cbl) { - fprintf(stderr,"Try to register a callback for an unregistered message id %d\n",message); - return sanity_error; - } - if (cbl->cbCount++) { - cbl->cb = (gras_cb_t *)realloc(cbl->cb, - sizeof(gras_cb_t)*cbl->cbCount); - cbl->cbTTL = (int *)realloc(cbl->cbTTL, sizeof(int)*cbl->cbCount); - } else { - cbl->cb = (gras_cb_t *)malloc(sizeof(gras_cb_t)*cbl->cbCount); - cbl->cbTTL = (int *)malloc( sizeof(int)*cbl->cbCount); - } - if (!cbl->cb || !cbl->cbTTL) { - fprintf(stderr,"gras_cb_register(): Malloc error (All callbacks for msg %d lost)\n", - message); - cbl->cb=NULL; - cbl->cbTTL=NULL; /* Yes, leaking here, but we're dead anyway */ - cbl->cbCount=0; - return malloc_error; - } - cbl->cb [ cbl->cbCount-1 ]=cb; - cbl->cbTTL[ cbl->cbCount-1 ]=TTL; - - return no_error; -} diff --git a/src/gras/DataDesc/datadesc.c b/src/gras/DataDesc/datadesc.c index 90b19c701f..984df708ad 100644 --- a/src/gras/DataDesc/datadesc.c +++ b/src/gras/DataDesc/datadesc.c @@ -11,9 +11,20 @@ #include "DataDesc/datadesc_private.h" GRAS_LOG_NEW_DEFAULT_SUBCATEGORY(DataDesc,GRAS); -/* FIXME: make this machine-dependent using a trick such as UserData*/ +/* FIXME: make this host-dependent using a trick such as UserData*/ gras_set_t *gras_datadesc_set_local=NULL; + +/* callback for array size when sending strings */ +static int +_strlen_cb(void *vars, + gras_datadesc_type_t *type, + void *data) { + + return 1+(long int)strlen(data); +} + + /** * gras_datadesc_init: * @@ -22,12 +33,92 @@ gras_set_t *gras_datadesc_set_local=NULL; void gras_datadesc_init(void) { gras_error_t errcode; + gras_datadesc_type_t *ddt; /* What to add */ + gras_datadesc_type_t *elm; /* element of ddt when needed */ VERB0("Initializing DataDesc"); - errcode = gras_dd_typeset_create(GRAS_THISARCH,&gras_datadesc_set_local); - gras_assert0(errcode==no_error, - "Impossible to create the data set containg locally known types"); + TRYFAIL(gras_set_new(&gras_datadesc_set_local)); + + TRYFAIL(gras_ddt_new_scalar("signed char", + gras_ddt_scalar_char, e_gras_dd_scalar_encoding_sint, + NULL, &ddt)); + TRYFAIL(gras_ddt_register(ddt)); + + TRYFAIL(gras_ddt_new_scalar("unsigned char", + gras_ddt_scalar_char, e_gras_dd_scalar_encoding_uint, + NULL, &ddt)); + TRYFAIL(gras_ddt_register(ddt)); + + + TRYFAIL(gras_ddt_new_scalar("signed short int", + gras_ddt_scalar_short, e_gras_dd_scalar_encoding_sint, + NULL, &ddt)); + TRYFAIL(gras_ddt_register(ddt)); + + TRYFAIL(gras_ddt_new_scalar("unsigned short int", + gras_ddt_scalar_short, e_gras_dd_scalar_encoding_uint, + NULL, &ddt)); + TRYFAIL(gras_ddt_register(ddt)); + + + TRYFAIL(gras_ddt_new_scalar("signed int", + gras_ddt_scalar_int, e_gras_dd_scalar_encoding_sint, + NULL, &ddt)); + TRYFAIL(gras_ddt_register(ddt)); + + TRYFAIL(gras_ddt_new_scalar("unsigned int", + gras_ddt_scalar_int, e_gras_dd_scalar_encoding_uint, + NULL, &ddt)); + TRYFAIL(gras_ddt_register(ddt)); + + + TRYFAIL(gras_ddt_new_scalar("signed long int", + gras_ddt_scalar_long, e_gras_dd_scalar_encoding_sint, + NULL, &ddt)); + TRYFAIL(gras_ddt_register(ddt)); + + TRYFAIL(gras_ddt_new_scalar("unsigned long int", + gras_ddt_scalar_long, e_gras_dd_scalar_encoding_uint, + NULL, &ddt)); + TRYFAIL(gras_ddt_register(ddt)); + + + TRYFAIL(gras_ddt_new_scalar("signed long long int", + gras_ddt_scalar_long_long, e_gras_dd_scalar_encoding_sint, + NULL, &ddt)); + TRYFAIL(gras_ddt_register(ddt)); + + TRYFAIL(gras_ddt_new_scalar("unsigned long long int", + gras_ddt_scalar_long_long, e_gras_dd_scalar_encoding_uint, + NULL, &ddt)); + TRYFAIL(gras_ddt_register(ddt)); + + + TRYFAIL(gras_ddt_new_scalar("data pointer", + gras_ddt_scalar_pdata, e_gras_dd_scalar_encoding_uint, + NULL, &ddt)); + TRYFAIL(gras_ddt_register(ddt)); + + TRYFAIL(gras_ddt_new_scalar("function pointer", + gras_ddt_scalar_pfunc, e_gras_dd_scalar_encoding_uint, + NULL, &ddt)); + TRYFAIL(gras_ddt_register(ddt)); + + + TRYFAIL(gras_ddt_new_scalar("float", + gras_ddt_scalar_float, e_gras_dd_scalar_encoding_float, + NULL, &ddt)); + TRYFAIL(gras_ddt_register(ddt)); + + TRYFAIL(gras_ddt_new_scalar("double", + gras_ddt_scalar_float, e_gras_dd_scalar_encoding_float, + NULL,&ddt)); + TRYFAIL(gras_ddt_register(ddt)); + + TRYFAIL(gras_ddt_get_by_name("unsigned char",&elm)); + TRYFAIL(gras_ddt_new_array("string", elm, 0, _strlen_cb, NULL, &ddt)); + TRYFAIL(gras_ddt_register(ddt)); } /** diff --git a/src/gras/DataDesc/datadesc_interface.h b/src/gras/DataDesc/datadesc_interface.h index 53a7df45da..85fb1d7a82 100644 --- a/src/gras/DataDesc/datadesc_interface.h +++ b/src/gras/DataDesc/datadesc_interface.h @@ -1,6 +1,8 @@ /* $Id$ */ -/* datadesc_interface - declarations visible within GRAS, but not public */ +/* datadesc - describing the data to exchange */ + +/* module's public interface exported within GRAS, but not to end user. */ /* Authors: Olivier Aumage, Martin Quinson */ /* Copyright (C) 2003, 2004 the GRAS posse. */ @@ -16,22 +18,37 @@ void gras_datadesc_init(void); void gras_datadesc_exit(void); +/* - main functions - */ +/* compare two data type description */ +int +gras_datadesc_type_cmp(const gras_datadesc_type_t *d1, + const gras_datadesc_type_t *d2); + + +/* Copy a described data in memory */ +gras_error_t +gras_datadesc_cpy(gras_datadesc_type_t *type, void *src, void **dst); + +/* Send stuff */ +gras_error_t +gras_datadesc_send(gras_socket_t *sock, gras_datadesc_type_t *type, void *src); + +/* Receive (and convert) stuff */ +gras_error_t +gras_datadesc_recv(gras_socket_t *sock, gras_datadesc_type_t *type, void **dst); + + +/* -- */ /* free a given ddt */ void gras_ddt_free(gras_datadesc_type_t **type); /* declare in the given set, and retrieve afterward */ -gras_error_t gras_ddt_register(gras_set_t *set, - gras_datadesc_type_t *type); -gras_error_t gras_ddt_get_by_name(gras_set_t *set, - const char *name, +gras_error_t gras_ddt_register(gras_datadesc_type_t *type); +gras_error_t gras_ddt_get_by_name(const char *name, + gras_datadesc_type_t **type); +gras_error_t gras_ddt_get_by_code(int code, gras_datadesc_type_t **type); - - -/* create a type set, and bootstrap it by declaring all basic types in it */ -gras_error_t -gras_dd_typeset_create(int gras_arch, - gras_set_t **set); #endif /* GRAS_DATADESC_INTERFACE_H */ diff --git a/src/gras/DataDesc/datadesc_private.h b/src/gras/DataDesc/datadesc_private.h index 83d32c1afc..be6971f969 100644 --- a/src/gras/DataDesc/datadesc_private.h +++ b/src/gras/DataDesc/datadesc_private.h @@ -1,6 +1,8 @@ /* $Id$ */ -/* datadesc_private - declarations visible only from within datadesc */ +/* datadesc - describing the data to exchange */ + +/* module's private interface masked even to other parts of GRAS. */ /* Authors: Olivier Aumage, Martin Quinson */ /* Copyright (C) 2003, 2004 the GRAS posse. */ @@ -23,6 +25,38 @@ extern gras_set_t *gras_datadesc_set_local; +/******************************************* + * Descriptions of all known architectures * + *******************************************/ + +#define gras_arch_count 1 +typedef enum { + gras_ddt_scalar_char = 0, + gras_ddt_scalar_short = 1, + gras_ddt_scalar_int = 2, + gras_ddt_scalar_long = 3, + gras_ddt_scalar_long_long = 4, + + gras_ddt_scalar_pdata = 5, + gras_ddt_scalar_pfunc = 6, + + gras_ddt_scalar_float = 7, + gras_ddt_scalar_double = 8 +} gras_ddt_scalar_type_t; + +typedef struct { + const char *name; + + int endian; + + int sizeof_scalars[9]; /* char,short,int,long,long_long, + pdata,pfunc, + float,double */ +} gras_arch_sizes_t; + +extern const gras_arch_sizes_t gras_arch_sizes[gras_arch_count]; + + /**********************************************************/ /* Actual definitions of the stuff in the type descriptor */ /**********************************************************/ @@ -57,13 +91,14 @@ typedef enum e_gras_datadesc_type_category { typedef struct s_gras_dd_cat_field { char *name; - long int offset; /* only for struct */ + long int offset[gras_arch_count]; /* only for struct */ int code; gras_datadesc_type_cb_void_t pre; gras_datadesc_type_cb_void_t post; } gras_dd_cat_field_t; + void gras_dd_cat_field_free(void *f); /** @@ -90,7 +125,7 @@ typedef struct s_gras_dd_cat_scalar { * Specific fields of a struct */ typedef struct s_gras_dd_cat_struct { - gras_dynar_t *fields; /* elm type = gras_dd_cat_struct_field_t */ + gras_dynar_t *fields; /* elm type = gras_dd_cat_field_t */ } gras_dd_cat_struct_t; /** @@ -100,7 +135,7 @@ typedef struct s_gras_dd_cat_struct { */ typedef struct s_gras_dd_cat_union { gras_datadesc_type_cb_int_t field_count; - gras_dynar_t *fields; /* elm type = gras_dd_cat_union_field_t */ + gras_dynar_t *fields; /* elm type = gras_dd_cat_field_t */ } gras_dd_cat_union_t; /** @@ -173,10 +208,10 @@ struct s_gras_datadesc_type { unsigned int name_len; /* payload */ - long int size; + long int size[gras_arch_count]; - long int alignment; - long int aligned_size; + long int alignment[gras_arch_count]; + long int aligned_size[gras_arch_count]; enum e_gras_datadesc_type_category category_code; union u_gras_datadesc_category category; @@ -190,7 +225,7 @@ struct s_gras_datadesc_type { ***************************/ gras_error_t gras_ddt_new_scalar(const char *name, - long int size, + gras_ddt_scalar_type_t type, enum e_gras_dd_scalar_encoding encoding, gras_datadesc_type_cb_void_t cb, gras_datadesc_type_t **dst); @@ -239,5 +274,15 @@ gras_ddt_new_ignored(const char *name, gras_datadesc_type_t **dst); +gras_error_t +gras_ddt_new_parse(const char *name, + const char *C_definition, + gras_datadesc_type_t **dst); +gras_error_t +gras_ddt_new_from_nws(const char *name, + const DataDescriptor *desc, + size_t howmany, + gras_datadesc_type_t **dst); + #endif /* GRAS_DATADESC_PRIVATE_H */ diff --git a/src/gras/DataDesc/ddt_create.c b/src/gras/DataDesc/ddt_create.c index 7c36fd8d6e..626b98c406 100644 --- a/src/gras/DataDesc/ddt_create.c +++ b/src/gras/DataDesc/ddt_create.c @@ -33,52 +33,59 @@ gras_ddt_new(const char *name, * Create a new scalar and give a pointer to it */ gras_error_t -gras_ddt_new_scalar(const char *name, - long int size, +gras_ddt_new_scalar(const char *name, + gras_ddt_scalar_type_t type, enum e_gras_dd_scalar_encoding encoding, gras_datadesc_type_cb_void_t cb, gras_datadesc_type_t **dst) { gras_error_t errcode; gras_datadesc_type_t *res; + long int arch; TRY(gras_ddt_new(name,dst)); res=*dst; - res->size = size>0 ? size : 0; - - if (size>0) { - long int sz = size; - long int mask = sz; + for (arch = 0; arch < gras_arch_count; arch ++) { + long int sz; + long int mask; - /* just in case you wonder, x>>1 == x/2 on all architectures when x>=0 */ + res->size[arch] = gras_arch_sizes[arch].sizeof_scalars[type]; + + sz = res->size[arch]; + mask = sz; + + /* just in case you wonder, x>>1 == x/2 on all architectures when x>=0 and a size is always>=0 */ /* make sure mask have all the bits under the biggest one of size set to 1 Example: size=000100101 => mask=0000111111 */ while ((sz >>= 1)) { mask |= sz; } - - if (size & (mask >> 1)) { /* if size have bits to one beside its biggest */ + + if (res->size[arch] & (mask >> 1)) { /* if size have bits to one beside its biggest */ /* size is not a power of 2 */ /* alignment= next power of 2 after size */ - res->alignment = (size & ~(mask >> 1)) << 1; - gras_assert0(res->alignment != 0, + res->alignment[arch] = (res->size[arch] & ~(mask >> 1)) << 1; + gras_assert0(res->alignment[arch] != 0, "scalar type too large"); - res->aligned_size = aligned(size, res->alignment); - gras_assert0 (res->aligned_size >= 0, + res->aligned_size[arch] = aligned(res->size[arch], res->alignment[arch]); + gras_assert0 (res->aligned_size[arch] >= 0, "scalar type too large"); } else { /* size is a power of 2, life is great */ - res->alignment = size; - res->aligned_size = size; + res->alignment[arch] = res->size[arch]; + res->aligned_size[arch] = res->size[arch]; } - - } else { - res->alignment = 0; - res->aligned_size = 0; + + /* FIXME size < 0 sometimes? + } else { + res->alignment = 0; + res->aligned_size = 0; + } + */ } res->category_code = e_gras_datadesc_type_cat_scalar; @@ -116,13 +123,16 @@ gras_ddt_new_struct(const char *name, gras_error_t errcode; gras_datadesc_type_t *res; + long int arch; TRY(gras_ddt_new(name,dst)); res=*dst; - res->size = 0; - res->alignment = 0; - res->aligned_size = 0; + for (arch=0; archsize[arch] = 0; + res->alignment[arch] = 0; + res->aligned_size[arch] = 0; + } res->category_code = e_gras_datadesc_type_cat_struct; TRY(gras_dynar_new(&(res->category.struct_data.fields), sizeof(gras_dd_cat_field_t*), @@ -147,6 +157,7 @@ gras_ddt_new_struct_append(gras_datadesc_type_t *struct_type, gras_error_t errcode; gras_dd_cat_field_t *field; + int arch; gras_assert0(field_type->size >= 0, "Cannot add a dynamically sized field in a structure"); @@ -156,16 +167,21 @@ gras_ddt_new_struct_append(gras_datadesc_type_t *struct_type, RAISE_MALLOC; field->name = strdup(name); - field->offset = aligned(struct_type->size, field_type->alignment); + + for (arch=0; archoffset[arch] = aligned(struct_type->size[arch], field_type->alignment[arch]); + } field->code = field_type->code; field->pre = pre; field->post = post; TRY(gras_dynar_push(struct_type->category.struct_data.fields, field)); - struct_type->size = field->offset + field_type->size; - struct_type->alignment = max(struct_type->alignment, field_type->alignment); - struct_type->aligned_size = aligned(struct_type->size, struct_type->alignment); + for (arch=0; archsize[arch] = field->offset[arch] + field_type->size[arch]; + struct_type->alignment[arch] = max(struct_type->alignment[arch], field_type->alignment[arch]); + struct_type->aligned_size[arch] = aligned(struct_type->size[arch], struct_type->alignment[arch]); + } return no_error; } @@ -183,6 +199,7 @@ gras_ddt_new_union(const char *name, gras_error_t errcode; gras_datadesc_type_t *res; + int arch; gras_assert0(field_count, "Attempt to creat an union without field_count function"); @@ -190,9 +207,11 @@ gras_ddt_new_union(const char *name, TRY(gras_ddt_new(name,dst)); res=*dst; - res->size = 0; - res->alignment = 0; - res->aligned_size = 0; + for (arch=0; archsize[arch] = 0; + res->alignment[arch] = 0; + res->aligned_size[arch] = 0; + } res->category_code = e_gras_datadesc_type_cat_union; TRY(gras_dynar_new(&(res->category.union_data.fields), sizeof(gras_dd_cat_field_t*), @@ -218,6 +237,7 @@ gras_ddt_new_union_append(gras_datadesc_type_t *union_type, gras_error_t errcode; gras_dd_cat_field_t *field; + int arch; gras_assert0(field_type->size >= 0, "Cannot add a dynamically sized field in an union"); @@ -227,16 +247,20 @@ gras_ddt_new_union_append(gras_datadesc_type_t *union_type, RAISE_MALLOC; field->name = strdup(name); - field->offset = 0; /* that's the purpose of union ;) */ + for (arch=0; archoffset[arch] = 0; /* that's the purpose of union ;) */ + } field->code = field_type->code; field->pre = pre; field->post = post; TRY(gras_dynar_push(union_type->category.union_data.fields, field)); - union_type->size = max(union_type->size, field_type->size); - union_type->alignment = max(union_type->alignment, field_type->alignment); - union_type->aligned_size = aligned(union_type->size, union_type->alignment); + for (arch=0; archsize[arch] = max(union_type->size[arch], field_type->size[arch]); + union_type->alignment[arch] = max(union_type->alignment[arch], field_type->alignment[arch]); + union_type->aligned_size[arch] = aligned(union_type->size[arch], union_type->alignment[arch]); + } return no_error; } @@ -255,6 +279,7 @@ gras_ddt_new_ref(const char *name, gras_error_t errcode; gras_datadesc_type_t *res; + int arch; gras_assert0(discriminant || referenced_type, "Attempt to create a generic reference without discriminant"); @@ -263,9 +288,12 @@ gras_ddt_new_ref(const char *name, res=*dst; /* FIXME: Size from bootstraping */ - res->size = 0; - res->alignment = 0; - res->aligned_size = 0; + for (arch=0; archsize[arch] = 0; + res->alignment[arch] = 0; + res->aligned_size[arch] = 0; + } + res->category_code = e_gras_datadesc_type_cat_ref; res->category.ref_data.code = referenced_type ? referenced_type->code : -1; @@ -291,6 +319,7 @@ gras_ddt_new_array(const char *name, gras_error_t errcode; gras_datadesc_type_t *res; + int arch; gras_assert0(dynamic_size || fixed_size>0, "Attempt to create a dynamic array without size discriminant"); @@ -298,13 +327,15 @@ gras_ddt_new_array(const char *name, TRY(gras_ddt_new(name,dst)); res=*dst; - if (fixed_size <= 0) { - res->size = fixed_size; - } else { - res->size = fixed_size * element_type->aligned_size; + for (arch=0; archsize[arch] = fixed_size; /* make sure it indicates "dynamic" */ + } else { + res->size[arch] = fixed_size * element_type->aligned_size[arch]; + } + res->alignment[arch] = element_type->alignment[arch]; + res->aligned_size[arch] = fixed_size; /*FIXME: That was so in GS, but looks stupid*/ } - res->alignment = element_type->alignment; - res->aligned_size = fixed_size; /*FIXME: That was so in GS, but looks stupid*/ res->category_code = e_gras_datadesc_type_cat_array; res->category.array_data.code = element_type->code; @@ -332,6 +363,8 @@ gras_ddt_new_ignored(const char *name, long int alignment, gras_datadesc_type_cb_void_t post, gras_datadesc_type_t **dst) { + RAISE_UNIMPLEMENTED; + /* gras_error_t errcode; gras_datadesc_type_t *res; @@ -364,6 +397,28 @@ gras_ddt_new_ignored(const char *name, res->size = size; return no_error; + */ +} + +/** + * gras_ddt_new_parse: + * + * Create a datadescription from the result of parsing the C type description + */ +gras_error_t +gras_ddt_new_parse(const char *name, + const char *C_statement, + gras_datadesc_type_t **dst) { + RAISE_UNIMPLEMENTED; +} + + +gras_error_t +gras_ddt_new_from_nws(const char *name, + const DataDescriptor *desc, + size_t howmany, + gras_datadesc_type_t **dst) { + RAISE_UNIMPLEMENTED; } /** diff --git a/src/gras/DataDesc/ddt_declare.c b/src/gras/DataDesc/ddt_declare.c index 3610a17011..2572e57262 100644 --- a/src/gras/DataDesc/ddt_declare.c +++ b/src/gras/DataDesc/ddt_declare.c @@ -18,7 +18,7 @@ gras_datadesc_declare_struct_cb(const char *name, gras_error_t errcode; gras_datadesc_type_t *type; TRY(gras_ddt_new_struct(name, pre, post, &type)); - TRY(gras_ddt_register(gras_datadesc_set_local, type)); + TRY(gras_ddt_register(type)); *code = type->code; return no_error; } @@ -75,7 +75,7 @@ gras_datadesc_declare_union_cb(const char *name, gras_error_t errcode; gras_datadesc_type_t *type; TRY(gras_ddt_new_union(name, field_count, post, &type)); - TRY(gras_ddt_register(gras_datadesc_set_local, type)); + TRY(gras_ddt_register(type)); *code = type->code; return no_error; } @@ -132,7 +132,7 @@ gras_datadesc_declare_ref_cb(const char *name, gras_error_t errcode; gras_datadesc_type_t *type; TRY(gras_ddt_new_ref(name, referenced_type,discriminant,post, &type)); - TRY(gras_ddt_register(gras_datadesc_set_local, type)); + TRY(gras_ddt_register(type)); *code = type->code; return no_error; } @@ -147,7 +147,43 @@ gras_datadesc_declare_array_cb(const char *name, gras_error_t errcode; gras_datadesc_type_t *type; TRY(gras_ddt_new_array(name, element_type, fixed_size, dynamic_size, post, &type)); - TRY(gras_ddt_register(gras_datadesc_set_local, type)); + TRY(gras_ddt_register(type)); + *code = type->code; + return no_error; +} + +/** + * gras_datadesc_parse: + * + * Parse a C type declaration, and declare locally the corresponding type description + */ +gras_error_t +gras_datadesc_parse(const char *name, + const char *definition, + long int *code) { + gras_error_t errcode; + gras_datadesc_type_t *type; + TRY(gras_ddt_new_parse(name,definition,&type)); + TRY(gras_ddt_register( type)); + *code = type->code; + return no_error; +} + +/** + * gras_datadesc_parse: + * + * Parse a NWS type declaration, and declare locally the corresponding type description + */ +gras_error_t +gras_datadesc_from_nws(const char *name, + const DataDescriptor *desc, + size_t howmany, + long int *code) { + + gras_error_t errcode; + gras_datadesc_type_t *type; + TRY(gras_ddt_new_from_nws(name,desc,howmany,&type)); + TRY(gras_ddt_register(type)); *code = type->code; return no_error; } diff --git a/src/gras/DataDesc/ddt_remote.c b/src/gras/DataDesc/ddt_remote.c index 5d574d7d65..6d45998bab 100644 --- a/src/gras/DataDesc/ddt_remote.c +++ b/src/gras/DataDesc/ddt_remote.c @@ -10,50 +10,19 @@ #include "DataDesc/datadesc_private.h" -/* callback for array size when sending strings */ -static int -_strlen_cb(void *vars, - gras_datadesc_type_t *type, - void *data) { - - // (void)p_vars; /* FIXME(Oli): Why that? Avoid warning? That's not needed*/ - // (void)p_type; - - return 1+(long int)strlen(data); -} /*** *** Table of all known architectures. ***/ -typedef struct { - const char *name; - - int endian; - - int sizeof_char; - int sizeof_short; - int sizeof_int; - int sizeof_long; - int sizeof_long_long; - - int sizeof_pdata; - int sizeof_pfunc; - - int sizeof_float; - int sizeof_double; -} gras_arch_sizes_t; - -const gras_arch_sizes_t gras_arch_sizes[] = { - {"i386", 0, 1,2,4,4,8, 4,4, 4,8} +const gras_arch_sizes_t gras_arch_sizes[gras_arch_count] = { + {"i386", 0, {1,2,4,4,8, 4,4, 4,8}} }; -const int gras_arch_sizes_count = 1; - /** * gras_free_ddt: * - * gime that memory back, dude + * gime that memory back, dude. I mean it. */ static void gras_free_ddt(void *ddt) { gras_datadesc_type_t *type= (gras_datadesc_type_t *)ddt; @@ -68,9 +37,8 @@ static void gras_free_ddt(void *ddt) { * * Add a type to a type set */ -gras_error_t gras_ddt_register(gras_set_t *set, - gras_datadesc_type_t *type) { - return gras_set_add(set, +gras_error_t gras_ddt_register(gras_datadesc_type_t *type) { + return gras_set_add(gras_datadesc_set_local, (gras_set_elm_t*)type, &gras_free_ddt); @@ -81,141 +49,17 @@ gras_error_t gras_ddt_register(gras_set_t *set, * * Retrieve a type from its name */ -gras_error_t gras_ddt_get_by_name(gras_set_t *set, - const char *name, +gras_error_t gras_ddt_get_by_name(const char *name, gras_datadesc_type_t **type) { - return gras_set_get_by_name(set,name,(gras_set_elm_t**)type); + return gras_set_get_by_name(gras_datadesc_set_local,name,(gras_set_elm_t**)type); } /** - * gras_dd_typeset_create: + * gras_ddt_get_by_code: * - * create a type set, and bootstrap it by declaring all basic types in it + * Retrieve a type from its name */ -gras_error_t -gras_dd_typeset_create(int gras_arch, - gras_set_t **s) { - gras_error_t errcode; - gras_datadesc_type_t *ddt; /* What to add */ - gras_datadesc_type_t *elm; /* element of ddt when needed */ - gras_set_t *set; /* result */ - - if (gras_arch >= gras_arch_sizes_count) { - RAISE1(mismatch_error, "Remote architecture signature (=%d) unknown locally\n", gras_arch); - } - - TRY(gras_set_new(s)); - set=*s; - - TRY(gras_ddt_new_scalar("signed char", - gras_arch_sizes[gras_arch].sizeof_char, - e_gras_dd_scalar_encoding_sint, - NULL, - &ddt)); - TRY(gras_ddt_register(set,ddt)); - - TRY(gras_ddt_new_scalar("unsigned char", - gras_arch_sizes[gras_arch].sizeof_char, - e_gras_dd_scalar_encoding_uint, - NULL, - &ddt)); - TRY(gras_ddt_register(set,ddt)); - - - TRY(gras_ddt_new_scalar("signed short int", - gras_arch_sizes[gras_arch].sizeof_short, - e_gras_dd_scalar_encoding_sint, - NULL, - &ddt)); - TRY(gras_ddt_register(set,ddt)); - - TRY(gras_ddt_new_scalar("unsigned short int", - gras_arch_sizes[gras_arch].sizeof_short, - e_gras_dd_scalar_encoding_uint, - NULL, - &ddt)); - TRY(gras_ddt_register(set,ddt)); - - - TRY(gras_ddt_new_scalar("signed int", - gras_arch_sizes[gras_arch].sizeof_int, - e_gras_dd_scalar_encoding_sint, - NULL, - &ddt)); - TRY(gras_ddt_register(set,ddt)); - - TRY(gras_ddt_new_scalar("unsigned int", - gras_arch_sizes[gras_arch].sizeof_int, - e_gras_dd_scalar_encoding_uint, - NULL, - &ddt)); - TRY(gras_ddt_register(set,ddt)); - - - TRY(gras_ddt_new_scalar("signed long int", - gras_arch_sizes[gras_arch].sizeof_long, - e_gras_dd_scalar_encoding_sint, - NULL, - &ddt)); - TRY(gras_ddt_register(set,ddt)); - - TRY(gras_ddt_new_scalar("unsigned long int", - gras_arch_sizes[gras_arch].sizeof_long, - e_gras_dd_scalar_encoding_uint, - NULL, - &ddt)); - TRY(gras_ddt_register(set,ddt)); - - - TRY(gras_ddt_new_scalar("signed long long int", - gras_arch_sizes[gras_arch].sizeof_long_long, - e_gras_dd_scalar_encoding_sint, - NULL, - &ddt)); - TRY(gras_ddt_register(set,ddt)); - - TRY(gras_ddt_new_scalar("unsigned long long int", - gras_arch_sizes[gras_arch].sizeof_long_long, - e_gras_dd_scalar_encoding_uint, - NULL, - &ddt)); - TRY(gras_ddt_register(set,ddt)); - - - TRY(gras_ddt_new_scalar("data pointer", - gras_arch_sizes[gras_arch].sizeof_pdata, - e_gras_dd_scalar_encoding_uint, - NULL, - &ddt)); - TRY(gras_ddt_register(set,ddt)); - - TRY(gras_ddt_new_scalar("function pointer", - gras_arch_sizes[gras_arch].sizeof_pfunc, - e_gras_dd_scalar_encoding_uint, - NULL, - &ddt)); - TRY(gras_ddt_register(set,ddt)); - - - TRY(gras_ddt_new_scalar("float", - gras_arch_sizes[gras_arch].sizeof_float, - e_gras_dd_scalar_encoding_float, - NULL, - &ddt)); - TRY(gras_ddt_register(set,ddt)); - - TRY(gras_ddt_new_scalar("double", - gras_arch_sizes[gras_arch].sizeof_float, - e_gras_dd_scalar_encoding_float, - NULL, - &ddt)); - TRY(gras_ddt_register(set,ddt)); - - TRY(gras_ddt_get_by_name(set,"unsigned char",&elm)); - TRY(gras_ddt_new_array("string", elm, 0, _strlen_cb, NULL, &ddt)); - TRY(gras_ddt_register(set,ddt)); - - - return no_error; +gras_error_t gras_ddt_get_by_code(int code, + gras_datadesc_type_t **type) { + return gras_set_get_by_id(gras_datadesc_set_local,code,(gras_set_elm_t**)type); } - diff --git a/src/gras/DataDesc/ddt_use.c b/src/gras/DataDesc/ddt_use.c index a2ce2c9566..f4f6c346f0 100644 --- a/src/gras/DataDesc/ddt_use.c +++ b/src/gras/DataDesc/ddt_use.c @@ -10,7 +10,24 @@ #include "DataDesc/datadesc_private.h" -GRAS_LOG_NEW_DEFAULT_SUBCATEGORY(use,DataDesc); +//GRAS_LOG_NEW_DEFAULT_SUBCATEGORY(use,DataDesc); + +/** + * gras_datadesc_get_id_from_name: + * Returns: -1 in case of error. + * + * Retrieve the ID of a previously declared datatype from its name. + */ +long int +gras_datadesc_get_id_from_name(const char *name) { + gras_error_t errcode; + gras_datadesc_type_t *type; + + errcode = gras_ddt_get_by_name(name,&type); + if (errcode != no_error) + return -1; + return type->code; +} /** * gras_datadesc_type_cmp: @@ -20,19 +37,20 @@ GRAS_LOG_NEW_DEFAULT_SUBCATEGORY(use,DataDesc); * This comparison does not take the set headers into account (name and ID), * but only the payload (actual type description). */ -int gras_datadesc_type_cmp(const gras_datadesc_t *d1, - const gras_datadesc_t *d2) { +int gras_datadesc_type_cmp(const gras_datadesc_type_t *d1, + const gras_datadesc_type_t *d2) { int ret,cpt; - gras_dd_cat_struct_field_t *field1,*field2; + gras_dd_cat_field_t *field1,*field2; + gras_datadesc_type_t *field_desc_1,*field_desc_2; - if (!d1 & & d2) return 1; + if (!d1 && d2) return 1; if (!d1 && !d2) return 0; if ( d1 && !d2) return -1; if (d1->size != d2->size ) return d1->size > d2->size ? 1 : -1; if (d1->alignment != d2->alignment) return d1->alignment > d2->alignment ? 1 : -1; - if (d1->aligned_size != d2->aligned_size) return d1->aligned_siz e > d2->aligned_size ? 1 : -1; + if (d1->aligned_size != d2->aligned_size) return d1->aligned_size > d2->aligned_size ? 1 : -1; if (d1->category_code != d2->category_code) return d1->category_code > d2->category_code ? 1 : -1; @@ -45,10 +63,7 @@ int gras_datadesc_type_cmp(const gras_datadesc_t *d1, return d1->category.scalar_data.encoding > d2->category.scalar_data.encoding ? 1 : -1 ; break; - case e_gras_datadesc_type_cat_struct: - if (d1->category.struct_data.field_count != d2->category.struct_data.field_count) - return d1->category.struct_data.field_count > d2->category.struct_data.field_count ? 1 : -1; - + case e_gras_datadesc_type_cat_struct: if (gras_dynar_length(d1->category.struct_data.fields) != gras_dynar_length(d2->category.struct_data.fields)) return gras_dynar_length(d1->category.struct_data.fields) > @@ -58,7 +73,9 @@ int gras_datadesc_type_cmp(const gras_datadesc_t *d1, gras_dynar_foreach(d1->category.struct_data.fields, cpt, field1) { gras_dynar_get(d2->category.struct_data.fields, cpt, field2); - ret = gras_datadesc_type_cmp(field1,field2); + gras_ddt_get_by_code(field1->code,&field_desc_1); /* FIXME: errcode ignored */ + gras_ddt_get_by_code(field2->code,&field_desc_2); + ret = gras_datadesc_type_cmp(field_desc_1,field_desc_2); if (ret) return ret; @@ -78,7 +95,9 @@ int gras_datadesc_type_cmp(const gras_datadesc_t *d1, gras_dynar_foreach(d1->category.union_data.fields, cpt, field1) { gras_dynar_get(d2->category.union_data.fields, cpt, field2); - ret = gras_datadesc_type_cmp(field1,field2); + gras_ddt_get_by_code(field1->code,&field_desc_1); /* FIXME: errcode ignored */ + gras_ddt_get_by_code(field2->code,&field_desc_2); + ret = gras_datadesc_type_cmp(field_desc_1,field_desc_2); if (ret) return ret; @@ -116,6 +135,34 @@ int gras_datadesc_type_cmp(const gras_datadesc_t *d1, } -gras_error_t gras_datadesc_cpy(gras_datadesc_t *type, void *src, void **dst) { - +/** + * gras_datadesc_cpy: + * + * Copy the data pointed by src and described by type to a new location, and store a pointer to it in dst. + * + */ +gras_error_t gras_datadesc_cpy(gras_datadesc_type_t *type, void *src, void **dst) { + RAISE_UNIMPLEMENTED; +} + +/** + * gras_datadesc_send: + * + * Copy the data pointed by src and described by type to the socket + * + */ +gras_error_t gras_datadesc_send(gras_socket_t *sock, gras_datadesc_type_t *type, void *src) { + + RAISE_UNIMPLEMENTED; +} + +/** + * gras_datadesc_recv: + * + * Get an instance of the datatype described by @type from the @socket, and store a pointer to it in @dst + * + */ +gras_error_t +gras_datadesc_recv(gras_socket_t *sock, gras_datadesc_type_t *type, void **dst) { + RAISE_UNIMPLEMENTED; } diff --git a/src/gras/Makefile.am b/src/gras/Makefile.am index fd30c7586a..5ff273e358 100644 --- a/src/gras/Makefile.am +++ b/src/gras/Makefile.am @@ -1,12 +1,11 @@ SUBDIRS=. Tests DISTCLEANFILES=Makefile.in -INCLUDES= -I$(top_srcdir)/src/include -I../nws_portability/Include \ +INCLUDES= -I$(top_srcdir)/src/include \ @CFLAGS_XML@ @CFLAGS_SimGrid@ EXTRA_DIST= \ gras_private.h \ - Core/dict_private.h \ - DataDesc/gs_private.h \ - DataDesc/parse.yy.l + Core/dict_private.h +# DataDesc/parse.yy.l lib_LIBRARIES= libgrasrl.a libgrassg.a @@ -17,6 +16,7 @@ noinst_LIBRARIES=libgrasutils.a # Common/gras.c Common/gras_datadesc.c Common/gras_msg.c # Messaging/messaging.c # Messaging/datadesc_simple.c +# Transport/transport_sg.c COMMON_S=\ \ @@ -29,13 +29,13 @@ COMMON_S=\ Core/config.c \ \ Transport/transport.c Transport/transport_private.h \ - Transport/transport_sg.c Transport/transport_tcp.c \ + Transport/transport_tcp.c \ \ \ - DataDesc/ddt_create.c DataDesc/ddt_declare.c \ - DataDesc/ddt_remote.c \ - DataDesc/datadesc.c DataDesc/datadesc_interface.h \ - DataDesc/datadesc_private.h + DataDesc/ddt_create.c DataDesc/ddt_declare.c \ + DataDesc/ddt_remote.c DataDesc/ddt_use.c \ + DataDesc/cbps.c DataDesc/datadesc.c \ + DataDesc/datadesc_interface.h DataDesc/datadesc_private.h # DataDesc/datadesc.c \ # DataDesc/tools.c \ @@ -52,31 +52,25 @@ COMMON_S=\ # DataDesc/vars.c DataDesc/parse.yy.c: DataDesc/parse.yy.l - flex -o$@ -Pgras_datadesc_parse_ $^ + flex -o$@ -Pgras_ddt_ $^ -COMMON_L=\ - $(foreach file,\ - diagnostic formatutil strutil osutil, \ - $(top_srcdir)/src/nws_portability/build-@host@/obj/$(file).o) - -libgrasutils_a_SOURCES = $(COMMON_S) Tests/gras_dummy.c -libgrasutils_a_LIBADD = $(COMMON_L) +libgrasutils_a_SOURCES = $(COMMON_S) +#Tests/gras_dummy.c +libgrasrl_a_SOURCES= $(COMMON_S) \ + Transport/rl_transport.c \ + Virtu/rl_process.c Virtu/rl_time.c +libgrassg_a_SOURCES= $(COMMON_S) \ + Transport/sg_transport.c \ + Virtu/sg_process.c Virtu/sg_time.c # RL/gras_rl.c RL/gras_rl.h FIXME -libgrasrl_a_SOURCES= $(COMMON_S) Messaging/messaging_rl.c -libgrasrl_a_LIBADD= \ - $(foreach file,\ - exp_smooth forc median mse_forc protocol \ - dnsutil fbuff forecast_api last_value run_mean timeouts, \ - $(top_srcdir)/src/nws_portability/build-@host@/obj/$(file).o) \ - $(COMMON_L) - -# SG/gras_sg.c SG/gras_sg.h FIXME -libgrassg_a_SOURCES= $(COMMON_S) Messaging/messaging_sg.c -libgrassg_a_LIBADD= \ - $(COMMON_L) +# $(foreach file,\ +# exp_smooth forc median mse_forc protocol \ +# dnsutil fbuff forecast_api last_value run_mean timeouts, \ +# $(top_srcdir)/src/nws_portability/build-@host@/obj/$(file).o) + diff --git a/src/gras/Transport/rl_transport.c b/src/gras/Transport/rl_transport.c new file mode 100644 index 0000000000..cd732c979d --- /dev/null +++ b/src/gras/Transport/rl_transport.c @@ -0,0 +1,195 @@ +/* $Id$ */ + +/* rl_transport - RL specific functions for transport */ + +/* Authors: Martin Quinson */ +/* Copyright (C) 2004 Martin Quinson. */ + +/* This program is free software; you can redistribute it and/or modify it + under the terms of the license (GNU LGPL) which comes with this package. */ + +#include +#include +#include + +#include "Transport/transport_private.h" +GRAS_LOG_EXTERNAL_CATEGORY(transport); +GRAS_LOG_DEFAULT_CATEGORY(transport); + + +gras_error_t +gras_socket_server(unsigned short port, + unsigned int bufSize, + /* OUT */ gras_socket_t **dst) { + + gras_error_t errcode; + gras_trp_plugin_t *tcp; + + TRY(gras_trp_plugin_get_by_name("TCP",&tcp)); + TRY( tcp->socket_server(tcp, port, bufSize, dst)); + + (*dst)->incoming = 1; + (*dst)->accepting = 1; + + TRY(gras_dynar_push(_gras_trp_sockets,dst)); + + return no_error; +} + +gras_error_t +gras_socket_client(const char *host, + unsigned short port, + unsigned int bufSize, + /* OUT */ gras_socket_t **dst) { + + gras_error_t errcode; + gras_trp_plugin_t *tcp; + + TRY(gras_trp_plugin_get_by_name("TCP",&tcp)); + TRY( (*tcp->socket_client)(tcp, host, port, bufSize, dst)); + + (*dst)->incoming = 0; + (*dst)->accepting = 0; + + return no_error; +} + + +/** + * gras_trp_select: + * + * Returns the next socket to service having a message awaiting. + * + * if timeout<0, we ought to implement the adaptative timeout (FIXME) + * + * if timeout=0, do not wait for new message, only handle the ones already there. + * + * if timeout>0 and no message there, wait at most that amount of time before giving up. + */ +gras_error_t +gras_trp_select(double timeout, + gras_socket_t **dst) { + + gras_error_t errcode; + int done = -1; + double wakeup = gras_time() + 1000000*timeout; + double now = 0; + /* nextToService used to make sure socket with high number do not starve */ + // static int nextToService = 0; + struct timeval tout, *p_tout; + + int max_fds=0; /* first arg of select: number of existing sockets */ + fd_set FDS; + int ready; /* return of select: number of socket ready to be serviced */ + + gras_socket_t *sock_iter; /* iterating over all sockets */ + int cursor; /* iterating over all sockets */ + + *dst=NULL; + while (done == -1) { + if (timeout > 0) { /* did we timeout already? */ + now = gras_time(); + if (now == -1 || now >= wakeup) { + done = 0; /* didn't find anything */ + break; + } + } + + /* construct the set of socket to ear from */ + FD_ZERO(&FDS); + gras_dynar_foreach(_gras_trp_sockets,cursor,sock_iter) { + if (max_fds < sock_iter->sd) + max_fds = sock_iter->sd; + FD_SET(sock_iter->sd, &FDS); + } + + /* we cannot have more than FD_SETSIZE sockets */ + if (++max_fds > FD_SETSIZE) { + WARNING0("too many open sockets."); + done = 0; + break; + } + + if (timeout > 0) { + /* set the timeout */ + tout.tv_sec = (unsigned long)((wakeup - now)/1000000); + tout.tv_usec = (unsigned long)(wakeup - now) % 1000000; + p_tout = &tout; + } else if (timeout == 0) { + /* polling only */ + tout.tv_sec = 0; + tout.tv_usec = 0; + p_tout = &tout; + /* we just do one loop around */ + done = 0; + } else { + /* no timeout: good luck! */ + p_tout = NULL; + } + + ready = select(max_fds, &FDS, NULL, NULL, p_tout); + if (ready == -1) { + switch (errno) { + case EINTR: /* a signal we don't care about occured. We don't care */ + continue; + case EINVAL: /* invalid value */ + RAISE3(system_error,"invalid select: nb fds: %d, timeout: %d.%d", + max_fds, (int)tout.tv_sec,(int) tout.tv_usec); + case ENOMEM: + RAISE_MALLOC; + default: + RAISE2(system_error,"Error during select: %s (%d)",strerror(errno),errno); + } + RAISE_IMPOSSIBLE; + } else if (ready == 0) { + continue; /* this was a timeout */ + } + + gras_dynar_foreach(_gras_trp_sockets,cursor,sock_iter) { + if(!FD_ISSET(sock_iter->sd, &FDS)) { /* this socket is not ready */ + continue; + } + + /* Got a socket to serve */ + ready--; + + if ( sock_iter->accepting + && sock_iter->plugin->socket_accept) { + /* not a socket but an ear. accept on it and serve next socket */ + gras_socket_t *accepted; + + TRY(sock_iter->plugin->socket_accept(sock_iter,&accepted)); + TRY(gras_dynar_push(_gras_trp_sockets,&accepted)); + } else { + /* Make sure the socket is still alive by reading the first byte */ + char lookahead; + int recvd; + + recvd = recv(sock_iter->sd, &lookahead, 1, MSG_PEEK); + if (recvd < 0) { + WARNING2("socket %d failed: %s", sock_iter->sd, strerror(errno)); + /* done with this socket */ + gras_socket_close(sock_iter); + cursor--; + } else if (recvd == 0) { + /* Connection reset (=closed) by peer. */ + DEBUG1("Connection %d reset by peer", sock_iter->sd); + gras_socket_close(sock_iter); + cursor--; + } else { + /* Got a suited socket ! */ + *dst = sock_iter; + return no_error; + } + } + + + /* if we're here, the socket we found wasn't really ready to be served */ + if (ready == 0) /* exausted all sockets given by select. Request new ones */ + break; + } + + } + + return timeout_error; +} diff --git a/src/gras/Transport/sg_transport.c b/src/gras/Transport/sg_transport.c new file mode 100644 index 0000000000..b7eee02613 --- /dev/null +++ b/src/gras/Transport/sg_transport.c @@ -0,0 +1,31 @@ +/* $Id$ */ + +/* sg_transport - SG specific functions for transport */ + +/* Authors: Martin Quinson */ +/* Copyright (C) 2004 Martin Quinson. */ + +/* This program is free software; you can redistribute it and/or modify it + under the terms of the license (GNU LGPL) which comes with this package. */ + +#include "Transport/transport_private.h" +//GRAS_LOG_EXTERNAL_CATEGORY(transport); +//GRAS_LOG_DEFAULT_CATEGORY(transport); + +/** + * gras_trp_select: + * + * Returns the next socket to service having a message awaiting. + * + * if timeout<0, we ought to implement the adaptative timeout (FIXME) + * + * if timeout=0, do not wait for new message, only handle the ones already there. + * + * if timeout>0 and no message there, wait at most that amount of time before giving up. + */ +gras_error_t +gras_trp_select(double timeout, + gras_socket_t **dst) { + + RAISE_UNIMPLEMENTED; +} diff --git a/src/gras/Transport/transport.c b/src/gras/Transport/transport.c index 3aa7a2eaef..7c78364b18 100644 --- a/src/gras/Transport/transport.c +++ b/src/gras/Transport/transport.c @@ -1,6 +1,6 @@ /* $Id$ */ -/* bloc_transport - send/receive a bunch of bytes */ +/* transport - low level communication */ /* Authors: Martin Quinson */ /* Copyright (C) 2004 Martin Quinson. */ @@ -8,27 +8,88 @@ /* This program is free software; you can redistribute it and/or modify it under the terms of the license (GNU LGPL) which comes with this package. */ -#include "gras_private.h" -#include "transport.h" +#include /* time() */ +//#include + +#include "Transport/transport_private.h" + GRAS_LOG_NEW_DEFAULT_SUBCATEGORY(transport,GRAS); +static gras_dict_t *_gras_trp_plugins; /* All registered plugins */ +static void gras_trp_plugin_free(void *p); /* free one of the plugins */ + + +gras_dynar_t *_gras_trp_sockets; /* all existing sockets */ +static void gras_trp_socket_free(void *s); /* free one socket */ + +static fd_set FDread; gras_error_t gras_trp_init(void){ - RAISE_UNIMPLEMENTED; + gras_error_t errcode; + gras_trp_plugin_t *plug; + + /* make room for all socket ownership descriptions */ + TRY(gras_dynar_new(&_gras_trp_sockets, sizeof(gras_socket_t*), NULL)); + + /* We do not ear for any socket for now */ + FD_ZERO(&FDread); + + /* make room for all plugins */ + TRY(gras_dict_new(&_gras_trp_plugins)); + + /* TCP */ + TRY(gras_trp_tcp_init(&plug)); + TRY(gras_dict_insert(_gras_trp_plugins,plug->name, plug, gras_trp_plugin_free)); + + return no_error; } void gras_trp_exit(void){ + gras_dict_free(&_gras_trp_plugins); + gras_dynar_free(_gras_trp_sockets); +} - ERROR1("%s not implemented",__FUNCTION__); - abort(); + +void gras_trp_plugin_free(void *p) { + gras_trp_plugin_t *plug = p; + + if (plug) { + if (plug->free_specific && plug->specific) + plug->free_specific(plug->specific); + + free(plug->name); + free(plug); + } +} + +void gras_socket_close(gras_socket_t *sock) { + gras_socket_t *sock_iter; + int cursor; + + /* FIXME: Issue an event when the socket is closed */ + if (sock) { + gras_dynar_foreach(_gras_trp_sockets,cursor,sock_iter) { + if (sock == sock_iter) { + gras_dynar_cursor_rm(_gras_trp_sockets,&cursor); + if (sock->plugin->socket_close) + (*sock->plugin->socket_close)(sock); + + /* free the memory */ + free(sock); + return; + } + } + WARNING0("Ignoring request to free an unknown socket"); + } } gras_error_t gras_trp_plugin_get_by_name(const char *name, gras_trp_plugin_t **dst){ - RAISE_UNIMPLEMENTED; + return gras_dict_retrieve(_gras_trp_plugins,name,(void**)dst); } + diff --git a/src/gras/Transport/transport_interface.h b/src/gras/Transport/transport_interface.h new file mode 100644 index 0000000000..a8f84bfdf3 --- /dev/null +++ b/src/gras/Transport/transport_interface.h @@ -0,0 +1,76 @@ +/* $Id$ */ + +/* transport - low level communication (send/receive bunches of bytes) */ + +/* module's public interface exported within GRAS, but not to end user. */ + +/* Authors: Martin Quinson */ +/* Copyright (C) 2004 Martin Quinson. */ + +/* This program is free software; you can redistribute it and/or modify it + under the terms of the license (GNU LGPL) which comes with this package. */ + +#ifndef GRAS_TRP_INTERFACE_H +#define GRAS_TRP_INTERFACE_H + +#include "gras_private.h" + +/** + * e_gras_trp_plugin: + * + * Caracterize each possible transport plugin + */ +typedef enum e_gras_trp_plugin { + e_gras_trp_plugin_undefined = 0, + + e_gras_trp_plugin_tcp +} gras_trp_plugin_type_t; + + +/* Find which socket needs to be read next */ +gras_error_t +gras_trp_select(double timeout, + gras_socket_t **dst); + +/* +gras_error_t gras_trp_NNN_init(gras_trp_plugin_t **dst); +*/ + +/* A plugin type */ +struct gras_trp_plugin_ { + char *name; + + gras_error_t (*socket_client)(gras_trp_plugin_t *self, + const char *host, + unsigned short port, + unsigned int bufSize, + /* OUT */ gras_socket_t **dst); + gras_error_t (*socket_server)(gras_trp_plugin_t *self, + unsigned short port, + unsigned int bufSize, + /* OUT */ gras_socket_t **dst); + gras_error_t (*socket_accept)(gras_socket_t *sock, + /* OUT */gras_socket_t **dst); + + + /* socket_close() is responsible of telling the OS that the socket is over, + but should not free the socket itself (beside the specific part) */ + void (*socket_close)(gras_socket_t *sd); + + + gras_error_t (*bloc_send)(gras_socket_t *sd, + char *data, + size_t size); + gras_error_t (*bloc_recv)(gras_socket_t *sd, + char *Data, + size_t size); + + void *specific; + void (*free_specific)(void *); +}; + +gras_error_t +gras_trp_plugin_get_by_name(const char *name, + gras_trp_plugin_t **dst); + +#endif /* GRAS_TRP_INTERFACE_H */ diff --git a/src/gras/Transport/transport_private.h b/src/gras/Transport/transport_private.h index bef632eb3b..56e2f165af 100644 --- a/src/gras/Transport/transport_private.h +++ b/src/gras/Transport/transport_private.h @@ -1,9 +1,8 @@ /* $Id$ */ -/* trp (transport) - send/receive a bunch of bytes */ +/* transport - low level communication (send/receive bunches of bytes) */ -/* This file implements the public interface of this module, exported to the*/ -/* other modules of GRAS, but not to the end user. */ +/* module's private interface masked even to other parts of GRAS. */ /* Authors: Martin Quinson */ /* Copyright (C) 2004 Martin Quinson. */ @@ -15,100 +14,37 @@ #define GRAS_TRP_PRIVATE_H #include "gras_private.h" -/* A low-level socket type (each plugin implements it the way it prefers */ -//typedef void gras_trp_sock_t; - -/* A plugin type */ -struct gras_trp_plugin_ { - const char *name; - - gras_error_t (*init)(void); - void (*exit)(gras_trp_plugin_t *); - - gras_error_t (*socket_client_open)(const char *host, - unsigned short port, - int raw, - unsigned int bufSize, - /* OUT */ gras_trp_sock_t **dst); - gras_error_t (*socket_server_open)(unsigned short port, - int raw, - unsigned int bufSize, - /* OUT */ gras_trp_sock_t **dst); - void (*socket_close)(gras_trp_sock_t **sd); - - gras_error_t (*select)(double timeOut, - gras_trp_sock_t **sd); +#include "Transport/transport_interface.h" + +extern gras_dynar_t *_gras_trp_sockets; /* all existing sockets */ + + +/** + * s_gras_socket: + * + * Description of a socket. + */ + +struct s_gras_socket { + gras_trp_plugin_t *plugin; - gras_error_t (*bloc_send)(gras_trp_sock_t *sd, - void *data, - size_t size, - double timeOut); - gras_error_t (*bloc_recv)(gras_trp_sock_t *sd, - void *data, - size_t size, - double timeOut); - gras_error_t (*flush)(gras_trp_sock_t *sd); - - void *specific; -}; + int incoming; /* true if incoming (server) sock, false if client sock */ + int accepting; /* true if master incoming sock in tcp */ + + int sd; + int port; /* port on this side */ + int peer_port; /* port on the other side */ + char *peer_name; /* hostname of the other side */ -/********************************************************************** - * Internal stuff to the module. Other modules shouldn't fool with it * - **********************************************************************/ + void *specific; /* plugin specific data */ +}; + /* TCP driver */ -gras_error_t gras_trp_tcp_init(void); -void gras_trp_tcp_exit(gras_trp_plugin_t *plugin); -gras_error_t gras_trp_tcp_socket_client(const char *host, - unsigned short port, - int raw, - unsigned int bufSize, - /* OUT */ gras_trp_sock_t **dst); -gras_error_t gras_trp_tcp_socket_server(unsigned short port, - int raw, - unsigned int bufSize, - /* OUT */ gras_trp_sock_t **dst); -void gras_trp_tcp_socket_close(gras_trp_sock_t **sd); -gras_error_t gras_trp_tcp_select(double timeOut, - gras_trp_sock_t **sd); - -gras_error_t gras_trp_tcp_bloc_send(gras_trp_sock_t *sd, - void *data, - size_t size, - double timeOut); - -gras_error_t gras_trp_tcp_bloc_recv(gras_trp_sock_t *sd, - void *data, - size_t size, - double timeOut); -gras_error_t gras_trp_tcp_flush(gras_trp_sock_t *sd); +gras_error_t gras_trp_tcp_init(gras_trp_plugin_t **dst); /* SG driver */ -gras_error_t gras_trp_sg_init(void); -void gras_trp_sg_exit(gras_trp_plugin_t *plugin); -gras_error_t gras_trp_sg_socket_client(const char *host, - unsigned short port, - int raw, - unsigned int bufSize, - /* OUT */ gras_trp_sock_t **dst); -gras_error_t gras_trp_sg_socket_server(unsigned short port, - int raw, - unsigned int bufSize, - /* OUT */ gras_trp_sock_t **dst); -void gras_trp_sg_socket_close(gras_trp_sock_t **sd); -gras_error_t gras_trp_sg_select(double timeOut, - gras_trp_sock_t **sd); - -gras_error_t gras_trp_sg_bloc_send(gras_trp_sock_t *sd, - void *data, - size_t size, - double timeOut); - -gras_error_t gras_trp_sg_bloc_recv(gras_trp_sock_t *sd, - void *data, - size_t size, - double timeOut); -gras_error_t gras_trp_sg_flush(gras_trp_sock_t *sd); +gras_error_t gras_trp_sg_init (gras_trp_plugin_t **dst); diff --git a/src/gras/Transport/transport_sg.c b/src/gras/Transport/transport_sg.c index 828ddfdeb2..3db4f534e6 100644 --- a/src/gras/Transport/transport_sg.c +++ b/src/gras/Transport/transport_sg.c @@ -2,6 +2,10 @@ /* file trp (transport) - send/receive a bunch of bytes in SG realm */ +/* Note that this is only used to debug other parts of GRAS since message */ +/* exchange in SG realm is implemented directly without mimicing real life */ +/* This would be terribly unefficient. */ + /* Authors: Martin Quinson */ /* Copyright (C) 2004 Martin Quinson. */ @@ -14,10 +18,50 @@ GRAS_LOG_EXTERNAL_CATEGORY(transport); GRAS_LOG_NEW_DEFAULT_SUBCATEGORY(trp_sg,transport); + +/*** + *** Prototypes + ***/ +void gras_trp_sg_exit(gras_trp_plugin_t *plugin); +gras_error_t gras_trp_sg_socket_client(const char *host, + unsigned short port, + int raw, + unsigned int bufSize, + /* OUT */ gras_socket_t **dst); +gras_error_t gras_trp_sg_socket_server(unsigned short port, + int raw, + unsigned int bufSize, + /* OUT */ gras_socket_t **dst); +void gras_trp_sg_socket_close(gras_trp_sock_t **sd); +gras_error_t gras_trp_sg_select(double timeOut, + gras_socket_t **sd); + +gras_error_t gras_trp_sg_bloc_send(gras_socket_t *sd, + void *data, + size_t size, + double timeOut); + +gras_error_t gras_trp_sg_bloc_recv(gras_socket_t *sd, + void *data, + size_t size, + double timeOut); +gras_error_t gras_trp_sg_flush(gras_socket_t *sd); + +/*** + *** Specific plugin part + ***/ typedef struct { int dummy; } gras_trp_sg_specific_t; +/*** + *** Specific socket part + ***/ + +/*** + *** Code + ***/ + gras_error_t gras_trp_sg_init(void) { diff --git a/src/gras/Transport/transport_tcp.c b/src/gras/Transport/transport_tcp.c index 967e907413..18eb5fb227 100644 --- a/src/gras/Transport/transport_tcp.c +++ b/src/gras/Transport/transport_tcp.c @@ -8,71 +8,373 @@ /* This program is free software; you can redistribute it and/or modify it under the terms of the license (GNU LGPL) which comes with this package. */ +#include /* close() pipe() read() write() */ +#include /* close() pipe() read() write() */ +#include /* sometimes required for #include */ +#include /* TCP_NODELAY */ +#include /* inet_ntoa() */ +#include /* getprotobyname() */ +#include /* struct timeval */ +#include /* errno */ +#include /* waitpid() */ +#include /* getpeername() socket() */ +#include + + #include "gras_private.h" #include "transport_private.h" GRAS_LOG_NEW_DEFAULT_SUBCATEGORY(trp_tcp,transport); typedef struct { - int dummy; + int buffsize; +} gras_trp_tcp_sock_specific_t; + +/*** + *** Prototypes + ***/ +gras_error_t gras_trp_tcp_socket_client(gras_trp_plugin_t *self, + const char *host, + unsigned short port, + unsigned int bufSize, + /* OUT */ gras_socket_t **dst); +gras_error_t gras_trp_tcp_socket_server(gras_trp_plugin_t *self, + unsigned short port, + unsigned int bufSize, + /* OUT */ gras_socket_t **dst); +gras_error_t gras_trp_tcp_socket_accept(gras_socket_t *sock, + gras_socket_t **dst); + +void gras_trp_tcp_socket_close(gras_socket_t *sd); + +gras_error_t gras_trp_tcp_bloc_send(gras_socket_t *sd, + char *data, + size_t size); + +gras_error_t gras_trp_tcp_bloc_recv(gras_socket_t *sd, + char *data, + size_t size); + +void gras_trp_tcp_free_specific(void *s); + + +static int TcpProtoNumber(void); +/*** + *** Specific plugin part + ***/ + +typedef struct { + fd_set incoming_socks; } gras_trp_tcp_specific_t; +/*** + *** Specific socket part + ***/ + + +/*** + *** Code + ***/ gras_error_t -gras_trp_tcp_init(void) { +gras_trp_tcp_init(gras_trp_plugin_t **dst) { - gras_trp_tcp_specific_t *specific = malloc(sizeof(gras_trp_tcp_specific_t)); - if (!specific) + gras_trp_plugin_t *res=malloc(sizeof(gras_trp_plugin_t)); + gras_trp_tcp_specific_t *tcp = malloc(sizeof(gras_trp_tcp_specific_t)); + if (!res || !tcp) RAISE_MALLOC; + FD_ZERO(&(tcp->incoming_socks)); + + res->socket_client = gras_trp_tcp_socket_client; + res->socket_server = gras_trp_tcp_socket_server; + res->socket_accept = gras_trp_tcp_socket_accept; + res->socket_close = gras_trp_tcp_socket_close; + + res->bloc_send = gras_trp_tcp_bloc_send; + res->bloc_recv = gras_trp_tcp_bloc_recv; + + res->specific = (void*)tcp; + res->free_specific = gras_trp_tcp_free_specific; + + *dst = res; return no_error; } -void -gras_trp_tcp_exit(gras_trp_plugin_t *plugin) { - gras_trp_tcp_specific_t *specific = (gras_trp_tcp_specific_t*)plugin->specific; +void gras_trp_tcp_free_specific(void *s) { + gras_trp_tcp_specific_t *specific = s; free(specific); } -gras_error_t gras_trp_tcp_socket_client(const char *host, +gras_error_t gras_trp_tcp_socket_client(gras_trp_plugin_t *self, + const char *host, unsigned short port, - int raw, unsigned int bufSize, - /* OUT */ gras_trp_sock_t **dst){ + /* OUT */ gras_socket_t **dst){ + /* + int addrCount; + IPAddress addresses[10]; + int i; + int sd; + + if (!(*sock=malloc(sizeof(gras_socket_t)))) { + fprintf(stderr,"Malloc error\n"); + return malloc_error; + } + (*sock)->peer_addr=NULL; + + if (!(addrCount = IPAddressValues(host, addresses, 10))) { + fprintf(stderr,"grasOpenClientSocket: address retrieval of '%s' failed\n",host); + return system_error; + } + + for(i = 0; i < addrCount && i<10 ; i++) { + if(CallAddr(addresses[i], port, &sd, -1)) { + (*sock)->sock = sd; + (*sock)->port = port; + return no_error; + } + } + free(*sock); + fprintf(stderr,"grasOpenClientSocket: something wicked happenned while connecting to %s:%d", + host,port); + return system_error; + */ RAISE_UNIMPLEMENTED; } -gras_error_t gras_trp_tcp_socket_server(unsigned short port, - int raw, +/** + * gras_trp_tcp_socket_server: + * + * Open a socket used to receive messages. bufSize is in ko. + */ +gras_error_t gras_trp_tcp_socket_server(gras_trp_plugin_t *self, + unsigned short port, unsigned int bufSize, - /* OUT */ gras_trp_sock_t **dst){ - RAISE_UNIMPLEMENTED; -} + /* OUT */ gras_socket_t **dst){ + int size = bufSize * 1024; + int on = 1; + int sd = -1; + struct sockaddr_in server; + + gras_socket_t *res; + gras_trp_tcp_specific_t *data=(gras_trp_tcp_specific_t*)self -> specific; + + res=malloc(sizeof(gras_socket_t)); + if (!res) + RAISE_MALLOC; + + server.sin_port = htons((u_short)port); + server.sin_addr.s_addr = INADDR_ANY; + server.sin_family = AF_INET; + if((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + free(res); + RAISE0(system_error,"socket allocation failed"); + } + + (void)setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)); + (void)setsockopt(sd, SOL_SOCKET, SO_RCVBUF, (char *)&size, sizeof(size)); + (void)setsockopt(sd, SOL_SOCKET, SO_SNDBUF, (char *)&size, sizeof(size)); + if (bind(sd, (struct sockaddr *)&server, sizeof(server)) == -1) { + free(res); + close(sd); + RAISE1(system_error,"Cannot bind to port %d",port); + } + + if (listen(sd, 5) != -1) { + free(res); + close(sd); + RAISE1(system_error,"Cannot listen to port %d",port); + } + + FD_SET(sd, &(data->incoming_socks)); + + *dst=res; + res->plugin = self; + res->incoming = 1; + res->sd = sd; + res->port=port; + res->peer_port=-1; + res->peer_name=NULL; -void gras_trp_tcp_socket_close(gras_trp_sock_t **sd){ - ERROR1("%s not implemented",__FUNCTION__); - abort(); + DEBUG2("Openned a server socket on port %d (sock %d)",port,sd); + + return no_error; } -gras_error_t gras_trp_tcp_select(double timeOut, - gras_trp_sock_t **sd){ - RAISE_UNIMPLEMENTED; +gras_error_t +gras_trp_tcp_socket_accept(gras_socket_t *sock, + gras_socket_t **dst) { + gras_socket_t *res; + + struct sockaddr_in peer_in; + socklen_t peer_in_len = sizeof(peer_in); + + int sd; + int tmp_errno; + + res=malloc(sizeof(gras_socket_t)); + if (!res) + RAISE_MALLOC; + + sd = accept(sock->sd, (struct sockaddr *)&peer_in, &peer_in_len); + tmp_errno = errno; + + if(sd == -1) { + gras_socket_close(sock); + RAISE1(system_error, + "Accept failed (%s). Droping server socket.", strerror(tmp_errno)); + } else { + int i = 1; + socklen_t s = sizeof(int); + + if (setsockopt(sd, SOL_SOCKET, SO_KEEPALIVE, (char *)&i, s) + || setsockopt(sd, TcpProtoNumber(), TCP_NODELAY, (char *)&i, s)) { + WARNING0("setsockopt failed, cannot condition the accepted socket"); + } + + i = ((gras_trp_tcp_sock_specific_t*)sock->specific)->buffsize; + if (setsockopt(sd, SOL_SOCKET, SO_RCVBUF, (char *)&i, s) + || setsockopt(sd, SOL_SOCKET, SO_SNDBUF, (char *)&i, s)) { + WARNING0("setsockopt failed, cannot set buffsize"); + } + + res->plugin = sock->plugin; + res->incoming = 1; + res->sd = sd; + res->port= -1; + res->peer_port= peer_in.sin_port; + + if (((struct sockaddr *)&peer_in)->sa_family != AF_INET) { + res->peer_name = strdup("unknown"); + } else { + struct in_addr addrAsInAddr; + char *tmp; + + addrAsInAddr.s_addr = peer_in.sin_addr.s_addr; + + tmp = inet_ntoa(addrAsInAddr); + if (tmp != NULL) { + res->peer_name = strdup(inet_ntoa(addrAsInAddr)); + } else { + res->peer_name = strdup("unknown"); + } + } + + VERB3("accepted socket %d to %s:%d\n", sd, res->peer_name,res->peer_port); + + *dst = res; + + return no_error; + } } + +void gras_trp_tcp_socket_close(gras_socket_t *sock){ + gras_trp_tcp_specific_t *tcp; -gras_error_t gras_trp_tcp_bloc_send(gras_trp_sock_t *sd, - void *data, - size_t size, - double timeOut){ - RAISE_UNIMPLEMENTED; + if (!sock) return; /* close only once */ + tcp=sock->plugin->specific; + + DEBUG1("close tcp connection %d\n", sock->sd); + + /* FIXME: no pipe in GRAS so far + if(!FD_ISSET(sd, &connectedPipes)) { + if(shutdown(sd, 2) < 0) { + GetNWSLock(&lock); + tmp_errno = errno; + ReleaseNWSLock(&lock); + + / * The other side may have beaten us to the reset. * / + if ((tmp_errno!=ENOTCONN) && (tmp_errno!=ECONNRESET)) { + WARN1("CloseSocket: shutdown error %d\n", tmp_errno); + } + } + } */ + + /* close the socket */ + if(close(sock->sd) < 0) { + WARNING3("error while closing tcp socket %d: %d (%s)\n", sock->sd, errno, strerror(errno)); + } + + /* forget about it */ + FD_CLR(sock->sd, &(tcp->incoming_socks)); + } -gras_error_t gras_trp_tcp_bloc_recv(gras_trp_sock_t *sd, - void *data, - size_t size, - double timeOut){ - RAISE_UNIMPLEMENTED; +gras_error_t gras_trp_tcp_bloc_send(gras_socket_t *sock, + char *data, + size_t size){ + + gras_assert0(sock && !sock->incoming, "Ascked to send stuff on an incomming socket"); + gras_assert0(size >= 0, "Cannot send a negative amount of data"); + + while (size) { + int status = 0; + + status = write(sock->sd, data, (size_t)size); + DEBUG3("write(%d, %p, %ld);\n", sock->sd, data, size); + + if (status == -1) { + RAISE4(system_error,"write(%d,%p,%d) failed: %s", + sock->sd, data, (int)size, + strerror(errno)); + } + + if (status) { + size -= status; + data += status; + } else { + RAISE0(system_error,"file descriptor closed"); + } + } + + return no_error; } -gras_error_t gras_trp_tcp_flush(gras_trp_sock_t *sd){ - RAISE_UNIMPLEMENTED; +gras_error_t gras_trp_tcp_bloc_recv(gras_socket_t *sock, + char *data, + size_t size){ + + gras_assert0(sock && !sock->incoming, "Ascked to receive stuff on an outcomming socket"); + gras_assert0(size >= 0, "Cannot receive a negative amount of data"); + + while (size) { + int status = 0; + + status = read(sock->sd, data, (size_t)size); + DEBUG3("read(%d, %p, %ld);\n", sock->sd, data, size); + + if (status == -1) { + RAISE4(system_error,"read(%d,%p,%d) failed: %s", + sock->sd, data, (int)size, + strerror(errno)); + } + + if (status) { + size -= status; + data += status; + } else { + RAISE0(system_error,"file descriptor closed"); + } + } + + return no_error; } + +/* + * Returns the tcp protocol number from the network protocol data base. + * + * getprotobyname() is not thread safe. We need to lock it. + */ +static int TcpProtoNumber(void) { + struct protoent *fetchedEntry; + static int returnValue = 0; + + if(returnValue == 0) { + fetchedEntry = getprotobyname("tcp"); + gras_assert0(fetchedEntry, "getprotobyname(tcp) gave NULL"); + returnValue = fetchedEntry->p_proto; + } + + return returnValue; +} diff --git a/src/gras/gras_private.h b/src/gras/gras_private.h index aa088af277..d4031e267b 100644 --- a/src/gras/gras_private.h +++ b/src/gras/gras_private.h @@ -16,19 +16,11 @@ #include #include -/* Oli's macro */ -#ifndef GS_FAILURE_CONTEXT -# define GS_FAILURE_CONTEXT -#endif /* FAILURE_CONTEXT */ - -#define GS_FAILURE(str) \ - (fprintf(stderr, "FAILURE: %s(%s:%d)" GS_FAILURE_CONTEXT "%s\n", __func__, __FILE__, __LINE__, (str)), \ - abort()) - #define max(a, b) (((a) > (b))?(a):(b)) #define min(a, b) (((a) < (b))?(a):(b)) -/* end of Oli's cruft */ +#define TRUE 1 +#define FALSE 0 #include "gras_config.h" @@ -42,221 +34,14 @@ #include "gras/core.h" #include "gras/process.h" + #include "gras/transport.h" +#include "Transport/transport_interface.h" #include "gras/datadesc.h" -#include "gras/socket.h" +#include "DataDesc/datadesc_interface.h" #include "gras/messages.h" +#include "Messaging/messaging_interface.h" -#define TRUE 1 -#define FALSE 0 - -#define ASSERT(cond,msg) do {if (!(cond)) { fprintf(stderr,msg); abort(); }} while(0) - -/* ************************************************************************** - * Locking system - ****************************************************************************/ -/** - * gras_lock: - * @Returns: 1 if succesfull 0 otherwise. - * - * Get the GRAS lock. - */ -int -gras_lock(void); - -/** - * gras_unlock: - * @Returns: 1 if succesfull 0 otherwise. - * - * release the GRAS general lock. - */ -int -gras_unlock(void); - -/* ************************************************************************** - * Messaging stuff - * **************************************************************************/ - -/** - * gras_cblist_t: - * - * The list of callbacks for a given message type on a given host - */ -typedef struct { - gras_msgid_t id; /** identificator of this message */ - - int cbCount; /** number of registered callbacks */ - gras_cb_t *cb; /** callbacks */ - int *cbTTL; /** TTL of each callback (in number of use)*/ -} gras_cblist_t; - -/** - * gras_msgentry_t: - * - * An entry in the registered message list. - */ - -struct gras_msgentry_s { - gras_msgid_t id; /** identificator of this message */ - char *name; /** printable name of this message */ - - int seqCount; /** number of sequence for this message */ - DataDescriptor **dd; /** list of datadescriptor for each sequence */ - size_t *ddCount; /** list of datadescriptor for each sequence */ - unsigned int *networkSize;/** network size of one element in each sequence */ - unsigned int *hostSize; /** host size of one element in each sequence */ -}; -/* ************************************************************************** - * GRAS globals - * **************************************************************************/ - -/** - * gras_hostglobal_t: - * - * Globals for a given host. - */ -typedef struct { - gras_cblist_t *grasCbList; /** callbacks for registered messages */ - unsigned int grasCbListCount; /** length of previous array */ -} gras_hostglobal_t; - -/** - * gras_msgheader_t: - * - * A header sent with messages. #version# is the NWS version and is presently - * ignored, but it could be used for compatibility. #message# is the actual - * message. #seqCount# is the number of sequence accompagning this message. - */ -struct gras_msgheader_s { - char version[10]; - gras_msgid_t message; - unsigned int dataSize; - unsigned int seqCount; -}; - -/** - * gras_process_data_t: - * - * Data for each process - */ -typedef struct { - /* queue of messages which where received but not wanted in msgWait, and therefore - temporarly queued until the next msgHandle */ - gras_dynar_t *msg_queue; /* elm type: gras_msg_t */ - - /* registered callbacks for each message */ - gras_dynar_t *cbl_list; /* elm type: gras_cblist_t */ - - - /* The channel we are listening to in SG for formated messages */ - int chan; - /* The channel we are listening to in SG for raw send/recv */ - int rawChan; - - /* globals of the process */ - void *userdata; -} gras_process_data_t; - - -/*@unused@*/static const DataDescriptor headerDescriptor[] = - {SIMPLE_MEMBER(CHAR_TYPE, 10, offsetof(gras_msgheader_t, version)), - SIMPLE_MEMBER(UNSIGNED_INT_TYPE, 1, offsetof(gras_msgheader_t, message)), - SIMPLE_MEMBER(UNSIGNED_INT_TYPE, 1, offsetof(gras_msgheader_t, dataSize)), - SIMPLE_MEMBER(UNSIGNED_INT_TYPE, 1, offsetof(gras_msgheader_t, seqCount))}; -#define headerDescriptorCount 4 - -/*@unused@*/static const DataDescriptor countDescriptor[] = - {SIMPLE_DATA(UNSIGNED_INT_TYPE,1)}; -#define countDescriptorCount 1 - -/** - * GRASVERSION - * - * This string is sent in each message to identify the version of the - * communication protocol used. This may be paranoid, but I feel so right now. - */ -#define GRASVERSION "0.0.020504" - -/** - * grasMsgEntryGet: - * @id: msg id to look for - * @Returns: the entry if found, NULL otherwise - * - * Get the entry corresponding to this message id; - */ /*@observer@*/ -gras_msgentry_t * grasMsgEntryGet(gras_msgid_t id); - -/** - * gras_process_data_get: - * - * Get the GRAS globals for this host - */ /*@observer@*/ -gras_process_data_t *gras_process_data_get(void); - -/** - * gras_cb_get: - * @id: msg id to look for - * - * Get the callback list corresponding to this message id; - */ /*@observer@*/ -gras_cblist_t * gras_cb_get(gras_msgid_t id); - -/** - * gras_cb_create: - * @id: the id of the new msg - * - * Create a new callback list for a new message id. - */ -gras_error_t gras_cb_create(gras_msgid_t message); - -/** - * grasMsgHeaderNew: - * @msgId: - * @dataSize: total size in network format, including headers and seqcount - * @seqCount: Number of sequences in this message (to check that everything goes well) - * @Returns: the created header - * - * Create a new header containing the passed values. - */ -gras_msgheader_t *grasMsgHeaderNew(gras_msgid_t msgId, - unsigned int dataSize, - unsigned int seqCount); - -/** - * grasMsgRecv: - * - * Receive the next message arriving within the given timeout - */ -gras_error_t grasMsgRecv(gras_msg_t **msg, double timeout); - -/** - * gras_sock_new: - * - * Create an empty socket - */ -gras_sock_t *gras_sock_new(void); - -/** - * grasSockFree: - * - * Frees an old socket - */ -void grasSockFree(gras_sock_t *s); - - +#include "Virtu/virtu_interface.h" -/* ************************************************************************** - * Handling DataDescriptors - * **************************************************************************/ -#if 0 -FIXME: Kill it -typedef enum {HOST_FORMAT, NETWORK_FORMAT} FormatTypes; -size_t DataSize(const DataDescriptor *description, - size_t length, - FormatTypes format); -void *gras_datadesc_copy_data(const DataDescriptor *dd, unsigned int c, void *data); -int gras_datadesc_cmp(/*@null@*/const DataDescriptor *dd1, unsigned int c1, - /*@null@*/const DataDescriptor *dd2, unsigned int c2); -void gras_datadesc_dump(/*@null@*/const DataDescriptor *dd, unsigned int c); -#endif #endif /* GRAS_PRIVATE_H */ -- 2.20.1