* separation of the serialization/deserialization files into dedicated files 65/5265/3
Sylvestre Ledru [Sun, 16 Oct 2011 19:03:04 +0000 (21:03 +0200)]
* improve the error reporting
* Deprecated & old files removed
* Added a unitary tests

Change-Id: I67d5544f72f1dcb06ee7d8e0a980d13fa90c9614

28 files changed:
scilab/modules/mpi/Makefile.am
scilab/modules/mpi/Makefile.in
scilab/modules/mpi/sci_gateway/c/gw_mpi.c
scilab/modules/mpi/sci_gateway/c/sci_mpi_recv.c
scilab/modules/mpi/sci_gateway/c/sci_mpi_recv.c.back [deleted file]
scilab/modules/mpi/sci_gateway/c/sci_mpi_send.c
scilab/modules/mpi/sci_gateway/c/sci_mpi_send.c.back [deleted file]
scilab/modules/mpi/sci_gateway/c/sci_mpi_serialize.c [deleted file]
scilab/modules/mpi/sci_gateway/c/sci_mpi_unserialize.c [deleted file]
scilab/modules/mpi/sci_gateway/mpi_gateway.xml
scilab/modules/mpi/src/c/deserialization.c [new file with mode: 0644]
scilab/modules/mpi/src/c/deserialization.h [new file with mode: 0644]
scilab/modules/mpi/src/c/mappingScilabMPI.c [deleted file]
scilab/modules/mpi/src/c/mappingScilabMPI.h [deleted file]
scilab/modules/mpi/src/c/s_mpi_recv.c [deleted file]
scilab/modules/mpi/src/c/s_mpi_recv.h [deleted file]
scilab/modules/mpi/src/c/s_mpi_send.c [deleted file]
scilab/modules/mpi/src/c/s_mpi_send.h [deleted file]
scilab/modules/mpi/src/c/serialization.c [new file with mode: 0644]
scilab/modules/mpi/src/c/serialization.h [new file with mode: 0644]
scilab/modules/mpi/tests/unit_tests/mpi_send_boolean.tst
scilab/modules/mpi/tests/unit_tests/mpi_send_boolean_sparse.tst
scilab/modules/mpi/tests/unit_tests/mpi_send_double.dia.ref
scilab/modules/mpi/tests/unit_tests/mpi_send_double.tst
scilab/modules/mpi/tests/unit_tests/mpi_send_int.tst
scilab/modules/mpi/tests/unit_tests/mpi_send_sparse.tst
scilab/modules/mpi/tests/unit_tests/mpi_send_string.tst
scilab/modules/mpi/tests/unit_tests/serialization.tst [deleted file]

index 2eb797e..3ddba21 100644 (file)
@@ -42,7 +42,8 @@ MPI_PI_SOURCES = src/c/mpi_pi_send.c src/c/dboard.c
 mpi_pi_SOURCES = $(MPI_PI_SOURCES)
 mpi_pi_LDFLAGS = $(OPENMPI_LIBS)
 
-MPI_C_SOURCES = src/c/mappingScilabMPI.c
+MPI_C_SOURCES =     src/c/serialization.c \
+    src/c/deserialization.c
 mpitest_contiguous_SOURCES = src/c/mpitest_contiguous.c
 
 check-am:
@@ -58,14 +59,7 @@ GATEWAY_C_SOURCES = \
     sci_gateway/c/sci_mpi_comm_rank.c \
     sci_gateway/c/gw_mpi.c \
     sci_gateway/c/sci_mpi_recv.c \
-    sci_gateway/c/sci_mpi_send.c \
-    sci_gateway/c/sci_mpi_serialize.c \
-    sci_gateway/c/sci_mpi_unserialize.c \
-    src/c/build_buff_type.c \
-    src/c/pre_send_recv_metadata.c \
-    src/c/s_mpi_recv.c \
-    src/c/s_mpi_send.c
-
+    sci_gateway/c/sci_mpi_send.c
 
 # Includes need for the compilation
 # MPI code needs to be compile with the openmpi 'compiler' (it is a wrapper)
index 8b12453..52a0da0 100644 (file)
@@ -146,13 +146,9 @@ am__objects_1 = libscimpi_la-sci_mpi_init.lo \
        libscimpi_la-sci_mpi_finalize.lo \
        libscimpi_la-sci_mpi_comm_size.lo \
        libscimpi_la-sci_mpi_comm_rank.lo libscimpi_la-gw_mpi.lo \
-       libscimpi_la-sci_mpi_recv.lo libscimpi_la-sci_mpi_send.lo \
-       libscimpi_la-sci_mpi_serialize.lo \
-       libscimpi_la-sci_mpi_unserialize.lo \
-       libscimpi_la-build_buff_type.lo \
-       libscimpi_la-pre_send_recv_metadata.lo \
-       libscimpi_la-s_mpi_recv.lo libscimpi_la-s_mpi_send.lo
-am__objects_2 = libscimpi_la-mappingScilabMPI.lo
+       libscimpi_la-sci_mpi_recv.lo libscimpi_la-sci_mpi_send.lo
+am__objects_2 = libscimpi_la-serialization.lo \
+       libscimpi_la-deserialization.lo
 am_libscimpi_la_OBJECTS = $(am__objects_1) $(am__objects_2)
 libscimpi_la_OBJECTS = $(am_libscimpi_la_OBJECTS)
 libscimpi_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
@@ -474,7 +470,9 @@ mpitest_scilab_data_LDFLAGS = $(OPENMPI_LIBS)
 MPI_PI_SOURCES = src/c/mpi_pi_send.c src/c/dboard.c
 mpi_pi_SOURCES = $(MPI_PI_SOURCES)
 mpi_pi_LDFLAGS = $(OPENMPI_LIBS)
-MPI_C_SOURCES = src/c/mappingScilabMPI.c
+MPI_C_SOURCES = src/c/serialization.c \
+    src/c/deserialization.c
+
 mpitest_contiguous_SOURCES = src/c/mpitest_contiguous.c
 # List of the gateway c files
 GATEWAY_C_SOURCES = \
@@ -484,13 +482,7 @@ GATEWAY_C_SOURCES = \
     sci_gateway/c/sci_mpi_comm_rank.c \
     sci_gateway/c/gw_mpi.c \
     sci_gateway/c/sci_mpi_recv.c \
-    sci_gateway/c/sci_mpi_send.c \
-    sci_gateway/c/sci_mpi_serialize.c \
-    sci_gateway/c/sci_mpi_unserialize.c \
-    src/c/build_buff_type.c \
-    src/c/pre_send_recv_metadata.c \
-    src/c/s_mpi_recv.c \
-    src/c/s_mpi_send.c
+    sci_gateway/c/sci_mpi_send.c
 
 libscimpi_la_CFLAGS = -Iincludes/ \
        -Isrc/c/ \
@@ -728,20 +720,15 @@ distclean-compile:
        -rm -f *.tab.c
 
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dboard.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscimpi_la-build_buff_type.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscimpi_la-deserialization.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscimpi_la-gw_mpi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscimpi_la-mappingScilabMPI.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscimpi_la-pre_send_recv_metadata.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscimpi_la-s_mpi_recv.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscimpi_la-s_mpi_send.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscimpi_la-sci_mpi_comm_rank.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscimpi_la-sci_mpi_comm_size.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscimpi_la-sci_mpi_finalize.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscimpi_la-sci_mpi_init.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscimpi_la-sci_mpi_recv.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscimpi_la-sci_mpi_send.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscimpi_la-sci_mpi_serialize.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscimpi_la-sci_mpi_unserialize.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscimpi_la-serialization.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_pi_send.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpitest.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpitest_contiguous.Po@am__quote@
@@ -818,54 +805,19 @@ libscimpi_la-sci_mpi_send.lo: sci_gateway/c/sci_mpi_send.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscimpi_la_CFLAGS) $(CFLAGS) -c -o libscimpi_la-sci_mpi_send.lo `test -f 'sci_gateway/c/sci_mpi_send.c' || echo '$(srcdir)/'`sci_gateway/c/sci_mpi_send.c
 
-libscimpi_la-sci_mpi_serialize.lo: sci_gateway/c/sci_mpi_serialize.c
-@am__fastdepCC_TRUE@   $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscimpi_la_CFLAGS) $(CFLAGS) -MT libscimpi_la-sci_mpi_serialize.lo -MD -MP -MF $(DEPDIR)/libscimpi_la-sci_mpi_serialize.Tpo -c -o libscimpi_la-sci_mpi_serialize.lo `test -f 'sci_gateway/c/sci_mpi_serialize.c' || echo '$(srcdir)/'`sci_gateway/c/sci_mpi_serialize.c
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/libscimpi_la-sci_mpi_serialize.Tpo $(DEPDIR)/libscimpi_la-sci_mpi_serialize.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='sci_gateway/c/sci_mpi_serialize.c' object='libscimpi_la-sci_mpi_serialize.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscimpi_la_CFLAGS) $(CFLAGS) -c -o libscimpi_la-sci_mpi_serialize.lo `test -f 'sci_gateway/c/sci_mpi_serialize.c' || echo '$(srcdir)/'`sci_gateway/c/sci_mpi_serialize.c
-
-libscimpi_la-sci_mpi_unserialize.lo: sci_gateway/c/sci_mpi_unserialize.c
-@am__fastdepCC_TRUE@   $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscimpi_la_CFLAGS) $(CFLAGS) -MT libscimpi_la-sci_mpi_unserialize.lo -MD -MP -MF $(DEPDIR)/libscimpi_la-sci_mpi_unserialize.Tpo -c -o libscimpi_la-sci_mpi_unserialize.lo `test -f 'sci_gateway/c/sci_mpi_unserialize.c' || echo '$(srcdir)/'`sci_gateway/c/sci_mpi_unserialize.c
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/libscimpi_la-sci_mpi_unserialize.Tpo $(DEPDIR)/libscimpi_la-sci_mpi_unserialize.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='sci_gateway/c/sci_mpi_unserialize.c' object='libscimpi_la-sci_mpi_unserialize.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscimpi_la_CFLAGS) $(CFLAGS) -c -o libscimpi_la-sci_mpi_unserialize.lo `test -f 'sci_gateway/c/sci_mpi_unserialize.c' || echo '$(srcdir)/'`sci_gateway/c/sci_mpi_unserialize.c
-
-libscimpi_la-build_buff_type.lo: src/c/build_buff_type.c
-@am__fastdepCC_TRUE@   $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscimpi_la_CFLAGS) $(CFLAGS) -MT libscimpi_la-build_buff_type.lo -MD -MP -MF $(DEPDIR)/libscimpi_la-build_buff_type.Tpo -c -o libscimpi_la-build_buff_type.lo `test -f 'src/c/build_buff_type.c' || echo '$(srcdir)/'`src/c/build_buff_type.c
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/libscimpi_la-build_buff_type.Tpo $(DEPDIR)/libscimpi_la-build_buff_type.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='src/c/build_buff_type.c' object='libscimpi_la-build_buff_type.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscimpi_la_CFLAGS) $(CFLAGS) -c -o libscimpi_la-build_buff_type.lo `test -f 'src/c/build_buff_type.c' || echo '$(srcdir)/'`src/c/build_buff_type.c
-
-libscimpi_la-pre_send_recv_metadata.lo: src/c/pre_send_recv_metadata.c
-@am__fastdepCC_TRUE@   $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscimpi_la_CFLAGS) $(CFLAGS) -MT libscimpi_la-pre_send_recv_metadata.lo -MD -MP -MF $(DEPDIR)/libscimpi_la-pre_send_recv_metadata.Tpo -c -o libscimpi_la-pre_send_recv_metadata.lo `test -f 'src/c/pre_send_recv_metadata.c' || echo '$(srcdir)/'`src/c/pre_send_recv_metadata.c
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/libscimpi_la-pre_send_recv_metadata.Tpo $(DEPDIR)/libscimpi_la-pre_send_recv_metadata.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='src/c/pre_send_recv_metadata.c' object='libscimpi_la-pre_send_recv_metadata.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscimpi_la_CFLAGS) $(CFLAGS) -c -o libscimpi_la-pre_send_recv_metadata.lo `test -f 'src/c/pre_send_recv_metadata.c' || echo '$(srcdir)/'`src/c/pre_send_recv_metadata.c
-
-libscimpi_la-s_mpi_recv.lo: src/c/s_mpi_recv.c
-@am__fastdepCC_TRUE@   $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscimpi_la_CFLAGS) $(CFLAGS) -MT libscimpi_la-s_mpi_recv.lo -MD -MP -MF $(DEPDIR)/libscimpi_la-s_mpi_recv.Tpo -c -o libscimpi_la-s_mpi_recv.lo `test -f 'src/c/s_mpi_recv.c' || echo '$(srcdir)/'`src/c/s_mpi_recv.c
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/libscimpi_la-s_mpi_recv.Tpo $(DEPDIR)/libscimpi_la-s_mpi_recv.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='src/c/s_mpi_recv.c' object='libscimpi_la-s_mpi_recv.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscimpi_la_CFLAGS) $(CFLAGS) -c -o libscimpi_la-s_mpi_recv.lo `test -f 'src/c/s_mpi_recv.c' || echo '$(srcdir)/'`src/c/s_mpi_recv.c
-
-libscimpi_la-s_mpi_send.lo: src/c/s_mpi_send.c
-@am__fastdepCC_TRUE@   $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscimpi_la_CFLAGS) $(CFLAGS) -MT libscimpi_la-s_mpi_send.lo -MD -MP -MF $(DEPDIR)/libscimpi_la-s_mpi_send.Tpo -c -o libscimpi_la-s_mpi_send.lo `test -f 'src/c/s_mpi_send.c' || echo '$(srcdir)/'`src/c/s_mpi_send.c
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/libscimpi_la-s_mpi_send.Tpo $(DEPDIR)/libscimpi_la-s_mpi_send.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='src/c/s_mpi_send.c' object='libscimpi_la-s_mpi_send.lo' libtool=yes @AMDEPBACKSLASH@
+libscimpi_la-serialization.lo: src/c/serialization.c
+@am__fastdepCC_TRUE@   $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscimpi_la_CFLAGS) $(CFLAGS) -MT libscimpi_la-serialization.lo -MD -MP -MF $(DEPDIR)/libscimpi_la-serialization.Tpo -c -o libscimpi_la-serialization.lo `test -f 'src/c/serialization.c' || echo '$(srcdir)/'`src/c/serialization.c
+@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/libscimpi_la-serialization.Tpo $(DEPDIR)/libscimpi_la-serialization.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='src/c/serialization.c' object='libscimpi_la-serialization.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscimpi_la_CFLAGS) $(CFLAGS) -c -o libscimpi_la-s_mpi_send.lo `test -f 'src/c/s_mpi_send.c' || echo '$(srcdir)/'`src/c/s_mpi_send.c
+@am__fastdepCC_FALSE@  $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscimpi_la_CFLAGS) $(CFLAGS) -c -o libscimpi_la-serialization.lo `test -f 'src/c/serialization.c' || echo '$(srcdir)/'`src/c/serialization.c
 
