dd1b8200beaa757d3f82a48455e07166678dfea3
[scilab.git] / scilab / modules / mpi / sci_gateway / c / sci_mpi_wait.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2011-2011 - DIGITEO - Sylvestre LEDRU
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12 #include <stdio.h>
13 #include <mpi.h>
14 #include "api_scilab.h"
15 #include "gw_mpi.h"
16 #include "sci_mpi.h"
17 #include "Scierror.h"
18 #include "localization.h"
19 #include "MALLOC.h"
20 #include "serialization.h"
21 #include "deserialization.h"
22
23 int sci_mpi_wait(char *fname, unsigned long fname_len)
24 {
25     SciErr sciErr;
26     int iRet = 0;
27     int *piAddr = NULL;
28     int *piBuffer = NULL;
29     int iBufferSize = 0;
30     double NodeID = 0;
31     int iRequestID;
32     double dblRequestID;
33
34     CheckInputArgument(pvApiCtx, 1, 1);
35     CheckOutputArgument(pvApiCtx, 1, 1);
36
37     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
38     if (sciErr.iErr)
39     {
40         printError(&sciErr, 0);
41         Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1);
42         return 0;
43     }
44
45     if (getScalarDouble(pvApiCtx, piAddr, &dblRequestID))
46     {
47         Scierror(999, _("%s: Wrong type for input argument #%d: A scalar integer value expected.\n"), fname, 1);
48         return 0;
49     }
50
51     iRequestID = (int)dblRequestID;
52
53     if (iRequestID < 0)
54     {
55         Scierror(999, _("%s: Wrong values for input argument #%d: Positive value expected.\n"), fname, 1);
56         return 0;
57     }
58
59     iRet = MPI_Wait(&request[iRequestID], MPI_STATUS_IGNORE); /* TODO: MPI_COMM_WORLD should be changed */
60     if (iRet != MPI_SUCCESS)
61     {
62         char error_string[MPI_MAX_ERROR_STRING];
63         int length_of_error_string;
64
65         MPI_Error_string(iRet, error_string, &length_of_error_string);
66         Scierror(999, _("%s: Failed to wait %d: %s\n"), fname, NodeID, error_string);
67         return 0;
68     }
69
70     /* Restore the list */
71     piBuffer = listRequestPointer[iRequestID];
72     iBufferSize = listRequestPointerSize[iRequestID];
73
74     if (iBufferSize == 0)
75     {
76         //wait on sender not on receiver
77         AssignOutputVariable(pvApiCtx, 1) = 0;
78         ReturnArguments(pvApiCtx);
79         return 0;
80     }
81
82     iRet = deserialize_from_mpi(pvApiCtx, piBuffer, iBufferSize);
83     FREE(piBuffer);
84     if (iRet)
85     {
86         Scierror(999, _("%s: Unable to deserialize data!\n"), fname);
87         return 0;
88     }
89
90     AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;
91     ReturnArguments(pvApiCtx);
92     return 0;
93 }