summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSuren A. Chilingaryan <csa@suren.me>2016-03-03 00:50:59 +0100
committerSuren A. Chilingaryan <csa@suren.me>2016-03-03 00:50:59 +0100
commit195c28f3074486165b6e0935362810f8a1fb9531 (patch)
tree56aecf261aaae57e28c08cef573ae6642ec5394d
parent1e53d2d17e611586030e3ff3e9ab87e5bb753c9b (diff)
downloadpcitool-195c28f3074486165b6e0935362810f8a1fb9531.tar.gz
pcitool-195c28f3074486165b6e0935362810f8a1fb9531.tar.bz2
pcitool-195c28f3074486165b6e0935362810f8a1fb9531.tar.xz
pcitool-195c28f3074486165b6e0935362810f8a1fb9531.zip
Make Python problems non-fatal
-rw-r--r--pcilib/pci.c19
-rw-r--r--pcilib/py.c36
-rw-r--r--pcilib/py.h1
-rw-r--r--views/transform.c8
4 files changed, 41 insertions, 23 deletions
diff --git a/pcilib/pci.c b/pcilib/pci.c
index ec40c95..c9cd1d2 100644
--- a/pcilib/pci.c
+++ b/pcilib/pci.c
@@ -147,9 +147,8 @@ pcilib_t *pcilib_open(const char *device, const char *model) {
err = pcilib_init_py(ctx);
if (err) {
- pcilib_error("Error (%i) initializing python subsystem", err);
- pcilib_close(ctx);
- return NULL;
+ pcilib_warning("Error (%i) initializing python subsystem", err);
+ pcilib_free_py(ctx);
}
ctx->alloc_reg = PCILIB_DEFAULT_REGISTER_SPACE;
@@ -191,22 +190,22 @@ pcilib_t *pcilib_open(const char *device, const char *model) {
if (!ctx->model)
ctx->model = strdup(model?model:"pci");
-
+
err = pcilib_py_add_script_dir(ctx, NULL);
if (err) {
- pcilib_error("Error (%i) add script path to python path", err);
- pcilib_close(ctx);
- return NULL;
+ pcilib_warning("Error (%i) add script path to python path", err);
+ pcilib_free_py(ctx);
+ err = 0;
}
-
-
+
+
xmlerr = pcilib_init_xml(ctx, ctx->model);
if ((xmlerr)&&(xmlerr != PCILIB_ERROR_NOTFOUND)) {
pcilib_error("Error (%i) initializing XML subsystem for model %s", xmlerr, ctx->model);
pcilib_close(ctx);
return NULL;
}
-
+
// We have found neither standard model nor XML
if ((err)&&(xmlerr)) {
diff --git a/pcilib/py.c b/pcilib/py.c
index 9e4ca90..833532e 100644
--- a/pcilib/py.c
+++ b/pcilib/py.c
@@ -135,19 +135,19 @@ int pcilib_init_py(pcilib_t *ctx) {
ctx->py->main_module = PyImport_AddModule("__parser__");
if (!ctx->py->main_module) {
- pcilib_python_error("Error importing python parser");
+ pcilib_python_warning("Error importing python parser");
return PCILIB_ERROR_FAILED;
}
ctx->py->global_dict = PyModule_GetDict(ctx->py->main_module);
if (!ctx->py->global_dict) {
- pcilib_python_error("Error locating global python dictionary");
+ pcilib_python_warning("Error locating global python dictionary");
return PCILIB_ERROR_FAILED;
}
PyObject *pywrap = PyImport_ImportModule(PCILIB_PYTHON_WRAPPER);
if (!pywrap) {
- pcilib_python_error("Error importing pcilib python wrapper");
+ pcilib_python_warning("Error importing pcilib python wrapper");
return PCILIB_ERROR_FAILED;
}
@@ -158,7 +158,7 @@ int pcilib_init_py(pcilib_t *ctx) {
Py_XDECREF(mod_name);
if (!ctx->py->pcilib_pywrap) {
- pcilib_python_error("Error initializing python wrapper");
+ pcilib_python_warning("Error initializing python wrapper");
return PCILIB_ERROR_FAILED;
}
#endif /* HAVE_PYTHON */
@@ -173,6 +173,8 @@ int pcilib_py_add_script_dir(pcilib_t *ctx, const char *dir) {
PyObject *pydict, *pystr, *pyret = NULL;
char *script_dir;
+ if (!ctx->py) return 0;
+
const char *model_dir = getenv("PCILIB_MODEL_DIR");
if (!model_dir) model_dir = PCILIB_MODEL_DIR;
@@ -188,13 +190,13 @@ int pcilib_py_add_script_dir(pcilib_t *ctx, const char *dir) {
pypath = PySys_GetObject("path");
if (!pypath) {
- pcilib_python_error("Can't get python path");
+ pcilib_python_warning("Can't get python path");
return PCILIB_ERROR_FAILED;
}
pynewdir = PyUnicode_FromString(script_dir);
if (!pynewdir) {
- pcilib_python_error("Can't create python string");
+ pcilib_python_warning("Can't create python string");
return PCILIB_ERROR_MEMORY;
}
@@ -224,7 +226,7 @@ int pcilib_py_add_script_dir(pcilib_t *ctx, const char *dir) {
Py_DECREF(pynewdir);
if (err) {
- pcilib_python_error("Can't add directory (%s) to python path", script_dir);
+ pcilib_python_warning("Can't add directory (%s) to python path", script_dir);
return err;
}
#endif /* HAVE_PYTHON */
@@ -267,6 +269,7 @@ int pcilib_py_load_script(pcilib_t *ctx, const char *script_name) {
PyObject* pymodule;
pcilib_script_t *module = NULL;
+ if (!ctx->py) return 0;
char *module_name = strdupa(script_name);
if (!module_name) return PCILIB_ERROR_MEMORY;
@@ -304,7 +307,12 @@ int pcilib_py_get_transform_script_properties(pcilib_t *ctx, const char *script_
PyObject *dict;
PyObject *pystr;
pcilib_script_t *module;
-
+
+ if (!ctx->py) {
+ if (mode_ret) *mode_ret = mode;
+ return 0;
+ }
+
HASH_FIND_STR(ctx->py->script_hash, script_name, module);
if(!module) {
@@ -343,7 +351,9 @@ pcilib_py_object *pcilib_get_value_as_pyobject(pcilib_t* ctx, pcilib_value_t *va
long ival;
double fval;
-
+
+ if (!ctx->py) return NULL;
+
gstate = PyGILState_Ensure();
switch(val->type) {
case PCILIB_TYPE_LONG:
@@ -383,7 +393,9 @@ int pcilib_set_value_from_pyobject(pcilib_t* ctx, pcilib_value_t *val, pcilib_py
int err = 0;
PyObject *pyval = (PyObject*)pval;
PyGILState_STATE gstate;
-
+
+ if (!ctx->py) return PCILIB_ERROR_NOTINITIALIZED;
+
gstate = PyGILState_Ensure();
if (PyLong_Check(pyval)) {
err = pcilib_set_value_from_int(ctx, val, PyLong_AsLong(pyval));
@@ -536,6 +548,8 @@ int pcilib_py_eval_string(pcilib_t *ctx, const char *codestr, pcilib_value_t *va
char *code;
PyObject* obj;
+ if (!ctx->py) return PCILIB_ERROR_NOTINITIALIZED;
+
code = pcilib_py_parse_string(ctx, codestr, value);
if (!code) {
pcilib_error("Failed to parse registers in the code: %s", codestr);
@@ -572,6 +586,8 @@ int pcilib_py_eval_func(pcilib_t *ctx, const char *script_name, const char *func
PyObject *pyval = NULL, *pyret;
pcilib_script_t *module = NULL;
+ if (!ctx->py) return PCILIB_ERROR_NOTINITIALIZED;
+
HASH_FIND_STR(ctx->py->script_hash, script_name, module);
if (!module) {
diff --git a/pcilib/py.h b/pcilib/py.h
index c372a09..128fbb6 100644
--- a/pcilib/py.h
+++ b/pcilib/py.h
@@ -5,6 +5,7 @@
#include <pcilib/error.h>
#define pcilib_python_error(...) pcilib_log_python_error(__FILE__, __LINE__, PCILIB_LOG_DEFAULT, PCILIB_LOG_ERROR, __VA_ARGS__)
+#define pcilib_python_warning(...) pcilib_log_python_error(__FILE__, __LINE__, PCILIB_LOG_DEFAULT, PCILIB_LOG_WARNING, __VA_ARGS__)
typedef struct pcilib_py_s pcilib_py_t;
typedef void pcilib_py_object;
diff --git a/views/transform.c b/views/transform.c
index 25f30d1..3aa3b2b 100644
--- a/views/transform.c
+++ b/views/transform.c
@@ -18,7 +18,7 @@ static pcilib_view_context_t * pcilib_transform_view_init(pcilib_t *ctx, pcilib_
pcilib_view_context_t *view_ctx;
pcilib_transform_view_description_t *v = (pcilib_transform_view_description_t*)(ctx->views[view]);
- if(v->script) {
+ if (v->script) {
pcilib_access_mode_t mode = 0;
err = pcilib_py_load_script(ctx, v->script);
@@ -39,11 +39,13 @@ static pcilib_view_context_t * pcilib_transform_view_init(pcilib_t *ctx, pcilib_
if (!v->read_from_reg) v->read_from_reg = "read_from_register";
if (!v->write_to_reg) v->write_to_reg = "write_to_register";
+ } else if (!ctx->py) {
+ v->base.mode &= (~PCILIB_REGISTER_RW);
}
-
+
view_ctx = (pcilib_view_context_t*)malloc(sizeof(pcilib_view_context_t));
if (view_ctx) memset(view_ctx, 0, sizeof(pcilib_view_context_t));
-
+
return view_ctx;
}