-libscimpi_la-mappingScilabMPI.lo: src/c/mappingScilabMPI.c
-@am__fastdepCC_TRUE@   $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscimpi_la_CFLAGS) $(CFLAGS) -MT libscimpi_la-mappingScilabMPI.lo -MD -MP -MF $(DEPDIR)/libscimpi_la-mappingScilabMPI.Tpo -c -o libscimpi_la-mappingScilabMPI.lo `test -f 'src/c/mappingScilabMPI.c' || echo '$(srcdir)/'`src/c/mappingScilabMPI.c
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/libscimpi_la-mappingScilabMPI.Tpo $(DEPDIR)/libscimpi_la-mappingScilabMPI.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='src/c/mappingScilabMPI.c' object='libscimpi_la-mappingScilabMPI.lo' libtool=yes @AMDEPBACKSLASH@
+libscimpi_la-deserialization.lo: src/c/deserialization.c
+@am__fastdepCC_TRUE@   $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscimpi_la_CFLAGS) $(CFLAGS) -MT libscimpi_la-deserialization.lo -MD -MP -MF $(DEPDIR)/libscimpi_la-deserialization.Tpo -c -o libscimpi_la-deserialization.lo `test -f 'src/c/deserialization.c' || echo '$(srcdir)/'`src/c/deserialization.c
+@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/libscimpi_la-deserialization.Tpo $(DEPDIR)/libscimpi_la-deserialization.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='src/c/deserialization.c' object='libscimpi_la-deserialization.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscimpi_la_CFLAGS) $(CFLAGS) -c -o libscimpi_la-mappingScilabMPI.lo `test -f 'src/c/mappingScilabMPI.c' || echo '$(srcdir)/'`src/c/mappingScilabMPI.c
+@am__fastdepCC_FALSE@  $(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscimpi_la_CFLAGS) $(CFLAGS) -c -o libscimpi_la-deserialization.lo `test -f 'src/c/deserialization.c' || echo '$(srcdir)/'`src/c/deserialization.c
 
 mpi_pi_send.o: src/c/mpi_pi_send.c
 @am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mpi_pi_send.o -MD -MP -MF $(DEPDIR)/mpi_pi_send.Tpo -c -o mpi_pi_send.o `test -f 'src/c/mpi_pi_send.c' || echo '$(srcdir)/'`src/c/mpi_pi_send.c
index ec76ad7..da64034 100644 (file)
 #endif
 #include "machine.h"
 /*-----------------------------------------------------------------------------------*/
-static MPITable Tab[]=
-{
-       {sci_mpi_init,"MPI_Init"},
-       {sci_mpi_finalize,"MPI_Finalize"},
-       {sci_mpi_comm_size,"MPI_Comm_size"},
-       {sci_mpi_comm_rank,"MPI_Comm_rank"},
-       {sci_mpi_recv,"MPI_Recv"},
-       {sci_mpi_send,"MPI_Send"},
-       {sci_mpi_serialize,"MPI_serialize"},
-       {sci_mpi_unserialize,"MPI_unserialize"}
+static MPITable Tab[] = {
+    {sci_mpi_init, "MPI_Init"},
+    {sci_mpi_finalize, "MPI_Finalize"},
+    {sci_mpi_comm_size, "MPI_Comm_size"},
+    {sci_mpi_comm_rank, "MPI_Comm_rank"},
+    {sci_mpi_recv, "MPI_Recv"},
+    {sci_mpi_send, "MPI_Send"}
 };
+
 /*static MPITable Tab[]=
 {
        {intsmpi_send,"mpi_send"},
@@ -40,26 +38,26 @@ static MPITable Tab[]=
 };*/
 /*-----------------------------------------------------------------------------------*/
 int gw_mpi(void)
-{  
-       Rhs = Max(0, Rhs);
+{
+    Rhs = Max(0, Rhs);
 
 #ifdef _MSC_VER
-       #ifndef _DEBUG
-               _try
-               {
-                       (*(Tab[Fin-1].f)) (Tab[Fin-1].name,strlen(Tab[Fin-1].name));
-               }
-               _except (EXCEPTION_EXECUTE_HANDLER)
-               {       
-                       ExceptionMessage(GetExceptionCode(),Tab[Fin-1].name);
-               }
-       #else
-               (*(Tab[Fin-1].f)) (Tab[Fin-1].name,strlen(Tab[Fin-1].name));
-       #endif
+#ifndef _DEBUG
+    _try
+    {
+        (*(Tab[Fin - 1].f)) (Tab[Fin - 1].name, strlen(Tab[Fin - 1].name));
+    }
+    _except(EXCEPTION_EXECUTE_HANDLER)
+    {
+        ExceptionMessage(GetExceptionCode(), Tab[Fin - 1].name);
+    }
 #else
-                       (*(Tab[Fin-1].f)) (Tab[Fin-1].name,strlen(Tab[Fin-1].name));
+    (*(Tab[Fin - 1].f)) (Tab[Fin - 1].name, strlen(Tab[Fin - 1].name));
 #endif
-       return 0;
+#else
+    (*(Tab[Fin - 1].f)) (Tab[Fin - 1].name, strlen(Tab[Fin - 1].name));
+#endif
+    return 0;
 }
-/*-----------------------------------------------------------------------------------*/
 
+/*-----------------------------------------------------------------------------------*/
index ff9ab22..4e15688 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2007-2009 - DIGITEO - Sylvestre LEDRU
+ * Copyright (C) 2011-2011 - DIGITEO - Sylvestre LEDRU
  *
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
 #include "gw_mpi.h"
 #include "Scierror.h"
 #include "MALLOC.h"
+#include "deserialization.h"
 
-
-int deserialize_double(void* _pvCtx, int* _piBuffer, int _iBufferSize);
-int deserialize_string(void* _pvCtx, int* _piBuffer, int _iBufferSize);
-int deserialize_boolean(void* _pvCtx, int* _piBuffer, int _iBufferSize);
-int deserialize_int(void* _pvCtx, int* _piBuffer, int _iBufferSize);
-int deserialize_sparse(void* _pvCtx, int* _piBuffer, int _iBufferSize, BOOL _bData);
-
-int sci_mpi_recv(char *fname,unsigned long fname_len)
+int sci_mpi_recv(char *fname, unsigned long fname_len)
 {
     SciErr sciErr;
-    int iRet        = 0;
-    int* piBuffer   = NULL;
+    int iRet = 0;
+    int *piBuffer = NULL;
     int iBufferSize = 0;
 
-    int* piAddr1    = NULL;
-    int* piAddr2    = NULL;
-    double Tag      = 0;
-    double Rank       = 0;
+    int *piAddr1 = NULL;
+    int *piAddr2 = NULL;
+    double Tag = 0;
+    double Rank = 0;
 
-       MPI_Status status;
-    
-    CheckRhs(2,2);
-    CheckLhs(1,1);
+    MPI_Status status;
 
+    CheckRhs(2, 2);
+    CheckLhs(1, 1);
 
     //Rank
-       sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr1);
-       if(sciErr.iErr)
-       {
-               printError(&sciErr, 0);
-               return 0;
-       }
-    
-    
-    if(getScalarDouble(pvApiCtx, piAddr1, &Rank))
+    sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr1);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 0;
+    }
+
+    if (getScalarDouble(pvApiCtx, piAddr1, &Rank))
     {
         return 1;
     }
 
     //Tag    
-       sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr2);
-       if(sciErr.iErr)
-       {
-               printError(&sciErr, 0);
-               return 0;
-       }
-    
-    
-    if(getScalarDouble(pvApiCtx, piAddr2, &Tag))
+    sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr2);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 0;
+    }
+
+    if (getScalarDouble(pvApiCtx, piAddr2, &Tag))
     {
         return 1;
     }
@@ -80,331 +71,76 @@ int sci_mpi_recv(char *fname,unsigned long fname_len)
     iRet = MPI_Probe(Rank, Tag, MPI_COMM_WORLD, &status);
     if (iRet != MPI_SUCCESS)
     {
-           Scierror(999, "MPI_Probe failed");
+        char error_string[MPI_MAX_ERROR_STRING];
+        int length_of_error_string;
+        
+        MPI_Error_string(iRet, error_string, &length_of_error_string);
+        Scierror(999, "%s: MPI_Probe failed. Rank %d / Tag %d: %s\n", fname, Rank, Tag, error_string);
         return 1;
     }
 
     if (MPI_Get_count(&status, MPI_INT, &iBufferSize) != MPI_SUCCESS)
     {
-           Scierror(999, "MPI_Get_count failed");
+        char error_string[MPI_MAX_ERROR_STRING];
+        int length_of_error_string;
+        
+        MPI_Error_string(iRet, error_string, &length_of_error_string);
+        Scierror(999, "%s: MPI_Get_count failed. Rank %d / Tag %d: %s\n", fname, Rank, Tag, error_string);
         return 1;
     }
-    
-    piBuffer = (int*)MALLOC(sizeof(int) * iBufferSize);
-    if(piBuffer == NULL)
+
+    piBuffer = (int *)MALLOC(sizeof(int) * iBufferSize);
+    if (piBuffer == NULL)
     {
-           Scierror(999, "alloc failed");
+        Scierror(999, "%s: Could not create the received variable.\n", fname);
         return 1;
     }
 
     iRet = MPI_Recv(piBuffer, iBufferSize, MPI_INT, Rank, Tag, MPI_COMM_WORLD, &status);
     if (iRet != MPI_SUCCESS)
     {
-        Scierror(999, "MPI_Recv failed\n");
+        char error_string[MPI_MAX_ERROR_STRING];
+        int length_of_error_string;
+        
+        MPI_Error_string(iRet, error_string, &length_of_error_string);
+        Scierror(999, "%s: MPI_Recv failed. Rank %d / Tag %d: %s\n", fname, Rank, Tag, error_string);
+
         return 1;
     }
 
-    switch(piBuffer[0])
+    switch (piBuffer[0])
     {
-    case sci_matrix :
+    case sci_matrix:
         iRet = deserialize_double(pvApiCtx, piBuffer, iBufferSize);
         break;
-    case sci_strings :
+    case sci_strings:
         iRet = deserialize_string(pvApiCtx, piBuffer, iBufferSize);
         break;
-    case sci_boolean :
+    case sci_boolean:
         iRet = deserialize_boolean(pvApiCtx, piBuffer, iBufferSize);
         break;
-    case sci_sparse :
+    case sci_sparse:
         iRet = deserialize_sparse(pvApiCtx, piBuffer, iBufferSize, TRUE);
         break;
-    case sci_boolean_sparse :
+    case sci_boolean_sparse:
         iRet = deserialize_sparse(pvApiCtx, piBuffer, iBufferSize, FALSE);
         break;
-    case sci_ints :
+    case sci_ints:
         iRet = deserialize_int(pvApiCtx, piBuffer, iBufferSize);
         break;
-    default :
+    default:
         return 1;
         break;
     }
 
     free(piBuffer);
-    if(iRet)
+    if (iRet)
     {
         return 1;
     }
-  
+
     LhsVar(1) = 1;
     PutLhsVar();
