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; |