File: python.c

package info (click to toggle)
paraview 3.14.1-6
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 234,468 kB
  • sloc: cpp: 2,166,013; ansic: 801,575; xml: 58,068; tcl: 49,247; python: 43,091; java: 16,625; fortran: 12,224; sh: 11,722; yacc: 5,688; perl: 3,128; makefile: 2,228; lex: 1,311; lisp: 486; asm: 471; pascal: 228
file content (149 lines) | stat: -rw-r--r-- 2,905 bytes parent folder | download | duplicates (2)
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:
*/