-       return 0;
-}
-
-int deserialize_double(void* _pvCtx, int* _piBuffer, int _iBufferSize)
-{
-    SciErr sciErr;
-    int iRows       = _piBuffer[1];
-    int iCols       = _piBuffer[2];
-    int iComplex    = _piBuffer[3];
-    double* pdblR   = NULL;
-    double* pdblI   = NULL;
-    int iSize       = 0;
-
-    //check size of input buffer
-    iSize = 4 + (iRows * iCols * (iComplex +1) * (sizeof(double) / sizeof(int)));
-    if(iSize != _iBufferSize)
-    {
-        printf("Bad buffer size : \n\treceived : %d\n\texpected : %d\n", _iBufferSize, iSize);
-        return 1;
-    }
-
-    pdblR = (double*)(_piBuffer + 4);
-    pdblI = pdblR + iRows * iCols;
-
-    if(iComplex)
-    {
-        sciErr = createComplexMatrixOfDouble(_pvCtx, 1, iRows, iCols, pdblR, pdblI);
-    }
-    else
-    {
-        sciErr = createMatrixOfDouble(_pvCtx, 1, iRows, iCols, pdblR);
-    } 
-   
-       if(sciErr.iErr)
-       {
-               printError(&sciErr, 0);
-               return 1;
-       }
-       
-       return 0;
-}
-
-int deserialize_string(void* _pvCtx, int* _piBuffer, int _iBufferSize)
-{
-    SciErr sciErr;
-    int i           = 0;
-    int iRows       = _piBuffer[1];
-    int iCols       = _piBuffer[2];
-    int iSize       = 0;
-    int* piInLen    = _piBuffer + 4;
-    char** pstData  = NULL;
-    char* pstInData = (char*)(_piBuffer + 4 + iRows * iCols);
-
-    //check size of input buffer
-    for(i = 0 ; i < iRows * iCols ; i++)
-    {
-        iSize += piInLen[i];
-    }
-    
-    if(iSize % 4)
-    {
-        iSize = iSize * sizeof(char) / sizeof(int) + 1;
-    }
-    else
-    {
-        iSize = iSize * sizeof(char) / sizeof(int);
-    }
-
-    iSize += (4 + iRows * iCols);
-
-    if(iSize != _iBufferSize)
-    {
-        printf("Bad buffer size : \n\treceived : %d\n\texpected : %d\n", _iBufferSize, iSize);
-        return 1;
-    }
-    pstData = (char**)malloc(iRows * iCols * sizeof(char*));
-        
-    for(i = 0 ; i < iRows * iCols ; i++)
-    {
-        pstData[i] = (char*)malloc((piInLen[i] + 1) * sizeof(char));
-        memcpy(pstData[i], pstInData, piInLen[i]);
-        pstData[i][piInLen[i]] = 0;
-        pstInData += piInLen[i];
-    }
-    
-    sciErr = createMatrixOfString(_pvCtx, 1, iRows, iCols, (const char* const*)pstData);
-    for(i = 0 ; i < iRows * iCols ; i++)
-    {
-        free(pstData[i]);
-    }
-    free(pstData);
-
-       if(sciErr.iErr)
-       {
-               printError(&sciErr, 0);
-               return 1;
-       }
-
-    return 0;
-}
-
-int deserialize_boolean(void* _pvCtx, int* _piBuffer, int _iBufferSize)
-{
-    SciErr sciErr;
-    int iRows       = _piBuffer[1];
-    int iCols       = _piBuffer[2];
-    int iSize       = 0;
-    int* piBool     = NULL;
-
-    //check size of input buffer
-    iSize = 4 + (iRows * iCols);
-    if(iSize != _iBufferSize)
-    {
-        printf("Bad buffer size : \n\treceived : %d\n\texpected : %d\n", _iBufferSize, iSize);
-        return 1;
-    }
-    
-    piBool = _piBuffer + 4;
-    sciErr = createMatrixOfBoolean(_pvCtx, 1, iRows, iCols, piBool);
-       if(sciErr.iErr)
-       {
-               printError(&sciErr, 0);
-               return 1;
-       }
-    
-    return 0;
-}
-
-int deserialize_int(void* _pvCtx, int* _piBuffer, int _iBufferSize)
-{
-    SciErr sciErr;
-    int iRows       = _piBuffer[1];
-    int iCols       = _piBuffer[2];
-    int iPrecision  = _piBuffer[3];
-    int iItemSize   = 0;
-    int iSize       = 0;
-    void* pvData    = NULL;
-
-    //check size of input buffer
-    if(iPrecision == SCI_INT8 || iPrecision == SCI_UINT8)
-    {
-        iItemSize = sizeof(char);
-    }
-    else if(iPrecision == SCI_INT16 || iPrecision == SCI_UINT16)
-    {
-        iItemSize = sizeof(short);
-    }
-    else if(iPrecision == SCI_INT32 || iPrecision == SCI_UINT32)
-    {
-        iItemSize = sizeof(int);
-    }
-/*
-    else if(iPrecision == SCI_INT64 || iPrecision == SCI_UINT64)
-    {
-        iItemSize = sizeof(long long);
-    }
-*/
-    iSize = iRows * iCols;
-    if((iSize * iItemSize) % sizeof(int))
-    {
-        iSize = (iSize * iItemSize) / sizeof(int) + 1;
-    }
-    else
-    {
-        iSize = (iSize * iItemSize) / (sizeof(int));
-    }
-
-    iSize += 4;
-    if(iSize != _iBufferSize)
-    {
-        printf("Bad buffer size : \n\treceived : %d\n\texpected : %d\n", _iBufferSize, iSize);
-        return 1;
-    }
-    
-    pvData = _piBuffer + 4;
-
-    switch(iPrecision)
-    {
-    case SCI_INT8 : 
-        sciErr = createMatrixOfInteger8(_pvCtx, 1, iRows, iCols, (char*)pvData);
-        break;
-    case SCI_UINT8 : 
-        sciErr = createMatrixOfUnsignedInteger8(_pvCtx, 1, iRows, iCols, (unsigned char*)pvData);
-        break;
-    case SCI_INT16 : 
-        sciErr = createMatrixOfInteger16(_pvCtx, 1, iRows, iCols, (short*)pvData);
-        break;
-    case SCI_UINT16 : 
-        sciErr = createMatrixOfUnsignedInteger16(_pvCtx, 1, iRows, iCols, (unsigned short*)pvData);
-        break;
-    case SCI_INT32 : 
-        sciErr = createMatrixOfInteger32(_pvCtx, 1, iRows, iCols, (int*)pvData);
-        break;
-    case SCI_UINT32 : 
-        sciErr = createMatrixOfUnsignedInteger32(_pvCtx, 1, iRows, iCols, (unsigned int*)pvData);
-        break;
-/*
-    case SCI_INT64 : 
-        sciErr = createMatrixOfInteger64(_pvCtx, 1, iRows, iCols, (long long*)pvData);
-        break;
-    case SCI_UINT64 : 
-        sciErr = createMatrixOfUnsignedInteger64(_pvCtx, 1, iRows, iCols, (unsigned long long*)pvData);
-        break;
-*/
-    default :
-        break;
-    }
-
-       if(sciErr.iErr)
-       {
-               printError(&sciErr, 0);
-               return 1;
-       }
-    return 0;
-}
-
-int deserialize_sparse(void* _pvCtx, int* _piBuffer, int _iBufferSize, BOOL _bData)
-{
-    SciErr sciErr;
-    int iRows       = _piBuffer[1];
-    int iCols       = _piBuffer[2];
-    int iComplex    = _piBuffer[3];
-    int iItemCount  = _piBuffer[4];
-    int* piRowCount = NULL;
-    int* piColPos   = NULL;
-    double* pdblR   = NULL;
-    double* pdblI   = NULL;
-    int iSize       = 0;
-    void* pvData    = NULL;
-
-    iSize = 5 + iRows + iItemCount;
-    if(_bData)
-    {
-        iSize += iItemCount * (iComplex+1) * sizeof(double) / sizeof(int);
-    }
-
-    if(iSize != _iBufferSize)
-    {
-        printf("Bad buffer size : \n\treceived : %d\n\texpected : %d\n", _iBufferSize, iSize);
-        return 1;
-    }
-    
-    piRowCount  = _piBuffer + 5;
-    piColPos    = _piBuffer + 5 + iRows;
-    
-    if(_bData)
-    {
-        pdblR = (double*)(_piBuffer + 5 + iRows + iItemCount);
-        if(iComplex)
-        {
-            pdblI = pdblR + iItemCount;
-            sciErr = createComplexSparseMatrix(_pvCtx, 1, iRows, iCols, iItemCount, piRowCount, piColPos, pdblR, pdblI);
-        }
-        else
-        {
-            sciErr = createSparseMatrix(_pvCtx, 1, iRows, iCols, iItemCount, piRowCount, piColPos, pdblR);
-        }
-    }
-    else
-    {
-        sciErr = createBooleanSparseMatrix(_pvCtx, 1, iRows, iCols, iItemCount, piRowCount, piColPos);
-    }
-    
-       if(sciErr.iErr)
-       {
-               printError(&sciErr, 0);
-               return 1;
-       }
     return 0;
 }
 
diff --git a/scilab/modules/mpi/sci_gateway/c/sci_mpi_recv.c.back b/scilab/modules/mpi/sci_gateway/c/sci_mpi_recv.c.back
deleted file mode 100644 (file)
index 570eaba..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * Function calling mpi_recv
- * @author Sylvestre LEDRU INRIA
- * @date 2007
- */
-#include "gw_mpi.h"
-#include "sci_mpi.h"
-#include "s_mpi_recv.h"
-#include "stackTypeVariable.h"
-
-/******************************************
- * SCILAB function : mpi_recv, fin = 2
- ******************************************/
-
-int C2F(sci_mpi_recv) _PARAMS((char *fname,unsigned long fname_len))
-{
-       int nopt,iopos,m1,n1,l1,m2,n2,l2,m3,n3,l3,ne4,me4,nn4,un=1,mn4,l4,l5,lrs,mn;
-       static rhs_opts opts[]={
-               {-1,"comm","i",0,0,0},
-               {-1,NULL,NULL,NULL,0,0}};
-       static int xdat0[]= {MPI_COMM_WORLD}, *dat0 = xdat0;
-       double *le4;
-       int rankSource;
-       int tag;
-       char stringToBeReceived[255];
-       CheckRhs(2,2);  
-       CheckLhs(1,1);
-
-       GetRhsVar(1, MATRIX_OF_DOUBLE_DATATYPE,&m1,&n1,&l1);
-       CheckScalar(1,m1,n1);
-       rankSource=(int) *stk(l1);
-
-       GetRhsVar(2, MATRIX_OF_DOUBLE_DATATYPE,&m2,&n2,&l2);
-       CheckScalar(2,m2,n2);
-       tag=(int) *stk(l2);
-
-       int msgsize;
-       MPI_Status status;
-       /* Freemat envoit d'abord le nombre de message puis le message ?! a voir si c'est obligatoire ou pas */
-       //      MPI_Recv(&msgsize,1,MPI_INT,rankSource,tag,MPI_COMM_WORLD,&status);
-       //      void *cp = malloc(msgsize);
-       MPI_Recv(stringToBeReceived,255,MPI_CHAR,rankSource,tag,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
-       //      MPI_Recv(buff, BUFSIZE, MPI_CHAR, 0, TAG, MPI_COMM_WORLD, &stat);
-       
-       m3=1;
-       n3=1;
-       CreateVarFromPtr( Rhs+1, "c",(m3=(int)strlen(stringToBeReceived), &m3),&n3,&stringToBeReceived);
-       CreateVar(Rhs+1, CHAR_DATATYPE,&m3,&n3,&l3);
-       *cstk(l3) = (char*);
-       
-       LhsVar(1) = Rhs+1;
-
-       C2F(putlhsvar)();       
-       return 0;
-}
index a6dbcb7..57b508a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2007-2009 - DIGITEO - Sylvestre LEDRU
+ * Copyright (C) 2011-2011 - DIGITEO - Sylvestre LEDRU
  *
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
 #include "Scierror.h"
 #include "localization.h"
 #include "MALLOC.h"
-
+#include "serialization.h"
 
 #define TAG 0
-int serialize_double(void* _pvCtx, int* _piAddr, int** _piBuffer, int* _piBufferSize);
-int serialize_string(void* _pvCtx, int* _piAddr, int** _piBuffer, int* _piBufferSize);
-int serialize_boolean(void* _pvCtx, int* _piAddr, int** _piBuffer, int* _piBufferSize);
-int serialize_int(void* _pvCtx, int* _piAddr, int** _piBuffer, int* _piBufferSize);
-int serialize_sparse(void* _pvCtx, int* _piAddr, int** _piBuffer, int* _piBufferSize, BOOL _bData);
-
-int sci_mpi_send(char *fname,unsigned long fname_len)
-{
-    SciErr sciErr;
-    int iRet        = 0;
-    int* piAddr     = NULL;
-    int* piAddr2    = NULL;
-    int iType       = 0;
-    
-    int* piBuffer   = NULL;
-    int iBufferSize = 0;
-    double NodeID   = 0;
-    
-    CheckRhs(2,2);
-    CheckLhs(1,1);
-
-       sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr2);
-       if(sciErr.iErr)
-       {
-               printError(&sciErr, 0);
-               return 0;
-       }
-    
-    
-    if(getScalarDouble(pvApiCtx, piAddr2, &NodeID))
-    {
-        return 1;
-    }
 
-    sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
-       if(sciErr.iErr)
-       {
-               printError(&sciErr, 0);
-               return 0;
-       }
-
-       sciErr = getVarType(pvApiCtx, piAddr, &iType);
-       if(sciErr.iErr)
-       {
-               printError(&sciErr, 0);
-               return 0;
-       }
-    
-    switch(iType)
-    {
-    case sci_matrix :
-        iRet = serialize_double(pvApiCtx, piAddr, &piBuffer, &iBufferSize);
-        break;
-    case sci_strings :
-        iRet = serialize_string(pvApiCtx, piAddr, &piBuffer, &iBufferSize);
-        break;
-    case sci_boolean :
-        iRet = serialize_boolean(pvApiCtx, piAddr, &piBuffer, &iBufferSize);
-        break;
-    case sci_sparse :
-        iRet = serialize_sparse(pvApiCtx, piAddr, &piBuffer, &iBufferSize, TRUE);
-        break;
-    case sci_boolean_sparse :
-        iRet = serialize_sparse(pvApiCtx, piAddr, &piBuffer, &iBufferSize, FALSE);
-        break;
-    case sci_ints :
-        iRet = serialize_int(pvApiCtx, piAddr, &piBuffer, &iBufferSize);
-        break;
-    default :
-        Scierror(999, _("%s: Wrong type for input arguments.\n"), fname);
-        break;
-    }
-    
-    if(iRet)
-    {
-    }
-    
 
-       iRet = MPI_Send(piBuffer, iBufferSize, MPI_INT, NodeID, TAG, MPI_COMM_WORLD);
-    if(iRet != MPI_SUCCESS)
-    {
-        printf("Failed : after MPI_Send. Error code: %d\n", iRet);
-        fflush(NULL);
-        return 1;
-    }    
-    
-    free(piBuffer);
-    if(createScalarBoolean(pvApiCtx, 1, !iRet))
-    {
-        return 1;
-    }
-    
-    LhsVar(1) = 1;
-    PutLhsVar();
-       return 0;
-}
-
-int serialize_double(void* _pvCtx, int* _piAddr, int** _piBuffer, int* _piBufferSize)
+int sci_mpi_send(char *fname, unsigned long fname_len)
 {
     SciErr sciErr;
-    int iRows       = 0;
-    int iCols       = 0;
-    int iOne        = 1;
-    int iSize       = 0;
-    double* pdblR   = NULL;
-    double* pdblI   = NULL;
-    
-    int* piOut      = NULL;
-    int iOutLen     = 0;
-    
-    
-    if(isVarComplex(_pvCtx, _piAddr))
-    {
-        double* p = NULL;
-        sciErr = getComplexMatrixOfDouble(_pvCtx, _piAddr, &iRows, &iCols, &pdblR, &pdblI);
-        if(sciErr.iErr)
-        {
-                   printError(&sciErr, 0);
-                   return 1;
-        }
-
-        iOutLen = 4 + (2 * iRows * iCols * sizeof(double)/sizeof(int));
-        piOut = (int*)MALLOC(iOutLen * sizeof(int));
-        if(piOut == NULL)
-        {
-            return 1;
-        }
-        
-        piOut[0] = sci_matrix;
-        piOut[1] = iRows;
-        piOut[2] = iCols;
-        piOut[3] = 1; //complex
-        
-        //move 'p' to first real value
-        p = (double*)(piOut + 4);
-        iSize = iRows * iCols;
-        C2F(dcopy)(&iSize, pdblR, &iOne, p, &iOne);
-        //move 'p' to first complex value
-        p = p + iRows * iCols;
-        C2F(dcopy)(&iSize, pdblI, &iOne, p, &iOne);
-    }
-    else
-    {
-        double* p = NULL;
-        sciErr = getMatrixOfDouble(_pvCtx, _piAddr, &iRows, &iCols, &pdblR);
-        if(sciErr.iErr)
-        {
-                   printError(&sciErr, 0);
-                   return 1;
-        }
-
-        iOutLen = 4 + (iRows * iCols * sizeof(double)/sizeof(int));
-        piOut = (int*)MALLOC(iOutLen * sizeof(int));
-        if(piOut == NULL)
-        {
-            return 1;
-        }
-        
-        piOut[0] = sci_matrix;
-        piOut[1] = iRows;
-        piOut[2] = iCols;
-        piOut[3] = 0; //not complex
-        
-        //move 'p' to first complex value
-        p = (double*)(piOut + 4);
-        iSize = iRows * iCols;
-        C2F(dcopy)(&iSize, pdblR, &iOne, p, &iOne);
-    }
-    
-    *_piBuffer = piOut;
-    *_piBufferSize = iOutLen;
-    return 0;
-}
+    int iRet = 0;
+    int *piAddr = NULL;
+    int *piAddr2 = NULL;
+    int iType = 0;
 
