python_init.cc

00001 // Copyright 2008 Michael Marsh, University of Maryland.
00002 //
00003 // This file is part of pydtn.
00004 //
00005 // pydtn is free software: you can redistribute it and/or modify
00006 // it under the terms of the GNU General Public License as published by
00007 // the Free Software Foundation, either version 3 of the License, or
00008 // (at your option) any later version.
00009 //
00010 // pydtn is distributed in the hope that it will be useful,
00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013 // GNU General Public License for more details.
00014 //
00015 // You should have received a copy of the GNU General Public License
00016 // along with pydtn.  If not, see <http://www.gnu.org/licenses/>.
00017 //
00018 // The views and conclusions contained in the software and documentation
00019 // are those of the authors and should not be interpreted as representing
00020 // official policies, either expressed or implied, of the University
00021 // of Maryland.
00022 //
00023 // pydtn extends and embeds the Python interpreter, which is
00024 // Copyright 2001-2006 Python Software Foundation, All Rights Reserved,
00025 // and is released under the PSF License Agreement.
00026 //
00027 // RANLUX random number generation uses the Boost library,
00028 // Copyright 1994-2006 by various authors (details in individual files),
00029 // which is released under the Boost Software License, Version 1.0.
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 ); // This lets us use operator==.
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} // sentinel
00182 };
00183 
00187 PyMODINIT_FUNC
00188 init_storetrace(void)
00189 {
00190    (void) Py_InitModule("_storetrace",ExampleMethods);
00191 }
00192 

Generated on Mon Mar 24 11:15:45 2008 for Pydtn Simulator by  doxygen 1.5.4