00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "Python.h"
00032 #include "structmember.h"
00033
00034 #include "StoreTracer.h"
00035 #include "simlpy/interpreter_hooks.h"
00036 #include "simlpy/Clock.h"
00037
00038 #include <iostream>
00039 #include <fstream>
00040
00101 #ifndef PyMODINIT_FUNC
00104 #define PyMODINIT_FUNC extern "C" void
00105 #endif
00106
00108 static StoreTracer* store_tracer = 0;
00109
00113 static char storetrace_setup_doc[] = "Storage tracing configuration.\n\
00114 \n\
00115 This method should be called before creating any nodes if\n\
00116 storage tracing is desired.\n\
00117 \n\
00118 Calling syntax:\n\
00119 \n\
00120 pydtn.storetrace.setup(<fname>)\n\
00121 \n\
00122 <fname> is either a filename or one of 'stdout' or 'stderr'.\n\
00123 In the former case, the storage tracing information is written\n\
00124 to the file named. In the latter cases, the information is\n\
00125 written to the appropriate stream.\n";
00126
00134 static PyObject*
00135 storetrace_setup( PyObject* self, PyObject* args )
00136 {
00137 if ( 0 != store_tracer )
00138 {
00139 std::cerr << "storage tracing already enabled" << std::endl;
00140 return 0;
00141 }
00142
00143 const char* fname;
00144 if ( ! PyArg_ParseTuple(args, "s", &fname) )
00145 {
00146 std::cerr << "Incorrect argument list" << std::endl;
00147 return 0;
00148 }
00149 std::string fnstr( fname );
00150 GlobalTracer::enable();
00151 GlobalTracer* gt = GlobalTracer::instance();
00152 if ( 0 == gt )
00153 {
00154 std::cerr << "Could not instantiate the global tracer" << std::endl;
00155 return 0;
00156 }
00157
00158 if ( "stdout" == fnstr )
00159 {
00160 store_tracer = new StoreTracer( std::cout );
00161 }
00162 else if ( "stderr" == fnstr )
00163 {
00164 store_tracer = new StoreTracer( std::cerr );
00165 }
00166 else
00167 {
00168 store_tracer = new StoreTracer( *(new std::ofstream(fname)) );
00169 }
00170 gt->addTracer(store_tracer);
00171
00172 Py_INCREF(Py_None);
00173 return Py_None;
00174 }
00175
00178 static PyMethodDef ExampleMethods[] =
00179 {
00180 {"setup",storetrace_setup,METH_VARARGS,storetrace_setup_doc},
00181 {0,0,0,0}
00182 };
00183
00187 PyMODINIT_FUNC
00188 init_storetrace(void)
00189 {
00190 (void) Py_InitModule("_storetrace",ExampleMethods);
00191 }
00192