-int serialize_string(void* _pvCtx, int* _piAddr, int** _piBuffer, int* _piBufferSize)
-{
-    int iErr        = 0;
-    int i           = 0;
-    int iRows       = 0;
-    int iCols       = 0;
-    char** pstData  = NULL;
-    char* p         = NULL;
-    
-    int* piOut      = NULL;
-    int* piOutLen   = NULL;
-    int iOutLen     = 0;
-
-    iErr = getAllocatedMatrixOfString(_pvCtx, _piAddr, &iRows, &iCols, &pstData);
-    if(iErr)
-    {
-           return 1;
-    }
-    
-    for(i = 0 ; i < iRows * iCols ; i++)
-    {
-        iOutLen += strlen(pstData[i]);
-    }
-    
-    if(iOutLen % 4)
-    {
-        iOutLen = iOutLen / (sizeof(int) / sizeof(char)) + 1;
-    }
-    else
-    {
-        iOutLen = iOutLen / (sizeof(int) / sizeof(char));
-    }
-    
-    //4 for header and size of each string
-    iOutLen += 4 + iRows * iCols;
-    
-    piOut = (int*)MALLOC(iOutLen * sizeof(int));
-    if(piOut == NULL)
-    {
-        return 1;
-    }
-    
-    piOut[0] = sci_strings;
-    piOut[1] = iRows;
-    piOut[2] = iCols;
-    piOut[3] = 0; //not complex
-    
-    piOutLen = piOut + 4;
-    
-    for(i = 0 ; i < iRows * iCols ; i++)
-    {
-        piOutLen[i] = strlen(pstData[i]);
-    }
-    
-    p = (char*)(piOut + 4 + iRows * iCols);
-    for(i = 0 ; i < iRows * iCols ; i++)
-    {
-        memcpy(p, pstData[i], piOutLen[i]);
-        p += piOutLen[i];
-    }
-
-    *_piBuffer = piOut;
-    *_piBufferSize = iOutLen;
-    return 0;
-}
+    int *piBuffer = NULL;
+    int iBufferSize = 0;
+    double NodeID = 0;
 
-int serialize_boolean(void* _pvCtx, int* _piAddr, int** _piBuffer, int* _piBufferSize)
-{
-    SciErr sciErr;
-    int iRows       = 0;
-    int iCols       = 0;
-    int* piBool     = NULL;
-    int* p          = NULL;
-    
-    
-    int* piOut      = NULL;
-    int iOutLen     = 0;
+    CheckRhs(2, 2);
+    CheckLhs(1, 1);
 
-    sciErr = getMatrixOfBoolean(_pvCtx, _piAddr, &iRows, &iCols, &piBool);
-    if(sciErr.iErr)
+    sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr2);
+    if (sciErr.iErr)
     {
-           printError(&sciErr, 0);
-           return 1;
+        printError(&sciErr, 0);
+        return 0;
     }
 
-    //4 for header and 1 for each boolean
-    iOutLen = 4 + iRows * iCols;
-    
-    piOut = (int*)MALLOC(iOutLen * sizeof(int*));
-    if(piOut == NULL)
+    if (getScalarDouble(pvApiCtx, piAddr2, &NodeID))
     {
         return 1;
     }
 
-    piOut[0] = sci_boolean;
-    piOut[1] = iRows;
-    piOut[2] = iCols;
-    piOut[3] = 0; //not complex
-    
-    p = (int*)(piOut + 4);
-    memcpy(p, piBool, iRows * iCols * sizeof(int));
-    
-    *_piBuffer = piOut;
-    *_piBufferSize = iOutLen;
-    return 0;
-}
-
-int serialize_int(void* _pvCtx, int* _piAddr, int** _piBuffer, int* _piBufferSize)
-{
-    SciErr sciErr;
-    int iPrecision  = 0;
-    int iRows       = 0;
-    int iCols       = 0;
-    int iItemSize   = 0;
-    void* p         = NULL;
-    void* pvData    = NULL;
-    
-    
-    int* piOut      = NULL;
-    int iOutLen     = 0;
-
-    sciErr = getVarDimension(_pvCtx, _piAddr, &iRows, &iCols);
-    if(sciErr.iErr)
-    {
-           printError(&sciErr, 0);
-           return 1;
-    }
-
-    sciErr = getMatrixOfIntegerPrecision(_pvCtx, _piAddr, &iPrecision);
-    if(sciErr.iErr)
-    {
-           printError(&sciErr, 0);
-           return 1;
-    }
-
-    if(iPrecision == SCI_INT8 || iPrecision == SCI_UINT8)
-    {
-        iItemSize = sizeof(char);
-    }
-    else if(iPrecision == SCI_INT16 || iPrecision == SCI_UINT16)
-    {
-        iItemSize = sizeof(short);
-    }
-    else if(iPrecision == SCI_INT32 || iPrecision == SCI_UINT32)
-    {
-        iItemSize = sizeof(int);
-    }
-/*
-    else if(iPrecision == SCI_INT64 || iPrecision == SCI_UINT64)
-    {
-        iItemSize = sizeof(long long);
-    }
-*/
-    //check and adjust alignement on integer
-    iOutLen = iRows * iCols;
-    if((iOutLen * iItemSize) % sizeof(int))
-    {
-        iOutLen = (iOutLen * iItemSize) / sizeof(int) + 1;
-    }
-    else
+    sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
+    if (sciErr.iErr)
     {
-        iOutLen = (iOutLen * iItemSize) / (sizeof(int));
+        printError(&sciErr, 0);
+        return 0;
     }
 
-    iOutLen += 4;
-    piOut = (int*)MALLOC(iOutLen * sizeof(int*));
-    if(piOut == NULL)
+    sciErr = getVarType(pvApiCtx, piAddr, &iType);
+    if (sciErr.iErr)
     {
-        return 1;
+        printError(&sciErr, 0);
+        return 0;
     }
 
-    piOut[0] = sci_ints;
-    piOut[1] = iRows;
-    piOut[2] = iCols;
-    piOut[3] = iPrecision; //precision
-    
-    switch(iPrecision)
+    switch (iType)
     {
-    case SCI_INT8 :
-    { 
-        sciErr = getMatrixOfInteger8(_pvCtx, _piAddr, &iRows, &iCols, (char**)&pvData);
-        break;
-    }
-    case SCI_UINT8 :
-    { 
-        sciErr = getMatrixOfUnsignedInteger8(_pvCtx, _piAddr, &iRows, &iCols, (unsigned char**)&pvData);
+    case sci_matrix:
+        iRet = serialize_double(pvApiCtx, piAddr, &piBuffer, &iBufferSize);
         break;
-    }
-    case SCI_INT16 :
-    { 
-        sciErr = getMatrixOfInteger16(_pvCtx, _piAddr, &iRows, &iCols, (short**)&pvData);
+    case sci_strings:
+        iRet = serialize_string(pvApiCtx, piAddr, &piBuffer, &iBufferSize);
         break;
-    }
-    case SCI_UINT16 :
-    { 
-        sciErr = getMatrixOfUnsignedInteger16(_pvCtx, _piAddr, &iRows, &iCols, (unsigned short**)&pvData);
+    case sci_boolean:
+        iRet = serialize_boolean(pvApiCtx, piAddr, &piBuffer, &iBufferSize);
         break;
-    }
-    case SCI_INT32 :
-    { 
-        sciErr = getMatrixOfInteger32(_pvCtx, _piAddr, &iRows, &iCols, (int**)&pvData);
+    case sci_sparse:
+        iRet = serialize_sparse(pvApiCtx, piAddr, &piBuffer, &iBufferSize, TRUE);
         break;
-    }
-    case SCI_UINT32 :
-    { 
-        sciErr = getMatrixOfUnsignedInteger32(_pvCtx, _piAddr, &iRows, &iCols, (unsigned int**)&pvData);
+    case sci_boolean_sparse:
+        iRet = serialize_sparse(pvApiCtx, piAddr, &piBuffer, &iBufferSize, FALSE);
         break;
-    }
-/*
-    case SCI_INT64 :
-    { 
-        sciErr = getMatrixOfInteger64(_pvCtx, _piAddr, &iRows, &iCols, (long long**)&pvData);
+    case sci_ints:
+        iRet = serialize_int(pvApiCtx, piAddr, &piBuffer, &iBufferSize);
         break;
-    }
-    case SCI_UINT64 :
-    { 
-        sciErr = getMatrixOfUnsignedInteger64(_pvCtx, _piAddr, &iRows, &iCols, (unsigned long long**)&pvData);
+    default:
+        Scierror(999, _("%s: Wrong values for input argument #%d: Unsupported '%s' type.\n"), fname, iType);
         break;
     }
-*/    default : 
-        return 1;
-    }
 
-    if(sciErr.iErr)
+    if (iRet)
     {
-        printError(&sciErr, 0);
-        return 1;
     }
 
-    p = piOut + 4;
-    memcpy(p, pvData, iRows * iCols * iItemSize);
-    *_piBuffer = piOut;
-    *_piBufferSize = iOutLen;
-    return 0;
-}
-
-int serialize_sparse(void* _pvCtx, int* _piAddr, int** _piBuffer, int* _piBufferSize, BOOL _bData)
-{
-    int iRet        = 0;
-    int iRows       = 0;
-    int iCols       = 0;
-    int iItemCount  = 0;
-    int* piRowCount = 0;
-    int* piColPos   = 0;
-    int iComplex    = 0;
-
-    double* pdblR   = NULL;
-    double* pdblI   = NULL;
-    
-    int* piOut      = NULL;
-    int iOutLen     = 0;
-
-    if(_bData)
-    {//sparse
-        
-        iComplex = isVarComplex(_pvCtx, _piAddr);
-        if(iComplex)
-        {
-            iRet = getAllocatedComplexSparseMatrix(_pvCtx, _piAddr, &iRows, &iCols, &iItemCount, &piRowCount, &piColPos, &pdblR, &pdblI);
-        }
-        else
-        {
-            iRet = getAllocatedSparseMatrix(_pvCtx, _piAddr, &iRows, &iCols, &iItemCount, &piRowCount, &piColPos, &pdblR);
-        }
-    }
-    else
-    {//boolean sparse
-        iRet = getAllocatedBooleanSparseMatrix(_pvCtx, _piAddr, &iRows, &iCols, &iItemCount, &piRowCount, &piColPos);
-    }
-
-    if(iRet)
+    iRet = MPI_Send(piBuffer, iBufferSize, MPI_INT, NodeID, TAG, MPI_COMM_WORLD);
+    if (iRet != MPI_SUCCESS)
     {
+        char error_string[MPI_MAX_ERROR_STRING];
+        int length_of_error_string;
+        
+        MPI_Error_string(iRet, error_string, &length_of_error_string);
+        Scierror("%s: Could not send the variable to the node %d: %s\n", fname, NodeID, error_string);
         return 1;
     }
 
-    //5 -> 4 for header + 1 for item count
-    iOutLen = 5 + iRows + iItemCount;
-    
-    if(_bData)
-    {
-        iOutLen += iItemCount * (iComplex+1) * sizeof(double) / sizeof(int);
-    }
-
-    piOut = (int*)MALLOC(iOutLen * sizeof(int));
-
-    piOut[0] = _bData ? sci_sparse : sci_boolean_sparse;
-    piOut[1] = iRows;
-    piOut[2] = iCols;
-    piOut[3] = iComplex;
-    piOut[4] = iItemCount;
-
-    memcpy(piOut + 5, piRowCount, iRows * sizeof(int));
-    memcpy(piOut + 5 + iRows, piColPos, iItemCount * sizeof(int));
-
-    if(_bData)
+    free(piBuffer);
+    if (createScalarBoolean(pvApiCtx, 1, !iRet))
     {
-        int iOne = 1;
-        double* pRealData = (double*)(piOut + 5 + iRows + iItemCount);
-        C2F(dcopy)(&iItemCount, pdblR, &iOne, pRealData, &iOne);
-        if(iComplex)
-        {
-            double* pImgData = pRealData + iItemCount;
-            C2F(dcopy)(&iItemCount, pdblI, &iOne, pImgData, &iOne);
-        }
+        return 1;
     }
 
-    *_piBuffer = piOut;
-    *_piBufferSize = iOutLen;
+    LhsVar(1) = 1;
+    PutLhsVar();
     return 0;
 }
-
diff --git a/scilab/modules/mpi/sci_gateway/c/sci_mpi_send.c.back b/scilab/modules/mpi/sci_gateway/c/sci_mpi_send.c.back
deleted file mode 100644 (file)
index ace32ec..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * Function calling mpi_send
- * @author Sylvestre LEDRU INRIA
- * @date 2007
- */
-#include "gw_mpi.h"
-#include "sci_mpi.h"
-#include "s_mpi_send.h"
-#include "stackTypeVariable.h"
-
-/******************************************
- * SCILAB function : mpi_send, fin = 1
- ******************************************/
-
-int C2F(sci_mpi_send) _PARAMS((char *fname,unsigned long fname_len))
-{
-       int nopt,iopos,m1,n1,l1,m2,n2,l2,m3,n3,l3,m4,n4,l4,un=1,l5;
-       static rhs_opts opts[]={
-               {-1,"comm","i",0,0,0},
-               {-1,NULL,NULL,NULL,0,0}};
-       static int xcomm_world[]= {MPI_COMM_WORLD}, *comm_world = xcomm_world;
-       nopt=NumOpt();
-       CheckRhs(1,1);  
-       CheckLhs(1,1);
-
-       /*
-       CheckRhs(3,3+nopt);
-       CheckLhs(1,1);
-       /*  checking variable buff */
-       GetRhsVar(1,MATRIX_OF_DOUBLE_DATATYPE,&m1,&n1,&l1);
-       /*  checking variable dest */
-       GetRhsVar(2,MATRIX_OF_INTEGER_DATATYPE,&m2,&n2,&l2);
-       CheckScalar(2,m2,n2);
-       /*  checking variable tag */
-       GetRhsVar(3,MATRIX_OF_INTEGER_DATATYPE,&m3,&n3,&l3);
-       CheckScalar(3,m3,n3);
-       iopos=Rhs;
-       if ( get_optionals(fname,opts) == 0) return 0;
-       /* default value to optional argument comm */
-       if ( opts[0].position == -1 ){
-               iopos++ ; 
-               opts[0].position = iopos;
-               opts[0].m = 1;
-               opts[0].n = 1;
-               CreateVarFromPtr(opts[0].position,opts[0].type,&opts[0].m,&opts[0].n,&xcomm_world);
-               opts[0].l = VarPtr(opts[0].position);
-       }
-       else { 
-               GetRhsVar(4,MATRIX_OF_INTEGER_DATATYPE,&m4,&n4,&l4);
-               CheckScalar(4,m4,n4);
-       } 
-       /* cross variable size checking */
-       CreateVar(5,MATRIX_OF_INTEGER_DATATYPE,&un,&un,&l5);/* named: res */
-       C2F(s_mpi_send)(stk(l1),&m1,&n1,istk(l2),istk(l3),istk(opts[0].l),istk(l5));
-       LhsVar(1)= 5;
-       */
-       return 0;
-}
diff --git a/scilab/modules/mpi/sci_gateway/c/sci_mpi_serialize.c b/scilab/modules/mpi/sci_gateway/c/sci_mpi_serialize.c
deleted file mode 100644 (file)
index 0ce72ab..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2007-2011 - DIGITEO - Sylvestre LEDRU
- *
- * This file must be used under the terms of the CeCILL.
- * This source file is licensed as described in the file COPYING, which
- * you should have received as part of this distribution.  The terms
- * are also available at
- * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
- *
- */
-#include <stdio.h>
-#include "gw_mpi.h"
-#include "sci_mpi.h"
-#include "mappingScilabMPI.h"
-
-int sci_mpi_serialize (char *fname, unsigned long fname_len)
-{
-       int err;
-       CheckRhs(2,2);
-       CheckLhs(0,1);
-       mappinpScilabMPI sciData = getMPIDataStructure(2);
-    FILE *pFile = fopen( "/tmp/serialisation.mpi", "wb" );
-    err=fwrite (&sciData.rows , 1 , sizeof(int),  pFile );
-    err=fwrite (&sciData.cols , 1 , sizeof(int),  pFile );
-    err=fwrite (&sciData.Scilab , 1 , sizeof(sci_types), pFile );
-       printf("nb element: %d\n",sciData.rows*sciData.cols);
-    err=fwrite (&sciData.data , sizeof(double), sciData.rows*sciData.cols, pFile );
-       printf("err %d\n",err);
-    fclose(pFile);
-
-       LhsVar(1)= 0;
-       C2F(putlhsvar)();
-       return 0;
-}
diff --git a/scilab/modules/mpi/sci_gateway/c/sci_mpi_unserialize.c b/scilab/modules/mpi/sci_gateway/c/sci_mpi_unserialize.c
deleted file mode 100644 (file)
index 899605a..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2007-2009 - DIGITEO - Sylvestre LEDRU
- *
- * This file must be used under the terms of the CeCILL.
- * This source file is licensed as described in the file COPYING, which
- * you should have received as part of this distribution.  The terms
- * are also available at
- * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
- *
- */
-#include <stdio.h>
-#include "api_scilab.h"
-#include "gw_mpi.h"
-#include "sci_mpi.h"
-
-int sci_mpi_unserialize (char *fname, unsigned long fname_len)
-{
-       int err;
-       CheckRhs(1,1);
-       CheckLhs(0,1);
-
-    FILE *pFile = fopen ( "/tmp/serialisation.mpi" , "rb" );
-    if (pFile==NULL) {sprintf(stderr,"error while reading"); exit (1);}
-    int rows, cols;
-//    sci_types Scilab;
-    char Scilab;
-    double *data;
-
-    err=fread(&rows, sizeof(int), 1, pFile);
-    printf("rows: %d\n",rows);
-
-    err=fread(&cols, sizeof(int), 1, pFile);
-    printf("cols: %d\n",cols);
-
-    err=fread(&Scilab, sizeof(sci_types), 1, pFile);
-    
-    printf("type: %d\n",Scilab);
-    data = (double*)malloc(rows*cols*sizeof(double));
-    err=fread(&data, sizeof(double), rows*cols, pFile);
-    printf("data: %5.2f\n",data[0]);
-       printf("err %d\n",err);
-       createMatrixOfDouble(pvApiCtx, Rhs + 1, rows, cols, data);      
-       LhsVar(1) = Rhs+1;
-       C2F(putlhsvar)();
-       /*      
-    for (i=0; i<rows*cols; i++) {
-        printf("data[%d]: %f\n",i, data[i]);
-               }*/
-    fclose(pFile);
-
-
-       return 0;
-}
index 4e57a21..1cac4b3 100644 (file)
@@ -31,6 +31,4 @@
 
 <PRIMITIVE gatewayId="69" primitiveId="5" primitiveName="MPI_Recv" />
 <PRIMITIVE gatewayId="69" primitiveId="6" primitiveName="MPI_Send" />
