diff options
| author | Vasilii Chernov <vchernov@inr.ru> | 2016-03-01 10:42:40 +0100 | 
|---|---|---|
| committer | Vasilii Chernov <vchernov@inr.ru> | 2016-03-01 10:42:40 +0100 | 
| commit | 5d775d64bdec554b9842823bd1c46263210425fd (patch) | |
| tree | cb1da12066687273f7dccace7aba4ee1ff2ba25c /pywrap | |
| parent | 0e584d07a0776454fd5487b7d23407c0624b56c2 (diff) | |
| download | pcitool-5d775d64bdec554b9842823bd1c46263210425fd.tar.gz pcitool-5d775d64bdec554b9842823bd1c46263210425fd.tar.bz2 pcitool-5d775d64bdec554b9842823bd1c46263210425fd.tar.xz pcitool-5d775d64bdec554b9842823bd1c46263210425fd.zip | |
1. multithreading:
   - Enable multiprocessing for api_server
   - Enable mutrithreading for html_server
2. py:
   - extract pcilib->py bases from pcilib->py functions
   - add api for interact directly with pcilib->py without pcilib context.
3. pcipywrap - Add scripts handling.
Diffstat (limited to 'pywrap')
| -rw-r--r-- | pywrap/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | pywrap/api_server.py (renamed from pywrap/server.py) | 147 | ||||
| -rw-r--r-- | pywrap/pcipywrap.c | 333 | ||||
| -rw-r--r-- | pywrap/pcipywrap.h | 15 | ||||
| -rw-r--r-- | pywrap/pcipywrap.i | 3 | 
5 files changed, 289 insertions, 211 deletions
| diff --git a/pywrap/CMakeLists.txt b/pywrap/CMakeLists.txt index b00fdb0..4f38354 100644 --- a/pywrap/CMakeLists.txt +++ b/pywrap/CMakeLists.txt @@ -25,6 +25,6 @@ install(TARGETS ${SWIG_MODULE_pcipywrap_REAL_NAME} DESTINATION ${PYTHON_SITE_PAC  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/pcipywrap.py DESTINATION ${PYTHON_SITE_PACKAGES})  if (NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) -    file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/server.py DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +    file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/api_server.py DESTINATION ${CMAKE_CURRENT_BINARY_DIR})      file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/test_pcipywrap.py DESTINATION ${CMAKE_CURRENT_BINARY_DIR})  endif(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) diff --git a/pywrap/server.py b/pywrap/api_server.py index b59ae55..da3a275 100644 --- a/pywrap/server.py +++ b/pywrap/api_server.py @@ -1,26 +1,20 @@ -import time  import os +import sys +  import pcipywrap + +import time  import json -import sys  from optparse import OptionParser +from multiprocessing import Process, current_process  from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler -from SocketServer import ThreadingMixIn -import threading - -pcilib = None - -class MultiThreadedHTTPServer(ThreadingMixIn, HTTPServer): -    pass  class PcilibServerHandler(BaseHTTPRequestHandler): -   locks = list() -   lock_global = 0 -   #def __init__(s, pcilib, *args): -   #   s.pcilib = pcilib -   #   BaseHTTPRequestHandler.__init__(s, *args) +   def __init__(s, pcilib, *args): +      s.pcilib = pcilib +      BaseHTTPRequestHandler.__init__(s, *args)     def do_HEAD(s):        s.send_response(200) @@ -73,7 +67,7 @@ class PcilibServerHandler(BaseHTTPRequestHandler):              registers = dict()              try: -               registers = pcilib.get_registers_list(bank) +               registers = s.pcilib.get_registers_list(bank)              except Exception as e:                 s.error(str(e), data)                  return @@ -101,7 +95,7 @@ class PcilibServerHandler(BaseHTTPRequestHandler):              register = dict()              try: -               register = pcilib.get_register_info(reg, bank) +               register = s.pcilib.get_register_info(reg, bank)              except Exception as e:                 s.error(str(e), data)                  return @@ -119,7 +113,7 @@ class PcilibServerHandler(BaseHTTPRequestHandler):              properties = dict()              try: -               properties = pcilib.get_property_list(branch) +               properties = s.pcilib.get_property_list(branch)              except Exception as e:                 s.error(str(e), data)                  return @@ -147,7 +141,7 @@ class PcilibServerHandler(BaseHTTPRequestHandler):              value = 0              try: -               value = pcilib.read_register(reg, bank) +               value = s.pcilib.read_register(reg, bank)              except Exception as e:                 s.error(str(e), data)                  return @@ -180,7 +174,7 @@ class PcilibServerHandler(BaseHTTPRequestHandler):  				   bank = str(bank)              try: -               pcilib.write_register(value, reg, bank) +               s.pcilib.write_register(value, reg, bank)              except Exception as e:                 s.error(str(e), data)                  return @@ -202,7 +196,7 @@ class PcilibServerHandler(BaseHTTPRequestHandler):              value = 0              try: -               value = pcilib.get_property(prop) +               value = s.pcilib.get_property(prop)              except Exception as e:                 s.error(str(e), data)                  return @@ -232,7 +226,7 @@ class PcilibServerHandler(BaseHTTPRequestHandler):              value = str(data.get('value', None))              try: -               pcilib.set_property(value, prop) +               s.pcilib.set_property(value, prop)              except Exception as e:                 s.error(str(e), data)                  return @@ -252,20 +246,11 @@ class PcilibServerHandler(BaseHTTPRequestHandler):              #parse command arguments and convert them to string              lock_id = str(data.get('lock_id')) -            #check if lock already setted -            #if lock_id in PcilibServerHandler.locks: -            #   s.error('Lock with id: ' + lock_id +  -            #           'already setted by this server', -            #           data) -            #   return -                          try: -               pcilib.lock(lock_id) +               s.pcilib.lock(lock_id)              except Exception as e:                 s.error(str(e), data)                  return -                -            PcilibServerHandler.locks.append(lock_id)              #Success! Create and send reply              s.wrapMessageAndSend({'status': 'ok'}, data) @@ -283,7 +268,7 @@ class PcilibServerHandler(BaseHTTPRequestHandler):              lock_id = str(data.get('lock_id'))              try: -               pcilib.try_lock(lock_id) +               s.pcilib.try_lock(lock_id)              except Exception as e:                 s.error(str(e), data)                  return @@ -295,24 +280,21 @@ class PcilibServerHandler(BaseHTTPRequestHandler):           elif(command == 'unlock'):              #check required arguments -            #if not 'lock_id' in data: -            #   s.error('message doesnt contains "lock_id" field, ' -            #           'which is required for "unlock" command', data) -            #   return +            if not 'lock_id' in data: +               s.error('message doesnt contains "lock_id" field, ' +                       'which is required for "unlock" command', data) +               return              #parse command arguments and convert them to string -            #lock_id = str(data.get('lock_id')) -             -            #try: -            #   pcilib.unlock(lock_id) -            #except Exception as e: -            #   s.error(str(e), data)  -            #   return -            # -            #remove lock from locks list -            #if lock_id in PcilibServerHandler.locks: -            #   PcilibServerHandler.locks.remove(lock_id) -            time.sleep(20) +            lock_id = str(data.get('lock_id')) +             +            try: +               print 'unlocking ' + lock_id +               s.pcilib.unlock(lock_id) +            except Exception as e: +               s.error(str(e), data)  +               return +              #Success! Create and send reply              s.wrapMessageAndSend({'status': 'ok'}, data) @@ -320,20 +302,12 @@ class PcilibServerHandler(BaseHTTPRequestHandler):           #elif(command == 'lock_global'):           #   #check if global_lock already setted by server -         #   print 'aaa' -         #   if PcilibServerHandler.lock_global: -         # -         #      s.error('global lock already setted by this server', data) -         #      return -         #                 #   try: -         #      pcilib.lock_global() +         #      s.pcilib.lock_global()           #   except Exception as e:           #      s.error(str(e), data)           #      return           #    -         #   PcilibServerHandler.lock_global = 1 -         #              #   #Success! Create and send reply           #   s.wrapMessageAndSend({'status': 'ok'}, data) @@ -341,13 +315,11 @@ class PcilibServerHandler(BaseHTTPRequestHandler):           #elif(command == 'unlock_global'):           #   try: -         #      pcilib.unlock_global() +         #      s.pcilib.unlock_global()           #   except Exception as e:           #      s.error(str(e), data)           #      return           #    -         #   PcilibServerHandler.lock_global = 0 -         #              #   #Success! Create and send reply           #   s.wrapMessageAndSend({'status': 'ok'}, data) @@ -364,11 +336,11 @@ class PcilibServerHandler(BaseHTTPRequestHandler):        #print str(s.headers['content-type'])        #print post_data['some'] -   #"""open device context """ +   #open device context      #def openPcilibInstance(s, device, model): -   #   pcilib = pcipywrap.create_pcilib_instance(device, model) +   #   s.pcilib = pcipywrap.create_pcilib_instance(device, model) -   """Send help message""" +   #Send help message     def help(s, received_message = None):        usage = str('Usage:\n'        '  Server receive commands via http GET with json packet.\n' @@ -450,7 +422,7 @@ class PcilibServerHandler(BaseHTTPRequestHandler):        out = {'status': 'ok', 'usage' : usage}        s.wrapMessageAndSend(out, received_message) -   """Send error message with text description"""      +   #Send error message with text description         def error(s, info, received_message = None):        out = dict() @@ -465,9 +437,22 @@ class PcilibServerHandler(BaseHTTPRequestHandler):        s.end_headers()        if not received_message is None:           message['received_message'] = received_message -      message['thread'] = threading.currentThread().getName()        s.wfile.write(json.dumps(message)) +def serve_forever(server): +   try: +      server.serve_forever() +   except KeyboardInterrupt: +      pass +         +def runpool(server, number_of_processes): +    # create child processes to act as workers +    for i in range(number_of_processes-1): +        Process(target=serve_forever, args=(server,)).start() + +    # main process also acts as a worker +    serve_forever(server) +  if __name__ == '__main__':     #parce command line options @@ -481,6 +466,9 @@ if __name__ == '__main__':     parser.add_option("-m", "--model",  action="store",                       type="string", dest="model", default=None,                       help="Memory model (autodetected)") +   parser.add_option("-n", "--number_processes",  action="store", +                     type="int", dest="processes", default=4, +                     help="Number of processes, used by server (4)")     opts = parser.parse_args()[0]     HOST_NAME = '' @@ -510,30 +498,19 @@ if __name__ == '__main__':     #pass Pcipywrap to to server handler     global pcilib -   pcilib = pcipywrap.Pcipywrap(DEVICE, MODEL) -   #def handler(*args): -   #   PcilibServerHandler(lib, *args) +   lib = pcipywrap.Pcipywrap(DEVICE, MODEL) +   def handler(*args): +      PcilibServerHandler(lib, *args)     #start server -   httpd = MultiThreadedHTTPServer((HOST_NAME, PORT_NUMBER), PcilibServerHandler) +   httpd = HTTPServer((HOST_NAME, PORT_NUMBER), handler) +   runpool(httpd, opts.processes)     print time.asctime(), "Server Starts - %s:%s" % (HOST_NAME, PORT_NUMBER) -   try: -      httpd.serve_forever() -   except KeyboardInterrupt: -      #unlocking global lock -      if PcilibServerHandler.lock_global: -         lib.unlock_global() -         PcilibServerHandler.lock_global = False -          -      #delete created locks -      for lock in PcilibServerHandler.locks: -         lib.unlock(lock) -      del PcilibServerHandler.locks[:] -      pass -       -       -       +   #try: +   #   httpd.serve_forever() +   #except KeyboardInterrupt: +   #   pass     httpd.server_close()     print time.asctime(), "Server Stops - %s:%s" % (HOST_NAME, PORT_NUMBER) diff --git a/pywrap/pcipywrap.c b/pywrap/pcipywrap.c index 391bdf4..cfb4e53 100644 --- a/pywrap/pcipywrap.c +++ b/pywrap/pcipywrap.c @@ -1,6 +1,9 @@  #include "pcipywrap.h"  #include "locking.h" +#include <dirent.h> +#include <strings.h> +  char* full_log = NULL;  /*! @@ -101,27 +104,6 @@ void __redirect_logs_to_exeption()                        pcilib_get_logger_context());  } -/*! - * \brief Wrap for PyDict_SetItem, with decrease reference counting after set. - */ -void pcilib_pydict_set_item(PyObject* dict, PyObject* name, PyObject* value) -{ -    PyDict_SetItem(dict, -                   name, -                   value); -    Py_XDECREF(name); -    Py_XDECREF(value); -} - -/*! - * \brief Wrap for PyList_Append, with decrease reference counting after append. - */ -void pcilib_pylist_append(PyObject* list, PyObject* value) -{ -    PyList_Append(list, value); -    Py_XDECREF(value); -} -  void add_pcilib_value_to_dict(pcilib_t* ctx, PyObject* dict, pcilib_value_t* val, const char *name)  {      PyObject *py_val = (PyObject*)pcilib_get_value_as_pyobject(ctx, val, NULL); @@ -215,126 +197,198 @@ PyObject * pcilib_convert_property_info_to_pyobject(pcilib_t* ctx, pcilib_proper  PyObject * pcilib_convert_register_info_to_pyobject(pcilib_t* ctx, pcilib_register_info_t listItem)  { -    PyObject* pylistItem = PyDict_New(); - -    if(listItem.name) -        pcilib_pydict_set_item(pylistItem, -                               PyString_FromString("name"), -                               PyString_FromString(listItem.name)); - -    if(listItem.description) -        pcilib_pydict_set_item(pylistItem, -                               PyString_FromString("description"), -                               PyString_FromString(listItem.description)); - -    if(listItem.bank) -        pcilib_pydict_set_item(pylistItem, -                               PyString_FromString("bank"), -                               PyString_FromString(listItem.bank)); - - -    //serialize modes -    PyObject* modes = PyList_New(0); - -    if((listItem.mode & PCILIB_REGISTER_R) == PCILIB_REGISTER_R) -        pcilib_pylist_append(modes, PyString_FromString("R")); -    if((listItem.mode & PCILIB_REGISTER_W) == PCILIB_REGISTER_W) -        pcilib_pylist_append(modes, PyString_FromString("W")); -    if((listItem.mode & PCILIB_REGISTER_RW) == PCILIB_REGISTER_RW) -        pcilib_pylist_append(modes, PyString_FromString("RW")); -    if((listItem.mode & PCILIB_REGISTER_W1C) == PCILIB_REGISTER_W1C) -        pcilib_pylist_append(modes, PyString_FromString("W1C")); -    if((listItem.mode & PCILIB_REGISTER_RW1C) == PCILIB_REGISTER_RW1C) -        pcilib_pylist_append(modes, PyString_FromString("RW1C")); -    if((listItem.mode & PCILIB_REGISTER_W1I) == PCILIB_REGISTER_W1I) -        pcilib_pylist_append(modes, PyString_FromString("W1I")); -    if((listItem.mode & PCILIB_REGISTER_RW1I) == PCILIB_REGISTER_RW1I) -        pcilib_pylist_append(modes, PyString_FromString("RW1I")); -    if((listItem.mode & PCILIB_REGISTER_INCONSISTENT) == PCILIB_REGISTER_INCONSISTENT) -        pcilib_pylist_append(modes, PyString_FromString("NO_CHK")); - -    pcilib_pydict_set_item(pylistItem, -                           PyString_FromString("mode"), -                           modes); - -    pcilib_value_t defval = {0}; -    pcilib_set_value_from_register_value(ctx, &defval, listItem.defvalue); -    add_pcilib_value_to_dict(ctx, pylistItem, &defval, "defvalue"); - -    if(listItem.range) -    { -        pcilib_value_t minval = {0}; -        pcilib_set_value_from_register_value(ctx, &minval, listItem.range->min); - -        pcilib_value_t maxval = {0}; -        pcilib_set_value_from_register_value(ctx, &maxval, listItem.range->max); - -        PyObject* range = PyDict_New(); -        add_pcilib_value_to_dict(ctx, range, &minval, "min"); -        add_pcilib_value_to_dict(ctx, range, &maxval, "max"); -        pcilib_pydict_set_item(pylistItem, -                               PyString_FromString("range"), -                               range); -    } - -    if(listItem.values) -    { +   PyObject* pylistItem = PyDict_New(); + +   if(listItem.name) +     pcilib_pydict_set_item(pylistItem, +                            PyString_FromString("name"), +                            PyString_FromString(listItem.name)); + +   if(listItem.description) +     pcilib_pydict_set_item(pylistItem, +                            PyString_FromString("description"), +                            PyString_FromString(listItem.description)); + +   if(listItem.bank) +     pcilib_pydict_set_item(pylistItem, +                            PyString_FromString("bank"), +                            PyString_FromString(listItem.bank)); + + +   //serialize modes +   PyObject* modes = PyList_New(0); + +   if((listItem.mode & PCILIB_REGISTER_R) == PCILIB_REGISTER_R) +     pcilib_pylist_append(modes, PyString_FromString("R")); +   if((listItem.mode & PCILIB_REGISTER_W) == PCILIB_REGISTER_W) +     pcilib_pylist_append(modes, PyString_FromString("W")); +   if((listItem.mode & PCILIB_REGISTER_RW) == PCILIB_REGISTER_RW) +     pcilib_pylist_append(modes, PyString_FromString("RW")); +   if((listItem.mode & PCILIB_REGISTER_W1C) == PCILIB_REGISTER_W1C) +     pcilib_pylist_append(modes, PyString_FromString("W1C")); +   if((listItem.mode & PCILIB_REGISTER_RW1C) == PCILIB_REGISTER_RW1C) +     pcilib_pylist_append(modes, PyString_FromString("RW1C")); +   if((listItem.mode & PCILIB_REGISTER_W1I) == PCILIB_REGISTER_W1I) +     pcilib_pylist_append(modes, PyString_FromString("W1I")); +   if((listItem.mode & PCILIB_REGISTER_RW1I) == PCILIB_REGISTER_RW1I) +     pcilib_pylist_append(modes, PyString_FromString("RW1I")); +   if((listItem.mode & PCILIB_REGISTER_INCONSISTENT) == PCILIB_REGISTER_INCONSISTENT) +     pcilib_pylist_append(modes, PyString_FromString("NO_CHK")); + +   pcilib_pydict_set_item(pylistItem, +                        PyString_FromString("mode"), +                        modes); + +   pcilib_value_t defval = {0}; +   pcilib_set_value_from_register_value(ctx, &defval, listItem.defvalue); +   add_pcilib_value_to_dict(ctx, pylistItem, &defval, "defvalue"); + +   if(listItem.range) +   { +     pcilib_value_t minval = {0}; +     pcilib_set_value_from_register_value(ctx, &minval, listItem.range->min); + +     pcilib_value_t maxval = {0}; +     pcilib_set_value_from_register_value(ctx, &maxval, listItem.range->max); + +     PyObject* range = PyDict_New(); +     add_pcilib_value_to_dict(ctx, range, &minval, "min"); +     add_pcilib_value_to_dict(ctx, range, &maxval, "max"); +     pcilib_pydict_set_item(pylistItem, +                            PyString_FromString("range"), +                            range); +   } -        PyObject* values = PyList_New(0); +   if(listItem.values) +   { -        for (int j = 0; listItem.values[j].name; j++) -        { -            PyObject* valuesItem = PyDict_New(); +     PyObject* values = PyList_New(0); -            pcilib_value_t val = {0}; -            pcilib_set_value_from_register_value(ctx, &val, listItem.values[j].value); +     for (int j = 0; listItem.values[j].name; j++) +     { +         PyObject* valuesItem = PyDict_New(); -            pcilib_value_t min = {0}; -            pcilib_set_value_from_register_value(ctx, &min, listItem.values[j].min); +         pcilib_value_t val = {0}; +         pcilib_set_value_from_register_value(ctx, &val, listItem.values[j].value); -            pcilib_value_t max = {0}; -            pcilib_set_value_from_register_value(ctx, &max, listItem.values[j].max); +         pcilib_value_t min = {0}; +         pcilib_set_value_from_register_value(ctx, &min, listItem.values[j].min); -            add_pcilib_value_to_dict(ctx, valuesItem, &val, "value"); -            add_pcilib_value_to_dict(ctx, valuesItem, &min, "min"); -            add_pcilib_value_to_dict(ctx, valuesItem, &max, "max"); +         pcilib_value_t max = {0}; +         pcilib_set_value_from_register_value(ctx, &max, listItem.values[j].max); -            if(listItem.values[j].name) -                pcilib_pydict_set_item(valuesItem, -                                       PyString_FromString("name"), -                                       PyString_FromString(listItem.values[j].name)); -            if(listItem.values[j].description) -            { -                pcilib_pydict_set_item(valuesItem, -                                       PyString_FromString("description"), -                                       PyString_FromString(listItem.values[j].description)); +         add_pcilib_value_to_dict(ctx, valuesItem, &val, "value"); +         add_pcilib_value_to_dict(ctx, valuesItem, &min, "min"); +         add_pcilib_value_to_dict(ctx, valuesItem, &max, "max"); -            } -            pcilib_pylist_append(values, valuesItem); -        } +         if(listItem.values[j].name) +             pcilib_pydict_set_item(valuesItem, +                                    PyString_FromString("name"), +                                    PyString_FromString(listItem.values[j].name)); +         if(listItem.values[j].description) +         { +             pcilib_pydict_set_item(valuesItem, +                                    PyString_FromString("description"), +                                    PyString_FromString(listItem.values[j].description)); -        pcilib_pydict_set_item(pylistItem, -                               PyString_FromString("values"), -                               values); -    } +         } +         pcilib_pylist_append(values, valuesItem); +     } -    return pylistItem; +     pcilib_pydict_set_item(pylistItem, +                            PyString_FromString("values"), +                            values); +   } +   return pylistItem;  } +  Pcipywrap *new_Pcipywrap(const char* fpga_device, const char* model)  {      //opening device      pcilib_t* ctx = pcilib_open(fpga_device, model); -    if(!ctx) -    { +    if(!ctx) {          set_python_exception("Failed pcilib_open(%s, %s)", fpga_device, model);          return NULL;      } +          Pcipywrap *self;      self = (Pcipywrap *) malloc(sizeof(Pcipywrap)); +    if(!self) { +        pcilib_close(ctx); +        return (Pcipywrap *)PyExc_MemoryError; +    }        self->shared = 0;      self->ctx = ctx; +    self->py = NULL; +    self->names = NULL; +    self->names_size = 0; + +     +    //processing pcilib scrips +    const char *scripts_dir = getenv("PCILIB_SCRIPTS_DIR"); +    if(scripts_dir) { +      int err = 0; + +      self->py = pcilib_init_py_ctx(ctx->py, &err); +      if(err) { +         delete_Pcipywrap(self); +         set_python_exception("Failed pcilib_py_s_clone (%i)", err); +         return NULL; +      } +       +      //add scripts directory to Python path +      err = pcilib_py_ctx_add_script_dir(self->py, scripts_dir); +      if(err) { +         delete_Pcipywrap(self); +         set_python_exception("Failed pcilib_py_add_dir (%i)", err); +         return NULL; +      } +       +      //load scripts in PCILIB_SCRIPTS_DIR +      self->names = malloc(++(self->names_size) * sizeof(char*)); +      self->names[self->names_size - 1] = NULL; +       +      DIR *dir; +      struct dirent *script_path; +      dir = opendir(scripts_dir); +      if (dir) { +         while ((script_path = readdir(dir)) != NULL) { + +            char *py = strrchr(script_path->d_name, '.'); +            if ((!py)||(strcasecmp(py, ".py"))) { +               continue; +            } + +            char *name = malloc(strlen(script_path->d_name)); +            if(!name) { +               delete_Pcipywrap(self); +               return (Pcipywrap *)PyExc_MemoryError; +            } +             +            strcpy(name, script_path->d_name); + +            err = pcilib_py_ctx_load_script(self->py, name); + +            if(err) { +               delete_Pcipywrap(self); +               set_python_exception("pcilib_py_ctx_load_script (%i)", err); +               return NULL; +            } +             +            self->names = realloc(self->names, ++(self->names_size)); +            if(!self->names) { +               delete_Pcipywrap(self); +               return (Pcipywrap *)PyExc_MemoryError; +            } +            self->names[self->names_size - 1] = NULL; +            self->names[self->names_size - 2] = name; +         } +         closedir(dir); +      } +    } +          return self;  } @@ -350,14 +404,27 @@ Pcipywrap *create_Pcipywrap(PyObject* ctx)      self = (Pcipywrap *) malloc(sizeof(Pcipywrap));      self->shared = 1;      self->ctx = PyCObject_AsVoidPtr(ctx); +    self->py = NULL; +    self->names = NULL; +    self->names_size = 0;      return self;  }  void delete_Pcipywrap(Pcipywrap *self) { -    if(!self->shared) -        pcilib_close(self->ctx); - -    free(self); +   if(!self->shared) +     pcilib_close(self->ctx); +      +   pcilib_free_py_ctx(self->py); + +   if(self->names) { +      for(int i = 0; self->names[i]; i++) +         free(self->names[i]); +      free(self->names); +      self->names = NULL; +      self->names_size = 0; +   } +     +   free(self);  }  PyObject* Pcipywrap_read_register(Pcipywrap *self, const char *regname, const char *bank) @@ -464,7 +531,7 @@ PyObject* Pcipywrap_get_registers_list(Pcipywrap *self, const char *bank)        set_python_exception("pcilib_get_register_list return NULL");        return NULL;     } - +           PyObject* pyList = PyList_New(0);     for(int i = 0; list[i].name; i++)     { @@ -554,7 +621,7 @@ void Pcipywrap_unlock_global(Pcipywrap *self)  PyObject* Pcipywrap_lock(Pcipywrap *self, const char *lock_id)  {      pcilib_lock_t* lock = pcilib_get_lock(self->ctx, -                                          PCILIB_LOCK_FLAGS_DEFAULT, +                                          PCILIB_LOCK_FLAG_PERSISTENT,                                            lock_id);      if(!lock)      { @@ -576,7 +643,7 @@ PyObject* Pcipywrap_lock(Pcipywrap *self, const char *lock_id)  PyObject* Pcipywrap_try_lock(Pcipywrap *self, const char *lock_id)  {      pcilib_lock_t* lock = pcilib_get_lock(self->ctx, -                                          PCILIB_LOCK_FLAGS_DEFAULT, +                                          PCILIB_LOCK_FLAG_PERSISTENT,                                            lock_id);      if(!lock)      { @@ -597,7 +664,7 @@ PyObject* Pcipywrap_try_lock(Pcipywrap *self, const char *lock_id)  PyObject* Pcipywrap_unlock(Pcipywrap *self, const char *lock_id)  {      pcilib_lock_t* lock = pcilib_get_lock(self->ctx, -                                          PCILIB_LOCK_FLAGS_DEFAULT, +                                          PCILIB_LOCK_FLAG_PERSISTENT,                                            lock_id);      if(!lock)      { @@ -609,4 +676,20 @@ PyObject* Pcipywrap_unlock(Pcipywrap *self, const char *lock_id)      return PyInt_FromLong((long)1);  } +PyObject* Pcipywrap_get_scripts_list(Pcipywrap *self) +{ +   return pcilib_py_ctx_get_scripts_info(self->py); +} +PyObject* Pcipywrap_run_script(Pcipywrap *self, const char* script_name, PyObject* value) +{ +   int err = 0; +   PyObject* value_out = pcilib_py_ctx_eval_func(self->py, script_name, "run", value, &err); +    +   if(err) { +    set_python_exception("Failed pcilib_py_ctx_eval_func (%i)", err); +     return NULL; +   } +    +   return value_out; +} diff --git a/pywrap/pcipywrap.h b/pywrap/pcipywrap.h index dcce245..2d9115b 100644 --- a/pywrap/pcipywrap.h +++ b/pywrap/pcipywrap.h @@ -5,11 +5,23 @@  #include "error.h"  #include <Python.h> +#include "config.h" +#include "py.h" + +#include "pci.h" +#include "pcilib.h" + +  typedef struct { +    char** names; +    int names_size; +         void* ctx; +    struct pcilib_py_s *py;      int shared;  } Pcipywrap; +  /*!   * \brief Redirect pcilib standart log stream to exeption text.   * Logger will accumulate errors untill get message, starts with "#E". @@ -83,4 +95,7 @@ PyObject* Pcipywrap_lock(Pcipywrap *self, const char *lock_id);  PyObject* Pcipywrap_try_lock(Pcipywrap *self, const char *lock_id);  PyObject* Pcipywrap_unlock(Pcipywrap *self, const char *lock_id); +PyObject* Pcipywrap_get_scripts_list(Pcipywrap *self); +PyObject* Pcipywrap_run_script(Pcipywrap *self, const char* script_name, PyObject* value); +  #endif /* PCIPYWRAP_H */ diff --git a/pywrap/pcipywrap.i b/pywrap/pcipywrap.i index f08ceb7..104e19f 100644 --- a/pywrap/pcipywrap.i +++ b/pywrap/pcipywrap.i @@ -29,5 +29,8 @@ typedef struct {  		PyObject* lock(const char *lock_id);  		PyObject* try_lock(const char *lock_id);  		PyObject* unlock(const char *lock_id); +       +      PyObject* get_scripts_list(); +      PyObject* run_script(const char* script_name, PyObject* value);  	}  } Pcipywrap; | 
