summaryrefslogtreecommitdiffstats
path: root/pywrap
diff options
context:
space:
mode:
authorVasilii Chernov <vchernov@inr.ru>2016-03-01 10:42:40 +0100
committerVasilii Chernov <vchernov@inr.ru>2016-03-01 10:42:40 +0100
commit5d775d64bdec554b9842823bd1c46263210425fd (patch)
treecb1da12066687273f7dccace7aba4ee1ff2ba25c /pywrap
parent0e584d07a0776454fd5487b7d23407c0624b56c2 (diff)
downloadpcitool-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.txt2
-rw-r--r--pywrap/api_server.py (renamed from pywrap/server.py)147
-rw-r--r--pywrap/pcipywrap.c333
-rw-r--r--pywrap/pcipywrap.h15
-rw-r--r--pywrap/pcipywrap.i3
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;