-<PRIMITIVE gatewayId="69" primitiveId="7" primitiveName="MPI_serialize" />
-<PRIMITIVE gatewayId="69" primitiveId="8" primitiveName="MPI_unserialize" />
 </GATEWAY>
diff --git a/scilab/modules/mpi/src/c/deserialization.c b/scilab/modules/mpi/src/c/deserialization.c
new file mode 100644 (file)
index 0000000..598da6f
--- /dev/null
@@ -0,0 +1,287 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011-2011 - DIGITEO - Antoine ELIAS
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "sci_types.h"
+#include "BOOL.h"
+#include "api_scilab.h"
+#include "stack1.h"
+#include "MALLOC.h"
+
+int deserialize_double(void *_pvCtx, int *_piBuffer, int _iBufferSize)
+{
+    SciErr sciErr;
+    int iRows = _piBuffer[1];
+    int iCols = _piBuffer[2];
+    int iComplex = _piBuffer[3];
+    double *pdblR = NULL;
+    double *pdblI = NULL;
+    int iSize = 0;
+
+    //check size of input buffer
+    iSize = 4 + (iRows * iCols * (iComplex + 1) * (sizeof(double) / sizeof(int)));
+    if (iSize != _iBufferSize)
+    {
+        printf("Bad buffer size : \n\treceived : %d\n\texpected : %d\n", _iBufferSize, iSize);
+        return 1;
+    }
+
+    pdblR = (double *)(_piBuffer + 4);
+    pdblI = pdblR + iRows * iCols;
+
+    if (iComplex)
+    {
+        sciErr = createComplexMatrixOfDouble(_pvCtx, 1, iRows, iCols, pdblR, pdblI);
+    }
+    else
+    {
+        sciErr = createMatrixOfDouble(_pvCtx, 1, iRows, iCols, pdblR);
+    }
+
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 1;
+    }
+
+    return 0;
+}
+
+int deserialize_string(void *_pvCtx, int *_piBuffer, int _iBufferSize)
+{
+    SciErr sciErr;
+    int i = 0;
+    int iRows = _piBuffer[1];
+    int iCols = _piBuffer[2];
+    int iSize = 0;
+    int *piInLen = _piBuffer + 4;
+    char **pstData = NULL;
+    char *pstInData = (char *)(_piBuffer + 4 + iRows * iCols);
+
+    //check size of input buffer
+    for (i = 0; i < iRows * iCols; i++)
+    {
+        iSize += piInLen[i];
+    }
+
+    if (iSize % 4)
+    {
+        iSize = iSize * sizeof(char) / sizeof(int) + 1;
+    }
+    else
+    {
+        iSize = iSize * sizeof(char) / sizeof(int);
+    }
+
+    iSize += (4 + iRows * iCols);
+
+    if (iSize != _iBufferSize)
+    {
+        printf("Bad buffer size : \n\treceived : %d\n\texpected : %d\n", _iBufferSize, iSize);
+        return 1;
+    }
+    pstData = (char **)malloc(iRows * iCols * sizeof(char *));
+
+    for (i = 0; i < iRows * iCols; i++)
+    {
+        pstData[i] = (char *)malloc((piInLen[i] + 1) * sizeof(char));
+        memcpy(pstData[i], pstInData, piInLen[i]);
+        pstData[i][piInLen[i]] = 0;
+        pstInData += piInLen[i];
+    }
+
+    sciErr = createMatrixOfString(_pvCtx, 1, iRows, iCols, (const char *const *)pstData);
+    for (i = 0; i < iRows * iCols; i++)
+    {
+        free(pstData[i]);
+    }
+    free(pstData);
+
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 1;
+    }
+
+    return 0;
+}
+
+int deserialize_boolean(void *_pvCtx, int *_piBuffer, int _iBufferSize)
+{
+    SciErr sciErr;
+    int iRows = _piBuffer[1];
+    int iCols = _piBuffer[2];
+    int iSize = 0;
+    int *piBool = NULL;
+
+    //check size of input buffer
+    iSize = 4 + (iRows * iCols);
+    if (iSize != _iBufferSize)
+    {
+        printf("Bad buffer size : \n\treceived : %d\n\texpected : %d\n", _iBufferSize, iSize);
+        return 1;
+    }
+
+    piBool = _piBuffer + 4;
+    sciErr = createMatrixOfBoolean(_pvCtx, 1, iRows, iCols, piBool);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 1;
+    }
+
+    return 0;
+}
+
+int deserialize_int(void *_pvCtx, int *_piBuffer, int _iBufferSize)
+{
+    SciErr sciErr;
+    int iRows = _piBuffer[1];
+    int iCols = _piBuffer[2];
+    int iPrecision = _piBuffer[3];
+    int iItemSize = 0;
+    int iSize = 0;
+    void *pvData = NULL;
+
+    //check size of input buffer
+    if (iPrecision == SCI_INT8 || iPrecision == SCI_UINT8)
+    {
+        iItemSize = sizeof(char);
+    }
+    else if (iPrecision == SCI_INT16 || iPrecision == SCI_UINT16)
+    {
+        iItemSize = sizeof(short);
+    }
+    else if (iPrecision == SCI_INT32 || iPrecision == SCI_UINT32)
+    {
+        iItemSize = sizeof(int);
+    }
+/*
+    else if(iPrecision == SCI_INT64 || iPrecision == SCI_UINT64)
+    {
+        iItemSize = sizeof(long long);
+    }
+*/
+    iSize = iRows * iCols;
+    if ((iSize * iItemSize) % sizeof(int))
+    {
+        iSize = (iSize * iItemSize) / sizeof(int) + 1;
+    }
+    else
+    {
+        iSize = (iSize * iItemSize) / (sizeof(int));
+    }
+
+    iSize += 4;
+    if (iSize != _iBufferSize)
+    {
+        printf("Bad buffer size : \n\treceived : %d\n\texpected : %d\n", _iBufferSize, iSize);
+        return 1;
+    }
+
+    pvData = _piBuffer + 4;
+
+    switch (iPrecision)
+    {
+    case SCI_INT8:
+        sciErr = createMatrixOfInteger8(_pvCtx, 1, iRows, iCols, (char *)pvData);
+        break;
+    case SCI_UINT8:
+        sciErr = createMatrixOfUnsignedInteger8(_pvCtx, 1, iRows, iCols, (unsigned char *)pvData);
+        break;
+    case SCI_INT16:
+        sciErr = createMatrixOfInteger16(_pvCtx, 1, iRows, iCols, (short *)pvData);
+        break;
+    case SCI_UINT16:
+        sciErr = createMatrixOfUnsignedInteger16(_pvCtx, 1, iRows, iCols, (unsigned short *)pvData);
+        break;
+    case SCI_INT32:
+        sciErr = createMatrixOfInteger32(_pvCtx, 1, iRows, iCols, (int *)pvData);
+        break;
+    case SCI_UINT32:
+        sciErr = createMatrixOfUnsignedInteger32(_pvCtx, 1, iRows, iCols, (unsigned int *)pvData);
+        break;
+/*
+    case SCI_INT64 : 
+        sciErr = createMatrixOfInteger64(_pvCtx, 1, iRows, iCols, (long long*)pvData);
+        break;
+    case SCI_UINT64 : 
+        sciErr = createMatrixOfUnsignedInteger64(_pvCtx, 1, iRows, iCols, (unsigned long long*)pvData);
+        break;
+*/
+    default:
+        break;
+    }
+
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 1;
+    }
+    return 0;
+}
+
+int deserialize_sparse(void *_pvCtx, int *_piBuffer, int _iBufferSize, BOOL _bData)
+{
+    SciErr sciErr;
+    int iRows = _piBuffer[1];
+    int iCols = _piBuffer[2];
+    int iComplex = _piBuffer[3];
+    int iItemCount = _piBuffer[4];
+    int *piRowCount = NULL;
+    int *piColPos = NULL;
+    double *pdblR = NULL;
+    double *pdblI = NULL;
+    int iSize = 0;
+    void *pvData = NULL;
+
+    iSize = 5 + iRows + iItemCount;
+    if (_bData)
+    {
+        iSize += iItemCount * (iComplex + 1) * sizeof(double) / sizeof(int);
+    }
+
+    if (iSize != _iBufferSize)
+    {
+        printf("Bad buffer size : \n\treceived : %d\n\texpected : %d\n", _iBufferSize, iSize);
+        return 1;
+    }
+
+    piRowCount = _piBuffer + 5;
+    piColPos = _piBuffer + 5 + iRows;
+
+    if (_bData)
+    {
+        pdblR = (double *)(_piBuffer + 5 + iRows + iItemCount);
+        if (iComplex)
+        {
+            pdblI = pdblR + iItemCount;
+            sciErr = createComplexSparseMatrix(_pvCtx, 1, iRows, iCols, iItemCount, piRowCount, piColPos, pdblR, pdblI);
+        }
+        else
+        {
+            sciErr = createSparseMatrix(_pvCtx, 1, iRows, iCols, iItemCount, piRowCount, piColPos, pdblR);
+        }
+    }
+    else
+    {
+        sciErr = createBooleanSparseMatrix(_pvCtx, 1, iRows, iCols, iItemCount, piRowCount, piColPos);
+    }
+
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 1;
+    }
+    return 0;
+}
diff --git a/scilab/modules/mpi/src/c/deserialization.h b/scilab/modules/mpi/src/c/deserialization.h
new file mode 100644 (file)
index 0000000..805cc11
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011-2011 - DIGITEO - Antoine ELIAS
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+int deserialize_double(void *_pvCtx, int *_piBuffer, int _iBufferSize);
+int deserialize_string(void *_pvCtx, int *_piBuffer, int _iBufferSize);
+int deserialize_boolean(void *_pvCtx, int *_piBuffer, int _iBufferSize);
+int deserialize_int(void *_pvCtx, int *_piBuffer, int _iBufferSize);
+int deserialize_sparse(void *_pvCtx, int *_piBuffer, int _iBufferSize, BOOL _bData);
diff --git a/scilab/modules/mpi/src/c/mappingScilabMPI.c b/scilab/modules/mpi/src/c/mappingScilabMPI.c
deleted file mode 100644 (file)
index af32301..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2007-2011 - DIGITEO - Sylvestre LEDRU
- *
- * This file must be used under the terms of the CeCILL.
- * This source file is licensed as described in the file COPYING, which
- * you should have received as part of this distribution.  The terms
- * are also available at
- * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
- *
- */
-#include <stdio.h>
-#include <mpi.h>
-#include "api_scilab.h"
-#include "mappingScilabMPI.h"
-#include "Scierror.h"
-
-static mappinpScilabMPI getMPIMapping(sci_types scilabType);
-static MPI_Datatype setHomogenousScilabType(int size, MPI_Datatype dataType);
-mappinpScilabMPI getMPIDataStructure(int position){
-       int typevar;
-    SciErr sciErr;
-       mappinpScilabMPI mapping;
-       int iRows, iCols;
-       int *piAddr                     = NULL;
-
-       sciErr = getVarAddressFromPosition(pvApiCtx, position, &piAddr);
-       if(sciErr.iErr)
-        {
-                       printError(&sciErr, 0);
-        }
-       sciErr = getVarType(pvApiCtx, piAddr, &typevar);
-       if(sciErr.iErr)
-        {
-                       printError(&sciErr, 0);
-        }
-
-       mapping=getMPIMapping((sci_types)typevar);
-
-       switch (typevar){
-               case sci_matrix:
-        {
-            double *data;
-
-                       SciErr sciErr = getMatrixOfDouble(pvApiCtx, piAddr, &iRows, &iCols, &data);
-            // todo check 
-                       //                      getMatrixOfDouble(pvApiCtx, piAddr, &iRows, &iCols, &data);
-                       mapping.data=NULL;
-                       mapping.data=(double*)malloc((iRows * iCols + 2)*sizeof(double)); // Store iRows + iCols + the data
-                       
-                       double plop = (double)iRows;
-                       double plip = (double)iCols;
-
-                       memcpy(mapping.data,&plop,sizeof(double));
-#ifdef __MPI_DEBUG__
-                       printf("iRows : %5.2f\n", plop);
-                       printf("iCols : %5.2f\n", plip);
-#endif
-                       memcpy(mapping.data+1,&plip,sizeof(double));
-                       memcpy(mapping.data+2,data,iRows*iCols*sizeof(double));
-#ifdef __MPI_DEBUG__
-                       printf("============ data 1 %5.2f ==========\n", mapping.data[2]);fflush(NULL);
-                       printf("============ data 2 %5.2f ==========\n", mapping.data[3]);fflush(NULL);
-#endif
-                       //printf("mapping data: %5.2f\n",(double)mapping.data[0]);
-                       mapping.rows=iRows;
-                       mapping.cols=iCols;
-
-            mapping.customMPI=setHomogenousScilabType(2+iRows*iCols, mapping.MPI); /* 2 for nb Rows & cols */
-        }
-                       break;
-               case sci_strings:
-                       
-                       break;
-               default:
-                       Scierror(999, "Datatype unknown\n");
-                       exit(1);
-                       break;
-       }
-       return mapping;
-}
-
-static mappinpScilabMPI getMPIMapping(sci_types scilabType){
-       mappinpScilabMPI mapping;
-
-       switch (scilabType){
-               case sci_matrix:
-                       printf("MPI double %d \n",mapping.MPI);//, *data[0]);
-                       mapping.MPI=MPI_DOUBLE;
-
-                       mapping.Scilab=scilabType;
-                       mapping.f=getMatrixOfDouble;
-                       /* @TODO: rajouter la gestion des pointeurs de fonction pour getmatrix */                               
-                       break;
-               case sci_strings:
-                       mapping.MPI=MPI_CHAR;
-                       mapping.Scilab=scilabType;
-                       //                      mapping.f=getMatrixOfDouble;
-                       //                      mapping.functionName=getMatrixOfDouble;
-               
-       }
-       return mapping;
-
-}
-
-
-static MPI_Datatype setHomogenousScilabType(int size, MPI_Datatype dataType) {
-       MPI_Datatype matrix;
-       int ierr = MPI_Type_contiguous(size, dataType, &matrix);
-
-       if (ierr != MPI_SUCCESS) 
-               {
-                       fprintf(stderr,"an error occurred");
-               }
-
-       ierr = MPI_Type_commit(&matrix);
-       if (ierr != MPI_SUCCESS) 
-               {
-                       fprintf(stderr,"an error occurred");
-               }
-       return matrix;
-}
-
-/*
-  sci_matrix = 1 ,
-  sci_poly = 2 ,
-  sci_boolean = 4 ,
-  sci_sparse = 5  ,
-  sci_boolean_sparse = 6,
-  sci_matlab_sparse = 7, 
-  sci_ints = 8,
-  sci_handles =9,
-  sci_strings = 10,
-  sci_u_function = 11,
-  sci_c_function = 13 ,
-  sci_lib =  14,
-  sci_list = 15,
-  sci_tlist = 16,
-  sci_mlist = 17,
-  sci_pointer = 128, 
-  sci_implicit_poly = 129,
-  sci_intrinsic_function = 130
-*/
-
diff --git a/scilab/modules/mpi/src/c/mappingScilabMPI.h b/scilab/modules/mpi/src/c/mappingScilabMPI.h
deleted file mode 100644 (file)
index dfa8f74..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2010-2011 - DIGITEO - Sylvestre LEDRU
- *
- * This file must be used under the terms of the CeCILL.
- * This source file is licensed as described in the file COPYING, which
- * you should have received as part of this distribution.  The terms
- * are also available at
- * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
- *
- */
-
-#include <mpi.h>
-#include "stack-c.h"
-#include "api_scilab.h"
-
-#define __MPI_DEBUG__
-
-typedef SciErr (*function_loadData)(void* _pvCtx, int* _piAddress, int* _piRows, int* _piCols, void** _pdblReal);
-
-typedef struct mappinpScilabMPI_struct{
-       MPI_Datatype MPI;
-       MPI_Datatype customMPI;
-       sci_types Scilab;
-       double *data; // TODO doit etre void
-       int rows;  /* Number of elements sent */
-       int cols;  /* Number of elements sent */
-       function_loadData f;
-} mappinpScilabMPI;
-mappinpScilabMPI getMPIDataStructure(int position);
-
diff --git a/scilab/modules/mpi/src/c/s_mpi_recv.c b/scilab/modules/mpi/src/c/s_mpi_recv.c
deleted file mode 100644 (file)
index 3d0585d..0000000
+++ /dev/null
@@ -1,195 +0,0 @@
-/**
- * @author INRIA Lorraine - 1999
- * @author Sylvestre LEDRU <sylvestre.ledru@inria.fr> INRIA Rocquencourt - 2007
- */
-#include "sci_mpi.h"
-#include "s_mpi_recv.h"
-
-
-void C2F(s_mpi_recv)(double * const beginvar,   /* I/O */
-               const int * const maxsize, /* INPUT */
-               int * const size,          /* OUTPUT */
-               const int * const source,  /* INPUT */
-               const int * const tag,     /* INPUT */
-               const int * const comm,    /* INPUT */
-               int stat[2], int *res)   /* OUTPUT */
-{
-  int errcode, errclass;       /* Error mgmt */
-  char error_msg[MPI_MAX_ERROR_STRING];
-  int error_msg_length;
-  MPI_Status status;
-  MPI_Datatype buff_type;
-
-  int n;                       /* size of the pack vector */
-  int *pack;                   /* the pack vector */
-  int l;                       /* size of the buff in bytes */
-
-#ifdef DEBUG
-  if (debuglevel >= 5) {
-    (void) fprintf(stderr, "MPI_RECV: |%f:%d|%d:%d:%d|\n", 
-                  beginvar[0], *maxsize, *source, *tag, *comm);        
-    (void) fflush (stderr);    
-  }    
-#endif /* DEBUG */
-
-  *size = 2;
-  if (*size <= *maxsize){              /* on retourne en cas d erreur une
-                                          matrice de taille vide */
-    int *ptr_int = (int*)beginvar;
-    
-    ptr_int[0] = 1;    /* scalar type */
-    ptr_int[1] = 0;    /* m */
-    ptr_int[2] = 0;    /* n */
-    ptr_int[3] = 0;    /* real */
-  } 
-  else {
-    (void) fprintf(stderr, "Error in mpi_recv: Not enough memory: available=%d:needed=%d\n", *maxsize, *size);
-    (void) fflush(stderr);
-    *res = MPI_ERR_OTHER;
-    return;
-  }
-  (void) fprintf(stderr, "Error ICI 1 \n");
-    (void) fflush(stderr);
-       // BUG ICI, VOIR PK CA MERDE LA ?
-       errcode = MPI_Probe(*source, *tag, MPI_COMM_WORLD, &status);
-  (void) fprintf(stderr, "Error ICI 2 \n");
-    (void) fflush(stderr);
-
-  if (errcode != MPI_SUCCESS){
-  (void) fprintf(stderr, "Error ICI 3 \n");
-    (void) fflush(stderr);
-
-    MPI_Error_string(errcode, error_msg, &error_msg_length);
-    MPI_Error_class(errcode, &errclass);
-    (void) fprintf(stderr, "Error mpi_recv -MPI_Probe-: %d:%s\n", 
-                  errclass, error_msg);
-    (void) fflush(stderr);
-    *res = errcode;
-    return;
-  }
-  (void) fprintf(stderr, "Error ICI 4 \n");
-    (void) fflush(stderr);
-
-  errcode = MPI_Get_count(&status, MPI_INT, &n);
-  if (errcode != MPI_SUCCESS){
-    MPI_Error_string(errcode, error_msg, &error_msg_length);
-    MPI_Error_class(errcode, &errclass);
-    (void) fprintf(stderr, "Error mpi_recv -MPI_Get_count-: %d:%s\n", 
-                  errclass, error_msg);
-    (void) fflush(stderr);
-    *res = errcode;
-    return;
-  }
-#ifdef DEBUG
-  if (debuglevel >= 10) {
-    int i;
-    (void) fprintf(stderr, "MPI_RECV: %d\n", n);       
-    (void) fflush(stderr);     
-  }    
-#endif /* DEBUG */  
-  if ((pack = (int *) malloc(n * sizeof(int))) == NULL){
-    (void) fprintf(stderr, "Error malloc in mpi_recv\n");
-    (void) fflush(stderr);
-    *res = MPI_ERR_OTHER;
-    return; 
-  }
-  (void) fprintf(stderr, "Error ICI 5 \n");
-    (void) fflush(stderr);
-
-  errcode = MPI_Recv(pack, n, MPI_INT, *source, *tag, 
-                    MPI_COMM_WORLD, &status);
-  (void) fprintf(stderr, "Error ICI 6 \n");
-    (void) fflush(stderr);
-
-  if (errcode != MPI_SUCCESS){
-    MPI_Error_string(errcode, error_msg, &error_msg_length);
-    MPI_Error_class(errcode, &errclass);
-    (void) fprintf(stderr, "Error mpi_recv -MPI_Recv-: %d:%s\n", 
-                  errclass, error_msg);
-    (void) fflush(stderr);
-    *res = errcode;
-    free(pack);
-    return;
-  }
-#ifdef DEBUG
-  if (debuglevel >= 10) {
-    int i;
-    (void) fprintf(stderr, "MPI_RECV: ");      
-    for (i = 0; i < n; ++i) {
-      (void) fprintf(stderr, "%d:", 
-                    pack[i]);
-    }
-    (void) fprintf(stderr, "\n");
-    (void) fflush(stderr);     
-  }    
-#endif /* DEBUG */  
-  errcode = build_buff_type(n, pack, &buff_type, &l);
-  free(pack);
-  if (errcode != MPI_SUCCESS){
-    MPI_Error_string(errcode, error_msg, &error_msg_length);
-    MPI_Error_class(errcode, &errclass);
-    (void) fprintf(stderr, "Error mpi_recv -build_buff_type-: %d:%s\n", 
-                  errclass, error_msg);
-    (void) fflush(stderr);
-    *res = errcode;
-    return;
-  }
-  if ((l/sizeof(double)) > *maxsize){ 
-    (void) fprintf(stderr, "Error in mpi_recv: Not enough memory: available=%d:needed=%d\n", *maxsize, *size);
-    (void) fflush(stderr);
-    *res = MPI_ERR_OTHER;
-    return;
-  }
-
-  errcode = MPI_Type_commit(&buff_type);
-  if (errcode != MPI_SUCCESS){
-    MPI_Error_string(errcode, error_msg, &error_msg_length);
-    MPI_Error_class(errcode, &errclass);
-    (void) fprintf(stderr, "Error mpi_send -MPI_Type_commit-: %d:%s\n", 
-                  errclass, error_msg);
-    (void) fflush(stderr);
-    *res = errcode;
-    return;
-  }
-  
-  errcode = MPI_Recv(beginvar, 1, buff_type, *source, *tag,
-                    MPI_COMM_WORLD, &status);
-  stat[0] = status.MPI_SOURCE;
-  stat[1] = status.MPI_TAG;
-  if (errcode != MPI_SUCCESS){
-    MPI_Error_string(errcode, error_msg, &error_msg_length);
-    MPI_Error_class(errcode, &errclass);
-    (void) fprintf(stderr, "Error mpi_recv -MPI_Recv-: %d:%s\n", 
-                  errclass, error_msg);
-    (void) fflush(stderr);
-    *res = errcode;
-    return;
-  }
-#ifdef DEBUG
-  if (debuglevel >= 10) {
-    int i;
-    char *ptr = (char*) beginvar;
-    (void) fprintf(stderr, "SEND:");   
-    for (i = 0; i < l; ++i) {
-      (void) fprintf(stderr, "%d:", ptr[i]);
-    }
-    (void) fprintf(stderr, "\n");      
-    (void) fflush (stderr);    
-  }    
-#endif /* DEBUG */
-
-
-  errcode = MPI_Type_free(&buff_type);
-  if (errcode != MPI_SUCCESS){
-    MPI_Error_string(errcode, error_msg, &error_msg_length);
-    MPI_Error_class(errcode, &errclass);
-    (void) fprintf(stderr, "Error mpi_send -MPI_Type_free-: %d:%s\n", 
-                  errclass, error_msg);
-    (void) fflush(stderr);
-    *res = errcode;
-    return;
-  }
-  *size = l/sizeof(double);    
-  *res = errcode;
-} 
diff --git a/scilab/modules/mpi/src/c/s_mpi_recv.h b/scilab/modules/mpi/src/c/s_mpi_recv.h
deleted file mode 100644 (file)
index 29116df..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * @author INRIA Lorraine - 1999
- * @author Sylvestre LEDRU <sylvestre.ledru@inria.fr> INRIA Rocquencourt - 2007
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include "build_buff_type.h"
-/**
- * TODO : comment
- *
- *
- */
-void C2F(s_mpi_recv)(double * const beginvar,   /* I/O */
-               const int * const maxsize, /* INPUT */
-               int * const size,          /* OUTPUT */
-               const int * const source,  /* INPUT */
-               const int * const tag,     /* INPUT */
-               const int * const comm,    /* INPUT */
-               int stat[2], int *res);   /* OUTPUT */
diff --git a/scilab/modules/mpi/src/c/s_mpi_send.c b/scilab/modules/mpi/src/c/s_mpi_send.c
deleted file mode 100644 (file)
index f08d807..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-/**
- * @author INRIA Lorraine - 1999
- * @author Sylvestre LEDRU <sylvestre.ledru@inria.fr> INRIA Rocquencourt - 2007
- */
-#include "sci_mpi.h"
-#include "s_mpi_send.h"
-#include "build_buff_type.h"
-
-void C2F(s_mpi_send)(int *pack, int *n, double *buff, int *dest, int *tag, int *comm, int *res){
-       int errcode, errclass;  /* Error mgmt */
-       char error_msg[MPI_MAX_ERROR_STRING];
-       int error_msg_length;
-       int l;                  /* size of the buff to send in bytes */
-  
-       MPI_Datatype buff_type;
-
-       MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN);
-#ifdef DEBUG
-       if (debuglevel >= 5) {    
-               int *ptr_int = (int *)buff;
-               (void) fprintf(stderr, "MPI_SEND: n : %d\ndest :%d\ntag : %d\ncomm : %d^npack[0] %d\npack[1] %d\nptr_int[0] %d\nptr_int[1] %d\nptr_int[2] %d\nptr_int[3] %d\nbuff[2] %f\nbuff[3] %f\n", 
-                                          *n, *dest, *tag, *comm, 
-                                          pack[0], pack[1], 
-                                          ptr_int[0],ptr_int[1],
-                                          ptr_int[2],ptr_int[3],
-                                          buff[2],buff[3]);
-               (void) fflush (stderr); 
-       }
-#endif /* DEBUG */
-
-#ifdef DEBUG
-       if (debuglevel >= 10) {
-               int i;
-               (void) fprintf(stderr, "MPI_SEND: %d|", *n);    
-               for (i = 0; i < *n; ++i) {
-                       (void) fprintf(stderr, "%d:", 
-                                                  pack[i]);
-               }
-               (void) fprintf(stderr, "\n");
-               (void) fflush(stderr);  
-       }       
-#endif /* DEBUG */
-  
-       errcode = build_buff_type(*n, pack, &buff_type, &l);
-       if (errcode != MPI_SUCCESS){
-               MPI_Error_string(errcode, error_msg, &error_msg_length);
-               MPI_Error_class(errcode, &errclass);
-               (void) fprintf(stderr, "Error mpi_send -build_buff_type-: %d:%s\n", 
-                                          errclass, error_msg);
-               (void) fflush(stderr);
-               *res = errcode;
-               return;
-       }
-       errcode = MPI_Type_commit(&buff_type);
-       if (errcode != MPI_SUCCESS){
-               MPI_Error_string(errcode, error_msg, &error_msg_length);
-               MPI_Error_class(errcode, &errclass);
-               (void) fprintf(stderr, "Error mpi_send -MPI_Type_commit-: %d:%s\n", 
-                                          errclass, error_msg);
-               (void) fflush(stderr);
-               *res = errcode;
-               return;
-       }
-    
-       /* Send the packing vector. The recv
-          part must make a call to probe
-          firts to have its size. */
-       errcode = MPI_Send(pack, *n, MPI_INT, *dest, *tag, MPI_COMM_WORLD);  
-       if (errcode != MPI_SUCCESS){
-               MPI_Error_string(errcode, error_msg, &error_msg_length);
-               MPI_Error_class(errcode, &errclass);
-               (void) fprintf(stderr, "Error mpi_send -MPI_Send-: %d:%s\n", 
-                                          errclass, error_msg);
-               (void) fflush(stderr);
-               *res = errcode;
-               return;
-       }
-       /* Send the data... */
-       errcode = MPI_Send(buff, 1, buff_type, *dest, *tag, MPI_COMM_WORLD);  
-       if (errcode != MPI_SUCCESS){
-               MPI_Error_string(errcode, error_msg, &error_msg_length);
-               MPI_Error_class(errcode, &errclass);
-               (void) fprintf(stderr, "Error mpi_send -MPI_Send-: %d:%s\n", 
-                                          errclass, error_msg);
-               (void) fflush(stderr);
-               *res = errcode;
-               return;
-       }
-  
-#ifdef DEBUG
-       if (debuglevel >= 10) {
-               int i;
-               char *ptr = (char*) buff;
-               (void) fprintf(stderr, "SEND:");        
-               for (i = 0; i < l; ++i) {
-                       (void) fprintf(stderr, "%d:",ptr[i]);
-               }
-               (void) fprintf(stderr, "\n");   
-               (void) fflush (stderr); 
-       }       
-#endif /* DEBUG */
-       errcode = MPI_Type_free(&buff_type);
-       if (errcode != MPI_SUCCESS){
-               MPI_Error_string(errcode, error_msg, &error_msg_length);
-               MPI_Error_class(errcode, &errclass);
-               (void) fprintf(stderr, "Error mpi_send -MPI_Type_free-: %d:%s\n", 
-                                          errclass, error_msg);
-               (void) fflush(stderr);
-               *res = errcode;
-               return;
-       }
-       *res = MPI_SUCCESS;
-} 
diff --git a/scilab/modules/mpi/src/c/s_mpi_send.h b/scilab/modules/mpi/src/c/s_mpi_send.h
deleted file mode 100644 (file)
index d9dff62..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @author INRIA Lorraine - 1999
- * @author Sylvestre LEDRU <sylvestre.ledru@inria.fr> INRIA Rocquencourt - 2007
- */
-#include <stdio.h>
-
-
-void C2F(s_mpi_send)(int *pack, int *n,
-               double *buff,
-               int *dest,
-               int *tag,
-               int *comm,
-                                        int *res);
diff --git a/scilab/modules/mpi/src/c/serialization.c b/scilab/modules/mpi/src/c/serialization.c
new file mode 100644 (file)
index 0000000..4f6ed15
--- /dev/null
@@ -0,0 +1,407 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011-2011 - DIGITEO - Antoine ELIAS
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+#include <string.h>
+#include <stdio.h>
+#include "sci_types.h"
+#include "BOOL.h"
+#include "api_scilab.h"
+#include "stack1.h"
+#include "MALLOC.h"
+
+int serialize_double(void *_pvCtx, int *_piAddr, int **_piBuffer, int *_piBufferSize)
+{
+    SciErr sciErr;
+    int iRows = 0;
+    int iCols = 0;
+    int iOne = 1;
+    int iSize = 0;
+    double *pdblR = NULL;
+    double *pdblI = NULL;
+
+    int *piOut = NULL;
+    int iOutLen = 0;
+
+    if (isVarComplex(_pvCtx, _piAddr))
+    {
+        double *p = NULL;
+
+        sciErr = getComplexMatrixOfDouble(_pvCtx, _piAddr, &iRows, &iCols, &pdblR, &pdblI);
+        if (sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            return 1;
+        }
+
+        iOutLen = 4 + (2 * iRows * iCols * sizeof(double) / sizeof(int));
+        piOut = (int *)MALLOC(iOutLen * sizeof(int));
+        if (piOut == NULL)
+        {
+            return 1;
+        }
+
+        piOut[0] = sci_matrix;
+        piOut[1] = iRows;
+        piOut[2] = iCols;
+        piOut[3] = 1;           //complex
+
+        //move 'p' to first real value
+        p = (double *)(piOut + 4);
+        iSize = iRows * iCols;
+        C2F(dcopy) (&iSize, pdblR, &iOne, p, &iOne);
+        //move 'p' to first complex value
+        p = p + iRows * iCols;
+        C2F(dcopy) (&iSize, pdblI, &iOne, p, &iOne);
+    }
+    else
+    {
+        double *p = NULL;
+
+        sciErr = getMatrixOfDouble(_pvCtx, _piAddr, &iRows, &iCols, &pdblR);
+        if (sciErr.iErr)
+        {
+            printError(&sciErr, 0);
+            return 1;
+        }
+
+        iOutLen = 4 + (iRows * iCols * sizeof(double) / sizeof(int));
+        piOut = (int *)MALLOC(iOutLen * sizeof(int));
+        if (piOut == NULL)
+        {
+            return 1;
+        }
+
+        piOut[0] = sci_matrix;
+        piOut[1] = iRows;
+        piOut[2] = iCols;
+        piOut[3] = 0;           //not complex
+
+        //move 'p' to first complex value
+        p = (double *)(piOut + 4);
+        iSize = iRows * iCols;
+        C2F(dcopy) (&iSize, pdblR, &iOne, p, &iOne);
+    }
+
+    *_piBuffer = piOut;
+    *_piBufferSize = iOutLen;
+    return 0;
+}
+
+int serialize_string(void *_pvCtx, int *_piAddr, int **_piBuffer, int *_piBufferSize)
+{
+    int iErr = 0;
+    int i = 0;
+    int iRows = 0;
+    int iCols = 0;
+    char **pstData = NULL;
+    char *p = NULL;
+
+    int *piOut = NULL;
+    int *piOutLen = NULL;
+    int iOutLen = 0;
+
+    iErr = getAllocatedMatrixOfString(_pvCtx, _piAddr, &iRows, &iCols, &pstData);
+    if (iErr)
+    {
+        return 1;
+    }
+
+    for (i = 0; i < iRows * iCols; i++)
+    {
+        iOutLen += strlen(pstData[i]);
+    }
+
+    if (iOutLen % 4)
+    {
+        iOutLen = iOutLen / (sizeof(int) / sizeof(char)) + 1;
+    }
+    else
+    {
+        iOutLen = iOutLen / (sizeof(int) / sizeof(char));
+    }
+
+    //4 for header and size of each string
+    iOutLen += 4 + iRows * iCols;
+
+    piOut = (int *)MALLOC(iOutLen * sizeof(int));
+    if (piOut == NULL)
+    {
+        return 1;
+    }
+
+    piOut[0] = sci_strings;
+    piOut[1] = iRows;
+    piOut[2] = iCols;
+    piOut[3] = 0;               //not complex
+
+    piOutLen = piOut + 4;
+
+    for (i = 0; i < iRows * iCols; i++)
+    {
+        piOutLen[i] = strlen(pstData[i]);
+    }
+
+    p = (char *)(piOut + 4 + iRows * iCols);
+    for (i = 0; i < iRows * iCols; i++)
+    {
+        memcpy(p, pstData[i], piOutLen[i]);
+        p += piOutLen[i];
+    }
+
+    *_piBuffer = piOut;
+    *_piBufferSize = iOutLen;
+    return 0;
+}
+
+int serialize_boolean(void *_pvCtx, int *_piAddr, int **_piBuffer, int *_piBufferSize)
+{
+    SciErr sciErr;
+    int iRows = 0;
+    int iCols = 0;
+    int *piBool = NULL;
+    int *p = NULL;
+
+    int *piOut = NULL;
+    int iOutLen = 0;
+
+    sciErr = getMatrixOfBoolean(_pvCtx, _piAddr, &iRows, &iCols, &piBool);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 1;
+    }
+
+    //4 for header and 1 for each boolean
+    iOutLen = 4 + iRows * iCols;
+
+    piOut = (int *)MALLOC(iOutLen * sizeof(int *));
+    if (piOut == NULL)
+    {
+        return 1;
+    }
+
+    piOut[0] = sci_boolean;
+    piOut[1] = iRows;
+    piOut[2] = iCols;
+    piOut[3] = 0;               //not complex
+
+    p = (int *)(piOut + 4);
+    memcpy(p, piBool, iRows * iCols * sizeof(int));
+
+    *_piBuffer = piOut;
+    *_piBufferSize = iOutLen;
+    return 0;
+}
+
+int serialize_int(void *_pvCtx, int *_piAddr, int **_piBuffer, int *_piBufferSize)
+{
+    SciErr sciErr;
+    int iPrecision = 0;
+    int iRows = 0;
+    int iCols = 0;
+    int iItemSize = 0;
+    void *p = NULL;
+    void *pvData = NULL;
+
+    int *piOut = NULL;
+    int iOutLen = 0;
+
+    sciErr = getVarDimension(_pvCtx, _piAddr, &iRows, &iCols);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 1;
+    }
+
+    sciErr = getMatrixOfIntegerPrecision(_pvCtx, _piAddr, &iPrecision);
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 1;
+    }
+
+    if (iPrecision == SCI_INT8 || iPrecision == SCI_UINT8)
+    {
+        iItemSize = sizeof(char);
+    }
+    else if (iPrecision == SCI_INT16 || iPrecision == SCI_UINT16)
+    {
+        iItemSize = sizeof(short);
+    }
+    else if (iPrecision == SCI_INT32 || iPrecision == SCI_UINT32)
+    {
+        iItemSize = sizeof(int);
+    }
+/*
+    else if(iPrecision == SCI_INT64 || iPrecision == SCI_UINT64)
+    {
+        iItemSize = sizeof(long long);
+    }
+*/
+    //check and adjust alignement on integer
+    iOutLen = iRows * iCols;
+    if ((iOutLen * iItemSize) % sizeof(int))
+    {
+        iOutLen = (iOutLen * iItemSize) / sizeof(int) + 1;
+    }
+    else
+    {
+        iOutLen = (iOutLen * iItemSize) / (sizeof(int));
+    }
+
+    iOutLen += 4;
+    piOut = (int *)MALLOC(iOutLen * sizeof(int *));
+    if (piOut == NULL)
+    {
+        return 1;
+    }
+
+    piOut[0] = sci_ints;
+    piOut[1] = iRows;
+    piOut[2] = iCols;
+    piOut[3] = iPrecision;      //precision
+
+    switch (iPrecision)
+    {
+    case SCI_INT8:
+        {
+            sciErr = getMatrixOfInteger8(_pvCtx, _piAddr, &iRows, &iCols, (char **)&pvData);
+            break;
+        }
+    case SCI_UINT8:
+        {
+            sciErr = getMatrixOfUnsignedInteger8(_pvCtx, _piAddr, &iRows, &iCols, (unsigned char **)&pvData);
+            break;
+        }
+    case SCI_INT16:
+        {
+            sciErr = getMatrixOfInteger16(_pvCtx, _piAddr, &iRows, &iCols, (short **)&pvData);
+            break;
+        }
+    case SCI_UINT16:
+        {
+            sciErr = getMatrixOfUnsignedInteger16(_pvCtx, _piAddr, &iRows, &iCols, (unsigned short **)&pvData);
+            break;
+        }
+    case SCI_INT32:
+        {
+            sciErr = getMatrixOfInteger32(_pvCtx, _piAddr, &iRows, &iCols, (int **)&pvData);
+            break;
+        }
+    case SCI_UINT32:
+        {
+            sciErr = getMatrixOfUnsignedInteger32(_pvCtx, _piAddr, &iRows, &iCols, (unsigned int **)&pvData);
+            break;
+        }
+/*
+    case SCI_INT64 :
+    { 
+        sciErr = getMatrixOfInteger64(_pvCtx, _piAddr, &iRows, &iCols, (long long**)&pvData);
+        break;
+    }
+    case SCI_UINT64 :
+    { 
+        sciErr = getMatrixOfUnsignedInteger64(_pvCtx, _piAddr, &iRows, &iCols, (unsigned long long**)&pvData);
+        break;
+        }
+*/ default:
+        return 1;
+    }
+
+    if (sciErr.iErr)
+    {
+        printError(&sciErr, 0);
+        return 1;
+    }
+
+    p = piOut + 4;
+    memcpy(p, pvData, iRows * iCols * iItemSize);
+    *_piBuffer = piOut;
+    *_piBufferSize = iOutLen;
+    return 0;
+}
+
+int serialize_sparse(void *_pvCtx, int *_piAddr, int **_piBuffer, int *_piBufferSize, BOOL _bData)
+{
+    int iRet = 0;
+    int iRows = 0;
+    int iCols = 0;
+    int iItemCount = 0;
+    int *piRowCount = 0;
+    int *piColPos = 0;
+    int iComplex = 0;
+
+    double *pdblR = NULL;
+    double *pdblI = NULL;
+
+    int *piOut = NULL;
+    int iOutLen = 0;
+
+    if (_bData)
+    {                           //sparse
+
+        iComplex = isVarComplex(_pvCtx, _piAddr);
+        if (iComplex)
+        {
+            iRet = getAllocatedComplexSparseMatrix(_pvCtx, _piAddr, &iRows, &iCols, &iItemCount, &piRowCount, &piColPos, &pdblR, &pdblI);
+        }
+        else
+        {
+            iRet = getAllocatedSparseMatrix(_pvCtx, _piAddr, &iRows, &iCols, &iItemCount, &piRowCount, &piColPos, &pdblR);
+        }
+    }
+    else
+    {                           //boolean sparse
+        iRet = getAllocatedBooleanSparseMatrix(_pvCtx, _piAddr, &iRows, &iCols, &iItemCount, &piRowCount, &piColPos);
+    }
+
+    if (iRet)
+    {
+        return 1;
+    }
+
+    //5 -> 4 for header + 1 for item count
+    iOutLen = 5 + iRows + iItemCount;
+
+    if (_bData)
+    {
+        iOutLen += iItemCount * (iComplex + 1) * sizeof(double) / sizeof(int);
+    }
+
+    piOut = (int *)MALLOC(iOutLen * sizeof(int));
+
+    piOut[0] = _bData ? sci_sparse : sci_boolean_sparse;
+    piOut[1] = iRows;
+    piOut[2] = iCols;
+    piOut[3] = iComplex;
+    piOut[4] = iItemCount;
+
+    memcpy(piOut + 5, piRowCount, iRows * sizeof(int));
+    memcpy(piOut + 5 + iRows, piColPos, iItemCount * sizeof(int));
+
+    if (_bData)
+    {
+        int iOne = 1;
+        double *pRealData = (double *)(piOut + 5 + iRows + iItemCount);
+
+        C2F(dcopy) (&iItemCount, pdblR, &iOne, pRealData, &iOne);
+        if (iComplex)
+        {
+            double *pImgData = pRealData + iItemCount;
+
+            C2F(dcopy) (&iItemCount, pdblI, &iOne, pImgData, &iOne);
+        }
+    }
+
+    *_piBuffer = piOut;
+    *_piBufferSize = iOutLen;
+    return 0;
+}
diff --git a/scilab/modules/mpi/src/c/serialization.h b/scilab/modules/mpi/src/c/serialization.h
new file mode 100644 (file)
index 0000000..3cec6cb
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011-2011 - DIGITEO - Antoine ELIAS
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+int serialize_double(void *_pvCtx, int *_piAddr, int **_piBuffer, int *_piBufferSize);
+int serialize_string(void *_pvCtx, int *_piAddr, int **_piBuffer, int *_piBufferSize);
+int serialize_boolean(void *_pvCtx, int *_piAddr, int **_piBuffer, int *_piBufferSize);
+int serialize_int(void *_pvCtx, int *_piAddr, int **_piBuffer, int *_piBufferSize);
+int serialize_sparse(void *_pvCtx, int *_piAddr, int **_piBuffer, int *_piBufferSize, BOOL _bData);
index 4d870c8..d917158 100644 (file)
@@ -22,7 +22,6 @@ Master = ~ SLV;                       // slaves are all other
 
 if Master
 
