diff options
| -rw-r--r-- | CMakeLists.txt | 4 | ||||
| -rw-r--r-- | html_server/html_server.py | 3 | ||||
| -rw-r--r-- | html_server/templates/base.html | 2 | ||||
| -rw-r--r-- | pcilib/locking.c | 207 | ||||
| -rw-r--r-- | pcilib/property.c | 4 | ||||
| -rw-r--r-- | pcilib/py.c | 309 | ||||
| -rw-r--r-- | pcilib/py.h | 26 | ||||
| -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 | ||||
| -rwxr-xr-x | run | 6 | ||||
| -rw-r--r-- | xml/scripts/test_script.py | 4 | ||||
| -rw-r--r-- | xml/scripts/test_script2.py | 4 | ||||
| -rw-r--r-- | xml/test/test_prop_mt.py | 6 | 
16 files changed, 665 insertions, 410 deletions
| diff --git a/CMakeLists.txt b/CMakeLists.txt index dfbd50a..4445af7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,7 +38,7 @@ find_package(PkgConfig REQUIRED)  find_package(Threads REQUIRED)  if (NOT DISABLE_PYTHON) -    find_package(PythonLibs 2.7 REQUIRED) +    find_package(PythonLibs 2 REQUIRED)      find_package(SWIG REQUIRED)      set(HAVE_PYTHON TRUE)      include(FindPythonInterp) @@ -123,6 +123,8 @@ if (NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)     DESTINATION ${CMAKE_BINARY_DIR}     FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE     ) +    +   configure_file(${CMAKE_SOURCE_DIR}/pcilib/version.h.in ${CMAKE_SOURCE_DIR}/pcilib/version.h)  endif(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)  install(FILES  diff --git a/html_server/html_server.py b/html_server/html_server.py index dba24e9..0d4bca8 100644 --- a/html_server/html_server.py +++ b/html_server/html_server.py @@ -137,7 +137,6 @@ def get_registers_list():     value = dict()     for reg in reg_list: -      print reg        try:           value[reg['name']] = pcilib.read_register(str(reg['name']),                                                     str(reg['bank'])) @@ -212,4 +211,4 @@ if __name__ == "__main__":     pcilib = pcipywrap.Pcipywrap(device, model)     pcipywrap.__redirect_logs_to_exeption() -   app.run(host = HOST_NAME, port = PORT_NUMBER) +   app.run(host = HOST_NAME, port = PORT_NUMBER, threaded=True) diff --git a/html_server/templates/base.html b/html_server/templates/base.html index 39f8d00..0e3aea8 100644 --- a/html_server/templates/base.html +++ b/html_server/templates/base.html @@ -187,7 +187,7 @@              }        .infoTable { -               padding: 5px; +               padding: 2px;                 border: 1px solid #aaa;                 line-height: 28px; diff --git a/pcilib/locking.c b/pcilib/locking.c index 71f204e..28aa4c4 100644 --- a/pcilib/locking.c +++ b/pcilib/locking.c @@ -102,118 +102,117 @@ pcilib_lock_t *pcilib_get_lock_by_id(pcilib_t *ctx, pcilib_lock_id_t id) {  }  pcilib_lock_t *pcilib_get_lock(pcilib_t *ctx, pcilib_lock_flags_t flags, const char  *lock_id, ...) { -    pcilib_lock_id_t i; -    int err, ret; - -    pcilib_lock_t *lock; -    char buffer[PCILIB_LOCK_SIZE]; - -	/* we construct the complete lock_id given the parameters of the function*/ -    va_list pa; -    va_start(pa, lock_id); -    ret = vsnprintf(buffer, PCILIB_LOCK_SIZE, lock_id, pa); -    va_end(pa); - -    if (ret < 0) { -	pcilib_error("Failed to construct the lock id, probably arguments does not match the format string (%s)...", lock_id); -	return NULL; -    } -	 -	 -	/* we iterate through locks to see if there is one already with the same name*/	 -	// Would be nice to have hash here -    for (i = 0; i < PCILIB_MAX_LOCKS; i++) { -	lock = pcilib_get_lock_by_id(ctx, i); - -        const char *name = pcilib_lock_get_name(lock); -	if (!name) break; -	 -	if (!strcmp(buffer, name)) { -	    if ((pcilib_lock_get_flags(lock)&PCILIB_LOCK_FLAG_PERSISTENT) != (flags&PCILIB_LOCK_FLAG_PERSISTENT)) { -		if (flags&PCILIB_LOCK_FLAG_PERSISTENT) -		    pcilib_error("Requesting persistent lock (%s), but requested lock is already existing and is robust", name); -		else -		    pcilib_error("Requesting robust lock (%s), but requested lock is already existing and is persistent", name); -		return NULL; -	    } - -#ifndef HAVE_STDATOMIC_H -	    if ((flags&PCILIB_LOCK_FLAG_UNLOCKED)==0) { -		err = pcilib_lock(ctx->locks.locking); -		if (err) { -		    pcilib_error("Error (%i) obtaining global lock", err); -		    return NULL; -		} -	    } -#endif /* ! HAVE_STDATOMIC_H */ -	/* if yes, we increment its ref variable*/ -	    pcilib_lock_ref(lock); -#ifndef HAVE_STDATOMIC_H -	    if ((flags&PCILIB_LOCK_FLAG_UNLOCKED)==0) -		pcilib_unlock(ctx->locks.locking); -#endif /* ! HAVE_STDATOMIC_H */ - -	    return lock; -	} -    } +   pcilib_lock_id_t i; +   int err, ret; -    if ((flags&PCILIB_LOCK_FLAG_UNLOCKED)==0) { -	err = pcilib_lock(ctx->locks.locking); -	if (err) { -	    pcilib_error("Error (%i) obtaining global lock", err); -	    return NULL; -	} -    } +   pcilib_lock_t *lock; +   char buffer[PCILIB_LOCK_SIZE]; -	// Make sure it was not allocated meanwhile -    for (; i < PCILIB_MAX_LOCKS; i++) { -	lock = pcilib_get_lock_by_id(ctx, i); - -        const char *name = pcilib_lock_get_name(lock); -	if (!name) break; +   /* we construct the complete lock_id given the parameters of the function*/ +   va_list pa; +   va_start(pa, lock_id); +   ret = vsnprintf(buffer, PCILIB_LOCK_SIZE, lock_id, pa); +   va_end(pa); -	if (!strcmp(buffer, name)) { -	    if ((pcilib_lock_get_flags(lock)&PCILIB_LOCK_FLAG_PERSISTENT) != (flags&PCILIB_LOCK_FLAG_PERSISTENT)) { -		if (flags&PCILIB_LOCK_FLAG_PERSISTENT) -		    pcilib_error("Requesting persistent lock (%s), but requested lock is already existing and is robust", name); -		else -		    pcilib_error("Requesting robust lock (%s), but requested lock is already existing and is persistent", name); -		 -		if ((flags&PCILIB_LOCK_FLAG_UNLOCKED)==0) -		    pcilib_unlock(ctx->locks.locking); -		return NULL; -	    } +   if (ret < 0) { +      pcilib_error("Failed to construct the lock id, probably arguments does not match the format string (%s)...", lock_id); +      return NULL; +   } -	    pcilib_lock_ref(lock); -	    if ((flags&PCILIB_LOCK_FLAG_UNLOCKED)==0) -		pcilib_unlock(ctx->locks.locking); -	    return lock; -	} -    } -    if (i == PCILIB_MAX_LOCKS) { -	if ((flags&PCILIB_LOCK_FLAG_UNLOCKED)==0) -	    pcilib_unlock(ctx->locks.locking); -	pcilib_error("Failed to create lock (%s), only %u locks is supported", buffer, PCILIB_MAX_LOCKS); -	return NULL; -    } +   /* we iterate through locks to see if there is one already with the same name*/	 +   // Would be nice to have hash here +   for (i = 0; i < PCILIB_MAX_LOCKS; i++) { +      lock = pcilib_get_lock_by_id(ctx, i); -	/* if the lock did not exist before, then we create it*/ -    err = pcilib_init_lock(lock, flags, buffer); -     -    if (err) { -	pcilib_error("Lock initialization failed with error %i", err); +      const char *name = pcilib_lock_get_name(lock); +      if (!name) break; -	if ((flags&PCILIB_LOCK_FLAG_UNLOCKED)==0) -	    pcilib_unlock(ctx->locks.locking); -	 -	return NULL; -    } -     -    if ((flags&PCILIB_LOCK_FLAG_UNLOCKED)==0) -	pcilib_unlock(ctx->locks.locking); +      if (!strcmp(buffer, name)) { +         if ((pcilib_lock_get_flags(lock)&PCILIB_LOCK_FLAG_PERSISTENT) != (flags&PCILIB_LOCK_FLAG_PERSISTENT)) { +            if (flags&PCILIB_LOCK_FLAG_PERSISTENT) +               pcilib_error("Requesting persistent lock (%s), but requested lock is already existing and is robust", name); +            else +               pcilib_error("Requesting robust lock (%s), but requested lock is already existing and is persistent", name); +            return NULL; +         } -    return lock; +#ifndef HAVE_STDATOMIC_H +         if ((flags&PCILIB_LOCK_FLAG_UNLOCKED)==0) { +            err = pcilib_lock(ctx->locks.locking); +            if (err) { +               pcilib_error("Error (%i) obtaining global lock", err); +               return NULL; +            } +         } +#endif /* ! HAVE_STDATOMIC_H */ +         /* if yes, we increment its ref variable*/ +         pcilib_lock_ref(lock); +         #ifndef HAVE_STDATOMIC_H +         if ((flags&PCILIB_LOCK_FLAG_UNLOCKED)==0) +            pcilib_unlock(ctx->locks.locking); +         #endif /* ! HAVE_STDATOMIC_H */ +         return lock; +      } +   } + +   if ((flags&PCILIB_LOCK_FLAG_UNLOCKED)==0) { +      err = pcilib_lock(ctx->locks.locking); +      if (err) { +         pcilib_error("Error (%i) obtaining global lock", err); +         return NULL; +      } +   } + +   // Make sure it was not allocated meanwhile +   for (; i < PCILIB_MAX_LOCKS; i++) { +      lock = pcilib_get_lock_by_id(ctx, i); + +      const char *name = pcilib_lock_get_name(lock); +      if (!name) break; + +      if (!strcmp(buffer, name)) { +         if ((pcilib_lock_get_flags(lock)&PCILIB_LOCK_FLAG_PERSISTENT) != (flags&PCILIB_LOCK_FLAG_PERSISTENT)) { +            if (flags&PCILIB_LOCK_FLAG_PERSISTENT) +               pcilib_error("Requesting persistent lock (%s), but requested lock is already existing and is robust", name); +            else +               pcilib_error("Requesting robust lock (%s), but requested lock is already existing and is persistent", name); + +            if ((flags&PCILIB_LOCK_FLAG_UNLOCKED)==0) +               pcilib_unlock(ctx->locks.locking); +            return NULL; +         } + +         pcilib_lock_ref(lock); +         if ((flags&PCILIB_LOCK_FLAG_UNLOCKED)==0) +            pcilib_unlock(ctx->locks.locking); +         return lock; +      } +   } + +   if (i == PCILIB_MAX_LOCKS) { +      if ((flags&PCILIB_LOCK_FLAG_UNLOCKED)==0) +         pcilib_unlock(ctx->locks.locking); +      pcilib_error("Failed to create lock (%s), only %u locks is supported", buffer, PCILIB_MAX_LOCKS); +      return NULL; +   } + +   /* if the lock did not exist before, then we create it*/ +   err = pcilib_init_lock(lock, flags, buffer); + +   if (err) { +      pcilib_error("Lock initialization failed with error %i", err); + +      if ((flags&PCILIB_LOCK_FLAG_UNLOCKED)==0) +         pcilib_unlock(ctx->locks.locking); + +      return NULL; +   } + +   if ((flags&PCILIB_LOCK_FLAG_UNLOCKED)==0) +      pcilib_unlock(ctx->locks.locking); + +   return lock;  }  void pcilib_return_lock(pcilib_t *ctx, pcilib_lock_flags_t flags, pcilib_lock_t *lock) { diff --git a/pcilib/property.c b/pcilib/property.c index dfab9a6..1dba1be 100644 --- a/pcilib/property.c +++ b/pcilib/property.c @@ -226,8 +226,8 @@ pcilib_property_info_t *pcilib_get_property_list(pcilib_t *ctx, const char *bran      }      HASH_ITER(hh, dir_hash, dir, dir_tmp) { -	HASH_DEL(dir_hash, dir); -	free(dir); +        HASH_DEL(dir_hash, dir); +        free(dir);      }      HASH_CLEAR(hh, dir_hash); diff --git a/pcilib/py.c b/pcilib/py.c index 6cf9fdc..934c11f 100644 --- a/pcilib/py.c +++ b/pcilib/py.c @@ -89,8 +89,6 @@ void pcilib_log_python_error(const char *file, int line, pcilib_log_flags_t flag  #endif /* HAVE_PYTHON */  } - -  int pcilib_init_py(pcilib_t *ctx) {  #ifdef HAVE_PYTHON      ctx->py = (pcilib_py_t*)malloc(sizeof(pcilib_py_t)); @@ -143,8 +141,6 @@ int pcilib_init_py(pcilib_t *ctx) {  int pcilib_py_add_script_dir(pcilib_t *ctx, const char *dir) {  #ifdef HAVE_PYTHON      int err = 0; -    PyObject *pypath, *pynewdir; -    PyObject *pydict, *pystr, *pyret = NULL;      char *script_dir;      const char *model_dir = getenv("PCILIB_MODEL_DIR"); @@ -160,83 +156,59 @@ int pcilib_py_add_script_dir(pcilib_t *ctx, const char *dir) {        sprintf(script_dir, "%s/%s", model_dir, dir);      } -    pypath = PySys_GetObject("path"); -    if (!pypath) { -      pcilib_python_error("Can't get python path"); -      return PCILIB_ERROR_FAILED; -    } +    err = pcilib_py_ctx_add_script_dir(ctx->py, script_dir); +    if(err) return err; +#endif /* HAVE_PYTHON */ -    pynewdir = PyString_FromString(script_dir); -    if (!pynewdir) { -      pcilib_python_error("Can't create python string"); -      return PCILIB_ERROR_MEMORY; +    return 0; +} + +void pcilib_py_free_hash(pcilib_py_t *ctx_py) { +    if (ctx_py->script_hash) { +        pcilib_script_t *script, *script_tmp; + +        HASH_ITER(hh, ctx_py->script_hash, script, script_tmp) { +           Py_DECREF(script->module); +           HASH_DEL(ctx_py->script_hash, script); +           free(script); +        } +        ctx_py->script_hash = NULL;      } -     -	// Checking if the directory already in the path -    pydict = PyDict_New(); -    if (pydict) { -	   pystr = PyString_FromString("cur"); -        if (pystr) { -          PyDict_SetItem(pydict, pystr, pynewdir); -          Py_DECREF(pystr); -      } +} -      pystr = PyString_FromString("path"); -      if (pystr) { -          PyDict_SetItem(pydict, pystr, pypath); -          Py_DECREF(pystr); -      } +void pcilib_free_py_ctx(pcilib_py_t *ctx_py) { +#ifdef HAVE_PYTHON +   int finalyze = 0; -      pyret = PyRun_String("cur in path", Py_eval_input, ctx->py->global_dict, pydict); -      Py_DECREF(pydict); -    }  +   if (ctx_py) {		 +      if (ctx_py->finalyze) finalyze = 1; -    if ((pyret == Py_False)&&(PyList_Append(pypath, pynewdir) == -1)) -	   err = PCILIB_ERROR_FAILED; +      pcilib_py_free_hash(ctx_py); -    if (pyret) Py_DECREF(pyret); -    Py_DECREF(pynewdir); +      if (ctx_py->pcilib_pywrap) +      Py_DECREF(ctx_py->pcilib_pywrap); -    if (err) { -      pcilib_python_error("Can't add directory (%s) to python path", script_dir); -      return err; -    } -#endif /* HAVE_PYTHON */ +      free(ctx_py); +   } -    return 0; +   if (finalyze) +      Py_Finalize(); +#endif /* HAVE_PYTHON */  } +  void pcilib_free_py(pcilib_t *ctx) {  #ifdef HAVE_PYTHON -    int finalyze = 0; -	 -    if (ctx->py) {		 -      if (ctx->py->finalyze) finalyze = 1; - -      if (ctx->py->script_hash) { -          pcilib_script_t *script, *script_tmp; - -          HASH_ITER(hh, ctx->py->script_hash, script, script_tmp) { -         Py_DECREF(script->module); -         HASH_DEL(ctx->py->script_hash, script); -         free(script); -          } -          ctx->py->script_hash = NULL; -      } - -      if (ctx->py->pcilib_pywrap) -          Py_DECREF(ctx->py->pcilib_pywrap); -       -           free(ctx->py); -           ctx->py = NULL; -    } -     -    if (finalyze) -	Py_Finalize(); +   pcilib_free_py_ctx(ctx->py); +   ctx->py = NULL;  #endif /* HAVE_PYTHON */  }  int pcilib_py_load_script(pcilib_t *ctx, const char *script_name) { +    return pcilib_py_ctx_load_script(ctx->py, script_name); +} + +int pcilib_py_ctx_load_script(pcilib_py_t *ctx_py, const char *script_name) {  #ifdef HAVE_PYTHON      PyObject* pymodule;      pcilib_script_t *module = NULL; @@ -252,7 +224,7 @@ int pcilib_py_load_script(pcilib_t *ctx, const char *script_name) {      }      *py = 0; -    HASH_FIND_STR(ctx->py->script_hash, script_name, module); +    HASH_FIND_STR(ctx_py->script_hash, script_name, module);      if (module) return 0;      pymodule = PyImport_ImportModule(module_name); @@ -266,7 +238,7 @@ int pcilib_py_load_script(pcilib_t *ctx, const char *script_name) {      module->module = pymodule;      module->name = script_name; -    HASH_ADD_KEYPTR(hh, ctx->py->script_hash, module->name, strlen(module->name), module); +    HASH_ADD_STR(ctx_py->script_hash, name, module);  #endif /* HAVE_PYTHON */      return 0;  } @@ -527,51 +499,218 @@ int pcilib_py_eval_string(pcilib_t *ctx, const char *codestr, pcilib_value_t *va  int pcilib_py_eval_func(pcilib_t *ctx, const char *script_name, const char *func_name, pcilib_value_t *val) {  #ifdef HAVE_PYTHON      int err = 0; +    PyObject *pyval = NULL; + +    if (val) { +      pyval = pcilib_get_value_as_pyobject(ctx, val, &err); +      if (err) return err; +    } + +    PyObject* pyret = pcilib_py_ctx_eval_func(ctx->py, script_name,  +                                             func_name, pyval, &err); +    if (err) return err; + +    if ((val)&&(pyret != Py_None)) +       err = pcilib_set_value_from_pyobject(ctx, val, pyret); + +    Py_DECREF(pyret); + +    return err; +#else /* HAVE_PYTHON */ +    pcilib_error("Python is not supported"); +    return PCILIB_ERROR_NOTSUPPORTED; +#endif /* HAVE_PYTHON */ +} + +pcilib_py_object* pcilib_py_ctx_eval_func(pcilib_py_t *ctx_py, +                                          const char *script_name, +                                          const char *func_name,  +                                          pcilib_py_object *pyval,  +                                          int *err) { +#ifdef HAVE_PYTHON      PyObject *pyfunc; -    PyObject *pyval = NULL, *pyret; +    PyObject *pyret;      pcilib_script_t *module = NULL; -    HASH_FIND_STR(ctx->py->script_hash, script_name, module); +    HASH_FIND_STR(ctx_py->script_hash, script_name, module);      if (!module) {        pcilib_error("Script (%s) is not loaded", script_name); -      return PCILIB_ERROR_NOTFOUND; -    } - -    if (val) { -      pyval = pcilib_get_value_as_pyobject(ctx, val, &err); -      if (err) return err; +      if(err) *err = PCILIB_ERROR_NOTFOUND; +      return NULL;      } - +         PyGILState_STATE gstate = PyGILState_Ensure();      pyfunc = PyUnicode_FromString(func_name);      if (!pyfunc) {        if (pyval) Py_DECREF(pyval);        PyGILState_Release(gstate); -      return PCILIB_ERROR_MEMORY; +      if(err) *err = PCILIB_ERROR_MEMORY; +      return NULL;      } -    pyret = PyObject_CallMethodObjArgs(module->module, pyfunc, ctx->py->pcilib_pywrap, pyval, NULL); +    pyret = PyObject_CallMethodObjArgs(module->module, +                                         pyfunc,  +                                         ctx_py->pcilib_pywrap,  +                                         pyval,  +                                         NULL);      Py_DECREF(pyfunc);      Py_DECREF(pyval); -	 +      if (!pyret) {        PyGILState_Release(gstate); -      pcilib_python_error("Error executing function (%s) of python script (%s)", func_name, script_name); +      pcilib_python_error("Error executing function (%s) of python " +                          "script (%s)", func_name, script_name); +      if(err) *err = PCILIB_ERROR_FAILED; +      return NULL; +    } +    PyGILState_Release(gstate); +     +    return pyret; +     +#else /* HAVE_PYTHON */ +    pcilib_error("Python is not supported"); +    if(err) *err = PCILIB_ERROR_NOTSUPPORTED; +    return NULL; +#endif /* HAVE_PYTHON */ +} + +int pcilib_py_ctx_add_script_dir(pcilib_py_t *ctx_py, const char *dir) { +#ifdef HAVE_PYTHON +    int err = 0; +    PyObject *pypath, *pynewdir; +    PyObject *pydict, *pystr, *pyret = NULL; + +    //const char *model_dir = getenv("PCILIB_MODEL_DIR"); +    //if (!model_dir) model_dir = PCILIB_MODEL_DIR; + +    pypath = PySys_GetObject("path"); +    if (!pypath) { +      pcilib_python_error("Can't get python path");        return PCILIB_ERROR_FAILED;      } -    if ((val)&&(pyret != Py_None)) -	   err = pcilib_set_value_from_pyobject(ctx, val, pyret); +    pynewdir = PyString_FromString(dir); +    if (!pynewdir) { +      pcilib_python_error("Can't create python string"); +      return PCILIB_ERROR_MEMORY; +    } -    Py_DECREF(pyret); -    PyGILState_Release(gstate); +    // Checking if the directory already in the path +    pydict = PyDict_New(); +    if (pydict) { +        pystr = PyString_FromString("cur"); +        if (pystr) { +            PyDict_SetItem(pydict, pystr, pynewdir); +            Py_DECREF(pystr); +        } else { +            pcilib_python_error("Can't create python string"); +            return PCILIB_ERROR_MEMORY; +        } -    return err; +        pystr = PyString_FromString("path"); +        if (pystr) { +            PyDict_SetItem(pydict, pystr, pypath); +            Py_DECREF(pystr); +        } else { +            pcilib_python_error("Can't create python string"); +            return PCILIB_ERROR_MEMORY; +        } + +        pyret = PyRun_String("cur in path", Py_eval_input, ctx_py->global_dict, pydict); +        Py_DECREF(pydict); + +    } else { +        pcilib_python_error("Can't create python dict"); +        return PCILIB_ERROR_MEMORY; +    } + +    if ((pyret == Py_False)&&(PyList_Append(pypath, pynewdir) == -1)) +       err = PCILIB_ERROR_FAILED; + +    if (pyret) Py_DECREF(pyret); +    Py_DECREF(pynewdir); + +    if (err) { +      pcilib_python_error("Can't add directory (%s) to python path", dir); +      return err; +    } +    return 0;  #else /* HAVE_PYTHON */      pcilib_error("Python is not supported");      return PCILIB_ERROR_NOTSUPPORTED;  #endif /* HAVE_PYTHON */  } + +pcilib_py_t* pcilib_init_py_ctx(pcilib_py_t* in, int *err) { +   pcilib_py_t* out = (pcilib_py_t*)malloc(sizeof(pcilib_py_t)); +   if (!out) { +      if(err) *err = PCILIB_ERROR_MEMORY; +      return NULL; +   } +    +   out->finalyze = 0; +   out->main_module = in->main_module;		 +   out->global_dict = in->global_dict; +   out->pcilib_pywrap = in->pcilib_pywrap; +   out->script_hash = NULL; +    +   if(err) *err = 0; +   return out; +} + +/*! + * \brief Wrap for PyDict_SetItem, with decrease reference counting after set. + */ +void pcilib_pydict_set_item(pcilib_py_object* dict, pcilib_py_object* name, pcilib_py_object* 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(pcilib_py_object* list, pcilib_py_object* value) +{ +    PyList_Append(list, value); +    Py_XDECREF(value); +} + +pcilib_py_object *pcilib_py_ctx_get_scripts_info(pcilib_py_t *ctx_py) { +    +   PyObject* pyList = PyList_New(0); +    +   if (ctx_py->script_hash) { +        pcilib_script_t *script, *script_tmp; + +         HASH_ITER(hh, ctx_py->script_hash, script, script_tmp) { +          +         PyObject* pylistItem = PyDict_New(); +         pcilib_pydict_set_item(pylistItem, +                                PyString_FromString("name"), +                                PyString_FromString(script->name)); +          +         PyObject* dict = PyModule_GetDict(script->module); +         if (dict) { +            PyObject* pystr = PyString_FromString("description"); +            if (pystr) { +               if (PyDict_Contains(dict, pystr)) { +                  PyDict_SetItem(pylistItem, +                                 pystr, +                                 PyDict_GetItem(dict, pystr)); +               } +               Py_DECREF(pystr); +            } +         } +         pcilib_pylist_append(pyList, pylistItem); +          +      } +   } +   return pyList; +} diff --git a/pcilib/py.h b/pcilib/py.h index c372a09..549eddf 100644 --- a/pcilib/py.h +++ b/pcilib/py.h @@ -118,6 +118,32 @@ int pcilib_py_eval_string(pcilib_t *ctx, const char *codestr, pcilib_value_t *va   */  int pcilib_py_eval_func(pcilib_t *ctx, const char *script, const char *func, pcilib_value_t *val); + +/** Clone pcilib_py_t content without scripts hash + *  @param[in] in	- pcilib_py_t content to clone + *  @param[out] err - error + *  @return 		- NULL or cloned pcilib_py_t content pointer on success + */ +pcilib_py_t* pcilib_init_py_ctx(pcilib_py_t* in, int *err); +pcilib_py_object* pcilib_py_ctx_eval_func(pcilib_py_t *ctx_py, +                                          const char *script_name, +                                          const char *func_name,  +                                          pcilib_py_object *pyval,  +                                          int *err); +int pcilib_py_ctx_add_script_dir(pcilib_py_t *ctx_py, const char *dir); +void pcilib_free_py_ctx(pcilib_py_t *ctx_py); +int pcilib_py_ctx_load_script(pcilib_py_t *ctx_py, const char *script_name); +pcilib_py_object *pcilib_py_ctx_get_scripts_info(pcilib_py_t *ctx_py); + +/*! + * \brief Wrap for PyDict_SetItem, with decrease reference counting after set. + */ +void pcilib_pydict_set_item(pcilib_py_object* dict, pcilib_py_object* name, pcilib_py_object* value); + +/*! + * \brief Wrap for PyList_Append, with decrease reference counting after append. + */ +void pcilib_pylist_append(pcilib_py_object* list, pcilib_py_object* value);  #ifdef __cplusplus  }  #endif 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; @@ -2,4 +2,8 @@  APP_PATH=`dirname $0` -PYTHONPATH="$APP_PATH/pywrap:$PYTHONPATH" PCILIB_MODEL_DIR="$APP_PATH/xml" LD_LIBRARY_PATH="$APP_PATH/pcilib" $* +PYTHONPATH="$APP_PATH/pywrap:$PYTHONPATH" \ +PCILIB_MODEL_DIR="$APP_PATH/xml" \ +LD_LIBRARY_PATH="$APP_PATH/pcilib" \ +PCILIB_SCRIPTS_DIR="$APP_PATH/xml/scripts" \ +$* diff --git a/xml/scripts/test_script.py b/xml/scripts/test_script.py new file mode 100644 index 0000000..16e4adb --- /dev/null +++ b/xml/scripts/test_script.py @@ -0,0 +1,4 @@ +description='this is a test script' + +def run(ctx, inpt): +   return ctx.get_registers_list(); diff --git a/xml/scripts/test_script2.py b/xml/scripts/test_script2.py new file mode 100644 index 0000000..16e4adb --- /dev/null +++ b/xml/scripts/test_script2.py @@ -0,0 +1,4 @@ +description='this is a test script' + +def run(ctx, inpt): +   return ctx.get_registers_list(); diff --git a/xml/test/test_prop_mt.py b/xml/test/test_prop_mt.py index f8c63d0..3714597 100644 --- a/xml/test/test_prop_mt.py +++ b/xml/test/test_prop_mt.py @@ -4,15 +4,15 @@ lock = threading.Lock()  def read_from_register(ctx, value):     with lock: -      ctx.lock('lock5') +      ctx.lock('lock12')        cur = read_from_register.counter        read_from_register.counter += 1 -      for i in range (0, 5): +      for i in range (0, 60):           time.sleep(0.1)           print cur        out = ctx.get_property('/test/prop3') / 2 -      ctx.unlock('lock5') +      ctx.unlock('lock12')        return out | 
