1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
/* Author: Lisandro Dalcin
* Contact: dalcinl@gmail.com
*/
#include <Python.h>
#ifdef __FreeBSD__
#include <floatingpoint.h>
#endif
#define MPICH_IGNORE_CXX_SEEK
#define OMPI_IGNORE_CXX_SEEK
#include <mpi.h>
#if PY_MAJOR_VERSION >= 3
#include <locale.h>
static wchar_t **args_copy = NULL;
static void Py3_Main_DelArgs(wchar_t **args)
{
int i = 0;
if (args_copy)
while (args_copy[i])
PyMem_Free(args_copy[i++]);
if (args_copy)
PyMem_Free(args_copy);
if (args)
PyMem_Free(args);
args_copy = NULL;
}
static wchar_t ** Py3_Main_GetArgs(int argc, char **argv)
{
int i;
wchar_t **args = NULL;
char *locsave = NULL;
args_copy = (wchar_t **)PyMem_Malloc((argc+1)*sizeof(wchar_t*));
args = (wchar_t **)PyMem_Malloc((argc+1)*sizeof(wchar_t*));
if (!args_copy || !args) {
fprintf(stderr, "out of memory\n");
goto fail;
}
for (i=0; i<argc; i++) {
args_copy[i] = args[i] = NULL;
}
args_copy[argc] = args[argc] = NULL;
locsave = setlocale(LC_ALL, NULL);
setlocale(LC_ALL, "");
for (i=0; i<argc; i++) {
size_t argsz, count;
argsz = strlen(argv[i]);
if (argsz == (size_t)-1) {
fprintf(stderr, "Could not convert argument %d to string\n", i);
goto fail;
}
args[i] = (wchar_t *)PyMem_Malloc((argsz+1)*sizeof(wchar_t));
if (!args[i]) {
fprintf(stderr, "out of memory\n");
goto fail;
}
args_copy[i] = args[i];
count = mbstowcs(args[i], argv[i], argsz+1);
if (count == (size_t)-1) {
fprintf(stderr, "Could not convert argument %d to string\n", i);
goto fail;
}
}
setlocale(LC_ALL, locsave);
return args;
fail:
Py3_Main_DelArgs(args);
return NULL;
}
static int Py3_Main(int argc, char **argv)
{
int sts = 0;
wchar_t **wargv = Py3_Main_GetArgs(argc, argv);
if (!wargv) sts = 1;
else sts = Py_Main(argc, wargv);
Py3_Main_DelArgs(wargv);
return sts;
}
#define Py_Main Py3_Main
#endif /* !(PY_MAJOR_VERSION >= 3) */
#define CHKIERR(ierr) if (ierr) return 2
static int PyMPI_Main(int argc, char **argv)
{
int sts=0, flag=0, ierr=0;
/* MPI Initalization */
ierr = MPI_Initialized(&flag); CHKIERR(ierr);
if (!flag) {
#if 0
int required = MPI_THREAD_MULTIPLE;
int provided = MPI_THREAD_SINGLE;
ierr = MPI_Init_thread(&argc, &argv,
required, &provided); CHKIERR(ierr);
#else
ierr = MPI_Init(&argc, &argv); CHKIERR(ierr);
#endif
}
/* Python main */
sts = Py_Main(argc, argv);
/* MPI finalization */
ierr = MPI_Finalized(&flag); CHKIERR(ierr);
if (!flag) {
ierr = MPI_Finalize(); CHKIERR(ierr);
}
/* return */
return sts;
}
int main(int argc, char **argv)
{
#ifdef __FreeBSD__
fp_except_t m;
m = fpgetmask();
fpsetmask(m & ~FP_X_OFL);
#endif
return PyMPI_Main(argc, argv);
}
/*
Local variables:
c-basic-offset: 2
indent-tabs-mode: nil
End:
*/
|