-       disp("MASTER: We have " + string(sizeNodes) + " processors")
        for slaveId = 1:sizeNodes-1
         value = rand(100,100) > 0.5;
                MPI_Send(value, slaveId)
@@ -31,14 +30,9 @@ if Master
        for slaveId = 1:sizeNodes-1
                tag=0
                valueBack=MPI_Recv(slaveId, tag);
-               if valueBack <> ~value then disp("Failed (expected scalar string): " + valueBack);
-           pause
-        else
-            disp("Node " + string(slaveId) + ": OK")
-        end
+        assert_checkequal(valueBack, ~value);
        end
 else
-       disp("SLAVE: Processor "+string(rnk))
        rankSource=0;
        tag=0;
     value=MPI_Recv(rankSource, tag)
@@ -49,4 +43,4 @@ else
 end
 
 MPI_Finalize()
-exit;
+
index 600b397..09a4f3b 100644 (file)
@@ -22,7 +22,6 @@ Master = ~ SLV;                       // slaves are all other
 
 if Master
 
-       disp("MASTER: We have " + string(sizeNodes) + " processors")
        for slaveId = 1:sizeNodes-1
         dense=[ %T, %F, %T, %F
                 %F, %T, %F, %T
@@ -35,14 +34,9 @@ if Master
        for slaveId = 1:sizeNodes-1
                tag=0
                valueBack=MPI_Recv(slaveId, tag);
-               if valueBack <> ~value then disp("Failed (expected scalar string): " + valueBack);
-           pause
-        else
-            disp("Node " + string(slaveId) + ": OK")
-        end
+        assert_checkequal(valueBack, ~value);
        end
 else
-       disp("SLAVE: Processor "+string(rnk))
        rankSource=0;
        tag=0;
     value=MPI_Recv(rankSource, tag)
@@ -54,4 +48,4 @@ else
 end
 
 MPI_Finalize()
-exit;
+
index c981dcc..9d745a8 100644 (file)
@@ -1,67 +1,61 @@
+rnk =    MPI_Comm_rank();
 // =============================================================================
+sizeNodes =    MPI_Comm_size();
+if MPI_Comm_size() <> 2 then bugmes();quit;end
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+SLV = rnk;                // handy shortcuts, master is rank 0
 // Copyright (C) 2010-2010 - DIGITEO - Sylvestre LEDRU
+Master = ~ SLV;            // slaves are all other
+if Master
+    for slaveId = 1:sizeNodes-1
 //
+        value = rand(100,100) + rand(100,100) * %i;
+        MPI_Send(value, slaveId);
 //  This file is distributed under the same license as the Scilab package.
+    end
+    for slaveId = 1:sizeNodes-1
+        tag=0;
 // =============================================================================
+        valueBack=MPI_Recv(slaveId, tag);
+        assert_checkequal(valueBack,value + 1);
+    end
 //
+else
+    rankSource=0;
 // <-- MPI TEST -->
+    tag=0;
+    value=MPI_Recv(rankSource, tag);
 // This test sends a matrix of double [42,41] and, on each slave,
 // it adds +1 to each element
 // and send it back to the master
 // 
 MPI_Init();
-rnk =  MPI_Comm_rank();
-sizeNodes =    MPI_Comm_size();
+rnk =    MPI_Comm_rank();
+sizeNodes =    MPI_Comm_size();
 if MPI_Comm_size() <> 2 then bugmes();quit;end
-SLV = rnk;                             // handy shortcuts, master is rank 0
-Master = ~ SLV;                        // slaves are all other
+SLV = rnk;                // handy shortcuts, master is rank 0
+Master = ~ SLV;            // slaves are all other
 if Master
-       disp("MASTER: We have "+string(sizeNodes) + " processors")
- MASTER: We have 2 processors   
-       for slaveId = 1:sizeNodes-1
-               MPI_Send([42,41],slaveId)
-               disp("MASTER: ICI after mpi_send");
-       end
- ans  =
-    0.  
- value  =
- MASTER: ICI after mpi_send   
-       for slaveId = 1:sizeNodes-1
-    42.    41.  
-               tag=0
-       disp("SLAVE:"+string(value));
-               disp("MASTER: mpi_recv")
-           valueBack=MPI_Recv(slaveId, tag);
-               if valueBack(1) <> 43 & valueBack(2) <> 42 then bugmes();quit;end
-       end
- tag  =
-!SLAVE:42  SLAVE:41  !
-    0.  
-       value=value+1;
- MASTER: mpi_recv   
-       // Send back to the master
-       MPI_Send(value,0)
- ans  =
-else
-    0.  
-       disp("SLAVE: Processor "+string(rnk))
+    for slaveId = 1:sizeNodes-1
+        value = rand(100,100) + rand(100,100) * %i;
+        MPI_Send(value, slaveId);
+    end
+    value=value+1;
+    for slaveId = 1:sizeNodes-1
+    // Send back to the master
+        tag=0;
+    MPI_Send(value,0);
+        valueBack=MPI_Recv(slaveId, tag);
+        assert_checkequal(valueBack,value + 1);
+    end
 end
-       rankSource=0;
-MPI_Finalize()
-       tag=0;
-    value=MPI_Recv(rankSource, tag)
-       disp("SLAVE:"+string(value));
-       value=value+1;
-       // Send back to the master
-       MPI_Send(value,0)
+MPI_Finalize();
+else
+    rankSource=0;
+    tag=0;
+    value=MPI_Recv(rankSource, tag);
+    value=value+1;
+    // Send back to the master
+    MPI_Send(value,0);
 end
-MPI_Finalize()
+MPI_Finalize();
index 14c10b6..86b062c 100644 (file)
@@ -6,45 +6,39 @@
 // =============================================================================
 //
 // <-- MPI TEST -->
-// This test sends a matrix of double [42,41] and, on each slave,
+//
+// This test sends a rand matrix of double complex and, on each slave,
 // it adds +1 to each element
 // and send it back to the master
 // 
 MPI_Init();
-rnk =  MPI_Comm_rank();
-sizeNodes =    MPI_Comm_size();
+rnk =    MPI_Comm_rank();
+sizeNodes =    MPI_Comm_size();
 
 if MPI_Comm_size() <> 2 then pause, end
 
-SLV = rnk;                             // handy shortcuts, master is rank 0
-Master = ~ SLV;                        // slaves are all other
+SLV = rnk;                // handy shortcuts, master is rank 0
+Master = ~ SLV;            // slaves are all other
 
 if Master
-       disp("MASTER: We have "+string(sizeNodes) + " processors")
-       for slaveId = 1:sizeNodes-1
+    for slaveId = 1:sizeNodes-1
         value = rand(100,100) + rand(100,100) * %i;
-               MPI_Send(value, slaveId)
-       end
+        MPI_Send(value, slaveId);
+    end
 
-       for slaveId = 1:sizeNodes-1
-               tag=0
-               valueBack=MPI_Recv(slaveId, tag);
-               if valueBack <> value + 1 then disp("Failed (expected value + 1: "+string(valueBack));
-           pause
-        else
-            disp("Node " + string(slaveId) + ": OK")
-        end
-       end
+    for slaveId = 1:sizeNodes-1
+        tag=0;
+        valueBack=MPI_Recv(slaveId, tag);
+        assert_checkequal(valueBack,value + 1);
+    end
 else
-       disp("SLAVE: Processor "+string(rnk))
-       rankSource=0;
-       tag=0;
-    value=MPI_Recv(rankSource, tag)
-       value=value+1;
-       // Send back to the master
-       MPI_Send(value,0)
+    rankSource=0;
+    tag=0;
+    value=MPI_Recv(rankSource, tag);
+    value=value+1;
+    // Send back to the master
+    MPI_Send(value,0);
 
 end
 
-MPI_Finalize()
-exit();
+MPI_Finalize();
index 3cca3b1..0c4ba53 100644 (file)
@@ -6,9 +6,6 @@
 // =============================================================================
 //
 // <-- MPI TEST -->
-// This test sends a matrix of double [42,41] and, on each slave,
-// it adds +1 to each element
-// and send it back to the master
 // 
 
 MPI_Init();
@@ -22,7 +19,6 @@ Master = ~ SLV;                       // slaves are all other
 
 if Master
 
-       disp("MASTER: We have " + string(sizeNodes) + " processors")
        for slaveId = 1:sizeNodes-1
         value = int8(rand(100,100) * 100);
                MPI_Send(value, slaveId)
@@ -31,14 +27,9 @@ if Master
        for slaveId = 1:sizeNodes-1
                tag=0
                valueBack=MPI_Recv(slaveId, tag);
-               if valueBack <> value + 1 then disp("Failed (expected scalar string): " + valueBack);
-           pause
-        else
-            disp("Node " + string(slaveId) + ": OK")
-        end
+        assert_checkequal(valueBack, value + 1);
        end
 else
-       disp("SLAVE: Processor "+string(rnk))
        rankSource=0;
        tag=0;
     value=MPI_Recv(rankSource, tag)
@@ -49,4 +40,4 @@ else
 end
 
 MPI_Finalize()
-exit;
+
index 291f547..e8f4940 100644 (file)
@@ -6,9 +6,6 @@
 // =============================================================================
 //
 // <-- MPI TEST -->
-// This test sends a matrix of double [42,41] and, on each slave,
-// it adds +1 to each element
-// and send it back to the master
 // 
 MPI_Init();
 rnk =  MPI_Comm_rank();
@@ -20,7 +17,6 @@ SLV = rnk;                            // handy shortcuts, master is rank 0
 Master = ~ SLV;                        // slaves are all other
 
 if Master
-       disp("MASTER: We have "+string(sizeNodes) + " processors")
        for slaveId = 1:sizeNodes-1
         value = sprand(100, 100, 0.01) + sprand(100, 100, 0.01) * %i;
                MPI_Send(value, slaveId)
@@ -31,15 +27,11 @@ if Master
                valueBack=MPI_Recv(slaveId, tag);
         [ij,v,mn]=spget(value);
         value = sparse(ij,v+1+%i,mn);
-               if valueBack <> value then disp("Failed (expected value + 1: "+string(valueBack));
-           pause
-        else
-            disp("Node " + string(slaveId) + ": OK")
-        end
+               assert_checkequal(size(valueBack),size(value));
+        // Cannot check the values. See bug #10119
        end
 
 else
-       disp("SLAVE: Processor "+string(rnk))
        rankSource=0;
        tag=0;
     value=MPI_Recv(rankSource, tag)
index 05b0354..0d5c673 100644 (file)
@@ -1,14 +1,11 @@
 // =============================================================================
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2010-2010 - DIGITEO - Sylvestre LEDRU
+// Copyright (C) 2011 - DIGITEO - Sylvestre LEDRU
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
 //
 // <-- MPI TEST -->
-// This test sends a matrix of double [42,41] and, on each slave,
-// it adds +1 to each element
-// and send it back to the master
 // 
 
 MPI_Init();
@@ -31,11 +28,8 @@ if Master
        for slaveId = 1:sizeNodes-1
                tag=0
                valueBack=MPI_Recv(slaveId, tag);
-               if size(valueBack) <> [1,1] | valueBack <> strcat(value) then disp("Failed (expected scalar string): " + valueBack);
-           pause
-        else
-            disp("Node " + string(slaveId) + ": OK")
-        end
+        assert_checkequal(size(valueBack), [1,1]);
+               assert_checkequal(valueBack, strcat(value))
        end
 else
        disp("SLAVE: Processor "+string(rnk))
@@ -50,4 +44,4 @@ else
 end
 
 MPI_Finalize()
-exit;
+
diff --git a/scilab/modules/mpi/tests/unit_tests/serialization.tst b/scilab/modules/mpi/tests/unit_tests/serialization.tst
deleted file mode 100644 (file)
index b7377e3..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2010-2010 - DIGITEO - Sylvestre LEDRU
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-//
-
-a=[23, 23; 42, 42];
-myFile=TMPDIR+"/test"
-MPI_serialize(myFile,a);
-a2=MPI_unserialize(myFile);
-
-if a<>a2 then pause, end
-
-clear a,a2;
-
-a=23;
-myFile=TMPDIR+"/test"
-MPI_serialize(myFile,a);
-a2=MPI_unserialize(myFile);
-
-if a<>a2 then pause, end
-
-
-clear a,a2;
-
-a=rand(100,100);
-myFile=TMPDIR+"/test"
-MPI_serialize(myFile,a);
-a2=MPI_unserialize(myFile);
-
-if a<>a2 then pause, end