00001 #include "PythonCCS.h"
00002
00003
00004
00005
00006 CtvDeclare(PyObject *, pythonReturnValue);
00007
00008 CProxy_PythonCCS pythonCcsProxy;
00009
00010 #if 0
00011 #define CkPythonDebugf CkPrintf
00012 #else
00013 void CkPythonDebugf(const char *fmt, ...) {
00014
00015 }
00016 #endif
00017
00018
00019
00020 static PyObject *CkPy_printstr(PyObject *self, PyObject *args) {
00021 char *stringToPrint;
00022 if (!PyArg_ParseTuple(args, "s:printstr", &stringToPrint)) return NULL;
00023 CkPrintf("%s\n",stringToPrint);
00024 Py_INCREF(Py_None);return Py_None;
00025 }
00026
00027
00028
00029 static inline void Ck_printclient(PythonObject *object, CmiUInt4 ref, const char* str) {
00030
00031 PythonStruct &worker = object->pyWorkers[ref];
00032
00033
00034 if (worker.clientReady > 0) {
00035
00036
00037
00038
00039 CcsSendDelayedReply(worker.client, strlen(str), str);
00040 worker.printed.erase();
00041 worker.clientReady = 0;
00042 } else {
00043
00044 if (worker.isKeepPrint) {
00045 worker.printed += std::string(str);
00046 }
00047
00048 }
00049
00050 }
00051
00052 static PyObject *CkPy_print(PyObject *self, PyObject *args) {
00053 char *stringToPrint;
00054 CkPythonDebugf("-1\n");
00055 if (!PyArg_ParseTuple(args, "s:printclient", &stringToPrint)) {
00056 CkPrintf("CkPy_print returning abnormally!\n");
00057 return NULL;
00058 }
00059 CkPythonDebugf("zero\n");
00060 PyObject *dict = PyModule_GetDict(PyImport_AddModule("__main__"));
00061 CkPythonDebugf("uno\n");
00062 CmiUInt4 pyReference = PyInt_AsLong(PyDict_GetItemString(dict,"__charmNumber__"));
00063 CkPythonDebugf("due\n");
00064 PythonObject *object = (PythonObject*)PyLong_AsVoidPtr(PyDict_GetItemString(dict,"__charmObject__"));
00065 CkPythonDebugf("calling Ck_printclient\n");
00066 Ck_printclient(object, pyReference, stringToPrint);
00067 CkPythonDebugf("CkPy_print returning normally\n");
00068 Py_INCREF(Py_None);return Py_None;
00069 }
00070
00071 static PyObject *CkPy_mype(PyObject *self, PyObject *args) {
00072 if (!PyArg_ParseTuple(args, ":mype")) return NULL;
00073 return Py_BuildValue("i", CkMyPe());
00074 }
00075
00076 static PyObject *CkPy_numpes(PyObject *self, PyObject *args) {
00077 if (!PyArg_ParseTuple(args, ":numpes")) return NULL;
00078 return Py_BuildValue("i", CkNumPes());
00079 }
00080
00081 static PyObject *CkPy_myindex(PyObject *self, PyObject *args) {
00082 if (!PyArg_ParseTuple(args, ":myindex")) return NULL;
00083 PyObject *dict = PyModule_GetDict(PyImport_AddModule("__main__"));
00084 CmiUInt4 pyReference = PyInt_AsLong(PyDict_GetItemString(dict,"__charmNumber__"));
00085 PythonObject *object = (PythonObject*)PyLong_AsVoidPtr(PyDict_GetItemString(dict,"__charmObject__"));
00086
00087 ArrayElement1D *pyArray1 = dynamic_cast<ArrayElement1D*>(object);
00088 ArrayElement2D *pyArray2 = dynamic_cast<ArrayElement2D*>(object);
00089 ArrayElement3D *pyArray3 = dynamic_cast<ArrayElement3D*>(object);
00090 ArrayElement4D *pyArray4 = dynamic_cast<ArrayElement4D*>(object);
00091 ArrayElement5D *pyArray5 = dynamic_cast<ArrayElement5D*>(object);
00092 ArrayElement6D *pyArray6 = dynamic_cast<ArrayElement6D*>(object);
00093
00094 if (pyArray1) return Py_BuildValue("(i)", pyArray1->thisIndex);
00095 else if (pyArray2) return Py_BuildValue("(ii)", pyArray2->thisIndex.x, pyArray2->thisIndex.y);
00096 else if (pyArray3) return Py_BuildValue("(iii)", pyArray3->thisIndex.x, pyArray3->thisIndex.y, pyArray3->thisIndex.z);
00097 else if (pyArray4) return Py_BuildValue("(iiii)", pyArray4->thisIndex.w, pyArray4->thisIndex.x, pyArray4->thisIndex.y, pyArray4->thisIndex.z);
00098 else if (pyArray5) return Py_BuildValue("(iiiii)", pyArray5->thisIndex.v, pyArray5->thisIndex.w, pyArray5->thisIndex.x, pyArray5->thisIndex.y, pyArray5->thisIndex.z);
00099 else if (pyArray6) return Py_BuildValue("(iiiiii)", pyArray6->thisIndex.x1, pyArray6->thisIndex.y1, pyArray6->thisIndex.z1, pyArray6->thisIndex.x2, pyArray6->thisIndex.y2, pyArray6->thisIndex.z2);
00100 else { Py_INCREF(Py_None);return Py_None;}
00101
00102 }
00103
00104
00105 static PyObject *CkPy_read(PyObject *self, PyObject *args) {
00106 if (!PyArg_ParseTuple(args, "O:read")) return NULL;
00107 PyObject *dict = PyModule_GetDict(PyImport_AddModule("__main__"));
00108 CmiUInt4 pyReference = PyInt_AsLong(PyDict_GetItemString(dict,"__charmNumber__"));
00109 PythonObject *object = (PythonObject*)PyLong_AsVoidPtr(PyDict_GetItemString(dict,"__charmObject__"));
00110
00111
00112 return object->read(args);
00113 }
00114
00115
00116 static PyObject *CkPy_write(PyObject *self, PyObject *args) {
00117 PyObject *where, *what;
00118 if (!PyArg_ParseTuple(args, "OO:write",&where,&what)) return NULL;
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128 PyObject *whereT, *whatT;
00129 if (PyTuple_Check(where)) whereT = where;
00130 else {
00131 whereT = PyTuple_New(1);
00132 PyTuple_SET_ITEM(whereT, 0, where);
00133 }
00134 if (PyTuple_Check(what)) whatT = what;
00135 else {
00136 whatT = PyTuple_New(1);
00137 PyTuple_SET_ITEM(whatT, 0, what);
00138 }
00139 PyObject *dict = PyModule_GetDict(PyImport_AddModule("__main__"));
00140 CmiUInt4 pyReference = PyInt_AsLong(PyDict_GetItemString(dict,"__charmNumber__"));
00141 PythonObject *object = (PythonObject*)PyLong_AsVoidPtr(PyDict_GetItemString(dict,"__charmObject__"));
00142 object->write(whereT, whatT);
00143 Py_DECREF(whereT);
00144 Py_DECREF(whatT);
00145 Py_INCREF(Py_None);return Py_None;
00146 }
00147
00148 PyMethodDef PythonObject::CkPy_MethodsCustom[] = {
00149 {NULL, NULL}
00150 };
00151
00152 const char* PythonObject::CkPy_MethodsCustomDoc = "";
00153
00154 PyMethodDef CkPy_MethodsDefault[] = {
00155 {"printstr", CkPy_printstr, METH_VARARGS},
00156 {"printclient", CkPy_print, METH_VARARGS},
00157 {"mype", CkPy_mype, METH_VARARGS},
00158 {"numpes", CkPy_numpes, METH_VARARGS},
00159 {"myindex", CkPy_myindex, METH_VARARGS},
00160 {"read", CkPy_read, METH_VARARGS},
00161 {"write", CkPy_write, METH_VARARGS},
00162 {NULL, NULL}
00163 };
00164
00165 void PythonObject::replyIntValue(PythonObject *obj, CcsDelayedReply *reply, CmiUInt4 *value) {
00166 CkPythonDebugf("[%d] PythonObject::replyIntValue\n",CkMyPe());
00167 PythonReplyInt forward;
00168 forward.reply = *reply;
00169 forward.value = *value;
00170 CkCallback cb(CkIndex_PythonCCS::forwardInt(0), pythonCcsProxy);
00171 ArrayElement *array = dynamic_cast<ArrayElement *>(obj);
00172 Group *group = dynamic_cast<Group *>(obj);
00173 if (array != NULL) array->contribute(sizeof(PythonReplyInt), &forward, CkReduction::bitvec_and, cb);
00174 else if (group != NULL) group->contribute(sizeof(PythonReplyInt), &forward, CkReduction::bitvec_and, cb);
00175 else CcsSendDelayedReply(*reply, sizeof(CmiUInt4), (void *)value);
00176 }
00177
00178 void PythonObject::pyRequest (CkCcsRequestMsg *msg) {
00179 PythonAbstract *pyAbstract = (PythonAbstract *)msg->data;
00180 pyAbstract->unpack();
00181
00182 if (pyAbstract->isExecute()) {
00183 execute(msg, &msg->reply);
00184
00185
00186
00187 } else if (pyAbstract->isPrint()) {
00188 print((PythonPrint *)msg->data, &msg->reply);
00189 delete msg;
00190 } else if (pyAbstract->isFinished()) {
00191 finished((PythonFinished *)msg->data, &msg->reply);
00192 delete msg;
00193 } else {
00194 CkPrintf("Wrong request arrived!\n");
00195 delete msg;
00196 }
00197 }
00198
00199
00200 void PythonObject::print (PythonPrint *pyMsg, CcsDelayedReply *reply) {
00201
00202
00203 CmiUInt4 returnValue;
00204 pyMsg->unpack();
00205
00206 PythonTable::iterator iter = pyWorkers.find(pyMsg->interpreter);
00207 if (iter == pyWorkers.end()) {
00208
00209
00210
00211 returnValue = htonl(0);
00212 replyIntFn(this, reply, &returnValue);
00213 } else {
00214
00215
00216 if (pyMsg->isKill()) {
00217
00218 if (iter->second.clientReady == 1) {
00219 returnValue = htonl(0);
00220 replyIntFn(this, &iter->second.client, &returnValue);
00221 }
00222
00223
00224 CcsNoDelayedReply(*reply);
00225 return;
00226 }
00227
00228
00229 if (iter->second.printed.length() > 0) {
00230
00231 const char *str = iter->second.printed.c_str();
00232 int length = strlen(str);
00233
00234 PythonReplyString *forward = new (length) PythonReplyString();
00235 forward->reply = *reply;
00236 memcpy(forward->data, str, length);
00237 CkCallback cb(CkIndex_PythonCCS::forwardString(0), pythonCcsProxy);
00238 ArrayElement *array = dynamic_cast<ArrayElement *>(this);
00239 Group *group = dynamic_cast<Group *>(this);
00240 if (array != NULL) array->contribute(sizeof(CcsDelayedReply)+length, forward, PythonCCS::reduceString, cb);
00241 else if (group != NULL) group->contribute(sizeof(CcsDelayedReply)+length, forward, PythonCCS::reduceString, cb);
00242 else CcsSendDelayedReply(*reply, length, str);
00243 iter->second.printed.erase();
00244 if (iter->second.clientReady == -1) {
00245
00246 pyWorkers.erase(pyMsg->interpreter);
00247 }
00248 } else {
00249
00250 if (pyMsg->isWait()) {
00251
00252 if (iter->second.clientReady == 1) {
00253 returnValue = htonl(0);
00254 replyIntFn(this, &iter->second.client, &returnValue);
00255 }
00256 iter->second.client = *reply;
00257 iter->second.clientReady = 1;
00258 } else {
00259
00260 returnValue = htonl(0);
00261 replyIntFn(this, reply, &returnValue);
00262 }
00263 }
00264
00265 }
00266 }
00267
00268 void PythonObject::finished (PythonFinished *pyMsg, CcsDelayedReply *reply) {
00269
00270
00271 CmiUInt4 pyReference = pyMsg->interpreter;
00272 CmiUInt4 returnValue;
00273 pyMsg->unpack();
00274
00275 PythonTable::iterator iter = pyWorkers.find(pyMsg->interpreter);
00276 if (iter == pyWorkers.end() || !iter->second.inUse) {
00277
00278 returnValue = htonl(pyReference);
00279 replyIntFn(this, reply, &returnValue);
00280
00281 return;
00282 }
00283
00284
00285 if (pyMsg->isWait()) {
00286
00287 if (iter->second.finishReady) {
00288
00289 returnValue = htonl(0);
00290 replyIntFn(this, &iter->second.finish, &returnValue);
00291 }
00292
00293 iter->second.finish = *reply;
00294 iter->second.finishReady = 1;
00295 } else {
00296
00297 returnValue = htonl(0);
00298 replyIntFn(this, reply, &returnValue);
00299 }
00300
00301 }
00302
00303 void PythonObject::execute (CkCcsRequestMsg *msg, CcsDelayedReply *reply) {
00304
00305 PythonExecute *pyMsg = (PythonExecute *)msg->data;
00306
00307
00308
00309
00310 pyMsg->unpack();
00311
00312 double _startTime = CkWallTimer();
00313 CmiUInt4 pyReference = prepareInterpreter(pyMsg);
00314 ckout<<"Python creation time "<<CmiWallTimer()-_startTime<<endl;
00315
00316 CmiUInt4 returnValue;
00317
00318 if (pyReference == 0) {
00319 returnValue = htonl(0);
00320 replyIntFn(this, reply, &returnValue);
00321 return;
00322 }
00323
00324 pyWorkers[pyReference].inUse = true;
00325
00326
00327
00328
00329
00330
00331 if (pyMsg->isWait()) {
00332 pyWorkers[pyReference].finish = *reply;
00333 pyWorkers[pyReference].finishReady = 1;
00334 } else {
00335 pyWorkers[pyReference].finishReady = 0;
00336
00337 ckout<<"new interpreter created "<<pyReference<<endl;
00338 returnValue = htonl(pyReference);
00339 replyIntFn(this, reply, &returnValue);
00340 }
00341
00342
00343 if (pyMsg->isHighLevel()) {
00344 CthResume(CthCreate((CthVoidFn)_callthr_executeThread, new CkThrCallArg(msg,this), 0));
00345
00346 } else {
00347 executeThread(pyMsg);
00348
00349 delete msg;
00350 }
00351 }
00352
00361 int PythonObject::prepareInterpreter(PythonExecute *pyMsg) {
00362 CmiUInt4 pyReference;
00363
00364 if (pyMsg->interpreter > 0) {
00365
00366 PythonTable::iterator iter;
00367 if ((iter=pyWorkers.find(pyMsg->interpreter))!=pyWorkers.end() && !iter->second.inUse && iter->second.clientReady!=-1) {
00368
00369
00370 pyReference = pyMsg->interpreter;
00371 PyEval_AcquireLock();
00372 PyThreadState_Swap(iter->second.pythread);
00373 CkPythonDebugf("Status 0 %p\n",PyErr_Occurred());
00374 } else {
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384 return 0;
00385 }
00386 } else {
00387
00388
00389
00390
00391 pyReference = ++pyNumber;
00392 pyNumber &= ~(1<<31);
00393
00394 pyWorkers[pyReference].clientReady = 0;
00395
00396
00397 PyEval_AcquireLock();
00398 PyThreadState *pts = Py_NewInterpreter();
00399
00400 CkAssert(pts != NULL);
00401 pyWorkers[pyReference].pythread = pts;
00402 pyWorkers[pyReference].inUse = false;
00403
00404 Py_InitModule("ck", CkPy_MethodsDefault);
00405 if (pyMsg->isHighLevel()) Py_InitModule("charm", getMethods());
00406
00407
00408 PyObject *mod = PyImport_AddModule("__main__");
00409 PyObject *dict = PyModule_GetDict(mod);
00410
00411 PyDict_SetItemString(dict,"__charmNumber__",PyInt_FromLong(pyReference));
00412 PyDict_SetItemString(dict,"__charmObject__",PyLong_FromVoidPtr(this));
00413 PyRun_String("import ck\nimport sys\n"
00414 "ck.__doc__ = \"Ck module: basic charm routines\\n"
00415 "printstr(str) -- print a string on the server\\n"
00416 "printclient(str) -- print a string on the client\\n"
00417 "mype() -- return an integer for MyPe()\\n"
00418 "numpes() -- return an integer for NumPes()\\n"
00419 "myindex() -- return a tuple containing the array index (valid only for arrays)\\n"
00420 "read(where) -- read a value on the chare (uses the \\\"read\\\" method of the chare)\\n"
00421 "write(where, what) -- write a value back on the chare (uses the \\\"write\\\" method of the chare)\\n\"",
00422 Py_file_input,dict,dict);
00423 if (pyMsg->isHighLevel()) {
00424 PyRun_String("import charm",Py_file_input,dict,dict);
00425 PyRun_String(getMethodsDoc(),Py_file_input,dict,dict);
00426 }
00427
00428 PyRun_String("class __charmOutput__:\n"
00429 " def __init__(self, stdout):\n"
00430 " self.stdout = stdout\n"
00431 " def write(self, s):\n"
00432 " ck.printclient(s)\n"
00433 "sys.stdout = __charmOutput__(sys.stdout)"
00434 ,Py_file_input,dict,dict);
00435
00436 }
00437
00438 if (pyMsg->isKeepPrint()) {
00439 pyWorkers[pyReference].isKeepPrint = true;
00440 } else {
00441 pyWorkers[pyReference].isKeepPrint = false;
00442 }
00443
00444 return pyReference;
00445 }
00446
00447 std::string getTraceback() {
00448 std::string result;
00449 PyObject *exception, *v, *traceback;
00450 PyErr_Fetch(&exception, &v, &traceback);
00451 PyErr_NormalizeException(&exception, &v, &traceback);
00452
00453
00454
00455
00456
00457 PyObject* tbstr = PyString_FromString("traceback");
00458 PyObject* tbmod = PyImport_Import(tbstr);
00459 if (!tbmod)
00460 return NULL;
00461 PyObject* tbdict = PyModule_GetDict(tbmod);
00462 PyObject* formatFunc = PyDict_GetItemString(tbdict,
00463 "format_exception");
00464 if (!formatFunc)
00465 return NULL;
00466 if (!traceback) {
00467 traceback = Py_None;
00468 Py_INCREF(Py_None);
00469 }
00470 PyObject* args = Py_BuildValue("(OOO)", exception, v, traceback);
00471 PyObject* lst = PyObject_CallObject(formatFunc, args);
00472
00473 for (int i=0; i<PyList_GET_SIZE(lst); i++) {
00474 result += PyString_AsString(PyList_GetItem(lst, i));
00475 }
00476
00477 Py_DECREF(args);
00478 Py_DECREF(lst);
00479 return result;
00480 }
00481
00482
00483
00484
00485 void PythonObject::_callthr_executeThread(CkThrCallArg *impl_arg) {
00486 CkCcsRequestMsg *impl_msg = (CkCcsRequestMsg*)impl_arg->msg;
00487 PythonObject *impl_obj = (PythonObject *) impl_arg->obj;
00488 delete impl_arg;
00489
00490 impl_obj->executeThread((PythonExecute*)impl_msg->data);
00491 delete impl_msg;
00492 }
00493
00494 void PythonObject::executeThread(PythonExecute *pyMsg) {
00495
00496
00497 PyThreadState *mine = PyThreadState_Get();
00498 PyObject *dict = PyModule_GetDict(PyImport_AddModule("__main__"));
00499 CmiUInt4 pyReference = PyInt_AsLong(PyDict_GetItemString(dict,"__charmNumber__"));
00500
00501 CkPythonDebugf("Status 1 %p\n",PyErr_Occurred());
00502
00503 if (pyMsg->isHighLevel()) {
00504
00505 pyWorkers[pyReference].thread=CthSelf();
00506
00507 }
00508
00509
00510 if (!pyMsg->isIterate()) {
00511 double _startTime = CmiWallTimer();
00512 PyObject* python_output = PyRun_String(pyMsg->code.code, Py_file_input, dict, dict);
00513 ckout<<"Python execution time "<<CmiWallTimer()-_startTime<<endl;
00514
00515
00516 if (python_output == NULL) {
00517
00518 PyObject *ptype, *pvalue, *ptraceback;
00519 PyErr_Fetch(&ptype, &pvalue, &ptraceback);
00520 PyObject *strP = PyObject_Str(ptype);
00521 char *str = PyString_AsString(strP);
00522 Ck_printclient(this, pyReference, str);
00523
00524 Py_DECREF(strP);
00525 Ck_printclient(this, pyReference, ": ");
00526 strP = PyObject_Str(pvalue);
00527 str = PyString_AsString(strP);
00528 Ck_printclient(this, pyReference, str);
00529
00530 Py_DECREF(strP);
00531
00532
00533
00534
00535
00536
00537 }
00538 } else {
00539
00540 CkPythonDebugf("userCode: |%s|",pyMsg->code);
00541 CkPythonDebugf("method: |%s|",pyMsg->methodName.methodName);
00542
00543 char *userMethod = pyMsg->methodName.methodName;
00544 PyObject *mod = PyImport_AddModule("__main__");
00545 PyObject *dict = PyModule_GetDict(mod);
00546 PyObject *item = PyDict_GetItemString(dict, userMethod);
00547 struct _node *programNode = NULL;
00548 PyCodeObject *program = NULL;
00549 PyObject *code = NULL;
00550 if (item == NULL) {
00551 CkPythonDebugf("Could not find the requested method\n");
00552
00553 char *userCode = pyMsg->code.code;
00554 programNode = PyParser_SimpleParseString(userCode, Py_file_input);
00555 if (programNode==NULL) {
00556 CkPrintf("Program Parse Error\n");
00557
00558 cleanup(pyMsg, mine, pyReference);
00559 return;
00560 }
00561 program = PyNode_Compile(programNode, "");
00562 if (program==NULL) {
00563 CkPrintf("Program Compile Error\n");
00564 PyNode_Free(programNode);
00565
00566 cleanup(pyMsg, mine, pyReference);
00567 return;
00568 }
00569 code = PyEval_EvalCode(program, dict, dict);
00570 if (code==NULL) {
00571 CkPrintf("Program Eval Error\n");
00572 PyNode_Free(programNode);
00573 Py_DECREF(program);
00574
00575 cleanup(pyMsg, mine, pyReference);
00576 return;
00577 }
00578
00579
00580 char *userMethod = pyMsg->methodName.methodName;
00581 item = PyDict_GetItemString(dict, userMethod);
00582 if (item==NULL) {
00583 CkPrintf("Method not found\n");
00584 PyNode_Free(programNode);
00585 Py_DECREF(program);
00586 Py_DECREF(code);
00587
00588 cleanup(pyMsg, mine, pyReference);
00589 return;
00590 }
00591
00592
00593
00594 PyRun_String("class CharmContainer:\n\tpass\n\n", Py_file_input, dict, dict);
00595 }
00596 CkPythonDebugf("Item: %d %d %d\n",PyFunction_Check(item),PyMethod_Check(item),PyCallable_Check(item));
00597
00598
00599 CkPythonDebugf("Status 2 %p\n",PyErr_Occurred());
00600 PyObject *part = PyRun_String("CharmContainer()", Py_eval_input, dict, dict);
00601 if (part == NULL) {
00602 CkPythonDebugf("Allocate oldArg null: error=%d\n",PyErr_Occurred());
00603 PyErr_Clear();
00604 PyRun_String("class CharmContainer:\n\tpass\n\n", Py_file_input, dict, dict);
00605 }
00606 part = PyRun_String("CharmContainer()", Py_eval_input, dict, dict);
00607 CkPythonDebugf("Allocate oldArg=%p\n",part);
00608 PyObject *arg = PyTuple_New(1);
00609 PyObject *oldArg = part;
00610
00611 double _startTime = CmiWallTimer();
00612
00613 PythonIterator *userIterator = pyMsg->info.info;
00614 int more = buildIterator(part, userIterator);
00615 CkPythonDebugf("Executing iterative: %p %p %p %d\n",item,part,oldArg,more);
00616 if (oldArg != part) Py_DECREF(oldArg);
00617 PyTuple_SetItem(arg, 0, part);
00618
00619
00620 PyObject *result;
00621
00622 CkPythonDebugf("Errors: %p %p %p %p %p\n%p %p %p %p %p\n%p %p %p %p %p\n%p %p %p %p %p\n%p %p %p %p %p\n",
00623 PyExc_Exception, PyExc_StandardError, PyExc_ArithmeticError, PyExc_LookupError, PyExc_AssertionError,
00624 PyExc_AttributeError, PyExc_EOFError, PyExc_EnvironmentError, PyExc_FloatingPointError, PyExc_IOError,
00625 PyExc_ImportError, PyExc_IndexError, PyExc_KeyError, PyExc_NameError, PyExc_NotImplementedError,
00626 PyExc_OSError, PyExc_OverflowError, PyExc_ReferenceError, PyExc_RuntimeError, PyExc_SyntaxError,
00627 PyExc_SystemError, PyExc_SystemExit, PyExc_TypeError, PyExc_ValueError, PyExc_ZeroDivisionError);
00628
00629 while (more) {
00630 CkPythonDebugf("Status in 0 %p\n",PyErr_Occurred());
00631 result = PyObject_CallObject(item, arg);
00632 CkPythonDebugf("Status in 1 %p\n",PyErr_Occurred());
00633 if (PyErr_Occurred() != 0) {
00634
00635
00636 PyObject *exception, *v, *traceback, *tmp;
00637 PyErr_Fetch(&exception, &v, &traceback);
00638 PyErr_NormalizeException(&exception, &v, &traceback);
00639 CkPrintf("%s\n",PyString_AsString(tmp=PyObject_Repr(exception)));
00640 Py_DECREF(tmp);
00641 CkPrintf("%s\n",PyString_AsString(tmp=PyObject_Repr(v)));
00642 Py_DECREF(tmp);
00643 CkPrintf("%s\n",PyString_AsString(tmp=PyObject_Repr(traceback)));
00644 Py_DECREF(tmp);
00645 CkPrintf("%s\n",PyString_AsString(tmp=PyObject_Str(exception)));
00646 Py_DECREF(tmp);
00647 CkPrintf("%s\n",PyString_AsString(tmp=PyObject_Str(v)));
00648 Py_DECREF(tmp);
00649 CkPrintf("%s\n",PyString_AsString(tmp=PyObject_Str(traceback)));
00650 Py_DECREF(tmp);
00651 if (exception!=NULL) Py_DECREF(exception);
00652 if (v!=NULL) Py_DECREF(v);
00653 if (traceback!=NULL) Py_DECREF(traceback);
00654 }
00655 if (!result) {
00656 CkPrintf("Python Call error\n");
00657
00658 break;
00659 }
00660 oldArg = part;
00661 more = nextIteratorUpdate(part, result, userIterator);
00662 CkPythonDebugf("Status in 2 %p\n",PyErr_Occurred());
00663 if (oldArg != part) {
00664 Py_DECREF(oldArg);
00665 PyTuple_SetItem(arg, 0, part);
00666 }
00667 Py_DECREF(result);
00668 CkPythonDebugf("Status in 3 %p\n",PyErr_Occurred());
00669 }
00670 CkPythonDebugf("Python iterative execution time %lf\n",CmiWallTimer()-_startTime);
00671
00672 Py_DECREF(part);
00673 Py_DECREF(arg);
00674
00675
00676
00677
00678 }
00679 CkPythonDebugf("Status 3 %p\n",PyErr_Occurred());
00680
00681 cleanup(pyMsg, mine, pyReference);
00682
00683 }
00684
00685
00686
00687 void PythonObject::cleanup (PythonExecute *pyMsg, PyThreadState *pts, CmiUInt4 pyReference) {
00688 CmiUInt4 returnValue;
00689
00690
00691
00692
00693 if (pyWorkers[pyReference].finishReady) {
00694
00695 returnValue = htonl(pyReference);
00696 replyIntFn(this, &pyWorkers[pyReference].finish, &returnValue);
00697 pyWorkers[pyReference].finishReady = 0;
00698 }
00699
00700
00701 pyWorkers[pyReference].inUse = false;
00702 if (!pyMsg->isPersistent()) {
00703 PyErr_Clear();
00704 Py_EndInterpreter(pts);
00705 pyWorkers[pyReference].clientReady = -1;
00706 } else {
00707 PyErr_Clear();
00708 }
00709 PyEval_ReleaseLock();
00710
00711 if (!pyMsg->isPersistent() && pyWorkers[pyReference].printed.length()==0) {
00712
00713
00714 pyWorkers.erase(pyReference);
00715 }
00716
00717 }
00718
00719 void PythonObject::getPrint(CkCcsRequestMsg *msg) {
00720
00721 }
00722
00723
00724 void PythonObject::pythonSetString(PyObject *arg, char *descr, char *value) {
00725 PyObject *tmp = PyString_FromString(value);
00726 PyObject_SetAttrString(arg, descr, tmp);
00727 Py_DECREF(tmp);
00728 }
00729
00730 void PythonObject::pythonSetString(PyObject *arg, char *descr, char *value, int len) {
00731 PyObject *tmp = PyString_FromStringAndSize(value, len);
00732 PyObject_SetAttrString(arg, descr, tmp);
00733 Py_DECREF(tmp);
00734 }
00735
00736 void PythonObject::pythonGetString(PyObject *arg, char *descr, char **result) {
00737 PyObject *tmp = PyObject_GetAttrString(arg, descr);
00738 *result = PyString_AsString(tmp);
00739 Py_DECREF(tmp);
00740 }
00741
00742 void PythonObject::pythonSetInt(PyObject *arg, char *descr, long value) {
00743 PyObject *tmp = PyInt_FromLong(value);
00744 PyObject_SetAttrString(arg, descr, tmp);
00745 Py_DECREF(tmp);
00746 }
00747
00748 void PythonObject::pythonGetInt(PyObject *arg, char *descr, long *result) {
00749 PyObject *tmp = PyObject_GetAttrString(arg, descr);
00750 *result = PyInt_AsLong(tmp);
00751 Py_DECREF(tmp);
00752 }
00753
00754 void PythonObject::pythonSetLong(PyObject *arg, char *descr, long value) {
00755 PyObject *tmp = PyLong_FromLong(value);
00756 PyObject_SetAttrString(arg, descr, tmp);
00757 Py_DECREF(tmp);
00758 }
00759
00760 void PythonObject::pythonSetLong(PyObject *arg, char *descr, unsigned long value) {
00761 PyObject *tmp = PyLong_FromUnsignedLong(value);
00762 PyObject_SetAttrString(arg, descr, tmp);
00763 Py_DECREF(tmp);
00764 }
00765
00766 void PythonObject::pythonSetLong(PyObject *arg, char *descr, double value) {
00767 PyObject *tmp = PyLong_FromDouble(value);
00768 PyObject_SetAttrString(arg, descr, tmp);
00769 Py_DECREF(tmp);
00770 }
00771
00772 void PythonObject::pythonGetLong(PyObject *arg, char *descr, long *result) {
00773 PyObject *tmp = PyObject_GetAttrString(arg, descr);
00774 *result = PyLong_AsLong(tmp);
00775 Py_DECREF(tmp);
00776 }
00777
00778 void PythonObject::pythonGetLong(PyObject *arg, char *descr, unsigned long *result) {
00779 PyObject *tmp = PyObject_GetAttrString(arg, descr);
00780 *result = PyLong_AsUnsignedLong(tmp);
00781 Py_DECREF(tmp);
00782 }
00783
00784 void PythonObject::pythonGetLong(PyObject *arg, char *descr, double *result) {
00785 PyObject *tmp = PyObject_GetAttrString(arg, descr);
00786 *result = PyLong_AsDouble(tmp);
00787 Py_DECREF(tmp);
00788 }
00789
00790 void PythonObject::pythonSetFloat(PyObject *arg, char *descr, double value) {
00791 PyObject *tmp = PyFloat_FromDouble(value);
00792 PyObject_SetAttrString(arg, descr, tmp);
00793 Py_DECREF(tmp);
00794 }
00795
00796 void PythonObject::pythonGetFloat(PyObject *arg, char *descr, double *result) {
00797 PyObject *tmp = PyObject_GetAttrString(arg, descr);
00798 *result = PyFloat_AsDouble(tmp);
00799 Py_DECREF(tmp);
00800 }
00801
00802 void PythonObject::pythonSetComplex(PyObject *arg, char *descr, double real, double imag) {
00803 PyObject *tmp = PyComplex_FromDoubles(real, imag);
00804 PyObject_SetAttrString(arg, descr, tmp);
00805 Py_DECREF(tmp);
00806 }
00807
00808 void PythonObject::pythonGetComplex(PyObject *arg, char *descr, double *real, double *imag) {
00809 PyObject *tmp = PyObject_GetAttrString(arg, descr);
00810 *real = PyComplex_RealAsDouble(tmp);
00811 *imag = PyComplex_ImagAsDouble(tmp);
00812 Py_DECREF(tmp);
00813 }
00814
00815 void PythonObject::pythonSetPointer(PyObject *arg, char *descr, void *ptr) {
00816 PyObject *tmp = PyLong_FromVoidPtr(ptr);
00817 PyObject_SetAttrString(arg, descr, tmp);
00818 Py_DECREF(tmp);
00819 }
00820
00821 void PythonObject::pythonGetPointer(PyObject *arg, char *descr, void **ptr) {
00822 PyObject *tmp = PyObject_GetAttrString(arg, descr);
00823 *ptr = PyLong_AsVoidPtr(tmp);
00824 Py_DECREF(tmp);
00825 }
00826
00827 PyObject *PythonObject::pythonGetArg(int handle) {
00828
00829 PyObject *result = pyWorkers[handle].arg;
00830
00831 return result;
00832 }
00833
00834 void PythonObject::pythonReturn(int handle) {
00835
00836
00837
00838
00839
00840
00841
00842 }
00843
00844 void PythonObject::pythonReturn(int handle, PyObject* data) {
00845
00846
00847 * pyWorkers[handle].result = data;
00848
00849
00850 }
00851
00852 void PythonObject::pythonAwake(int handle) {
00853
00854
00855
00856
00857
00858 }
00859
00860 void PythonObject::pythonSleep(int handle) {
00861
00862 }
00863
00864 PythonCCS::PythonCCS(CkArgMsg *arg) {
00865 pythonCcsProxy = thishandle;
00866 delete arg;
00867 }
00868
00869 CkReductionMsg *pythonCombinePrint(int nMsg, CkReductionMsg **msgs) {
00870
00871
00872
00873 int length = - (nMsg-1) * sizeof(CcsDelayedReply);
00874 for (int i=0; i<nMsg; ++i) {
00875 length += msgs[i]->getSize();
00876 }
00877
00878 CkReductionMsg *result = CkReductionMsg::buildNew(length,NULL);
00879
00880 PythonReplyString *data = (PythonReplyString*)(result->getData());
00881 data->reply = ((PythonReplyString*)msgs[0]->getData())->reply;
00882 char *cur=data->data;
00883 for (int i=0; i<nMsg; ++i) {
00884 int messageBytes=msgs[i]->getSize() - sizeof(CcsDelayedReply);
00885 memcpy((void *)cur,(void *)((PythonReplyString*)msgs[i]->getData())->data,messageBytes);
00886 cur+=messageBytes;
00887 }
00888 return result;
00889 }
00890
00891 void PythonCCS::forwardString(CkReductionMsg *msg) {
00892 PythonReplyString *forward = (PythonReplyString *)msg->getData();
00893 CcsSendDelayedReply(forward->reply, msg->getSize()-sizeof(CcsDelayedReply), (void *)forward->data);
00894 }
00895
00896 void PythonCCS::forwardInt(CkReductionMsg *msg) {
00897 CkPythonDebugf("PythonCCS::forwardInt\n");
00898 PythonReplyInt *forward = (PythonReplyInt *)msg->getData();
00899 CcsSendDelayedReply(forward->reply, sizeof(CmiUInt4), (void *)&forward->value);
00900 }
00901
00902 CkReduction::reducerType PythonCCS::reduceString;
00903
00904 static void initializePythonDefault(void) {
00905
00906
00907
00908
00909
00910
00911 CtvInitialize(PyObject *,pythonReturnValue);
00912
00913 PythonCCS::reduceString = CkReduction::addReducer(pythonCombinePrint);
00914
00915 Py_Initialize();
00916 PyEval_InitThreads();
00917
00918 PyEval_ReleaseLock();
00919 }
00920
00921 #include "PythonCCS.def.h"