diff options
| author | Vasilii Chernov <vchernov@inr.ru> | 2016-02-24 18:24:22 +0100 | 
|---|---|---|
| committer | Vasilii Chernov <vchernov@inr.ru> | 2016-02-24 18:24:22 +0100 | 
| commit | b0a034e6ef4a958235a56ebde0831c0f30a84d30 (patch) | |
| tree | a1f46d2d536c692edd6b17efc61ac9fefef2796b /pywrap | |
| parent | da842568b94b0e00c1709ae01f441a7424c15b87 (diff) | |
| parent | 3ea1907f3169e0233d3a32a7d470af3c34b6f967 (diff) | |
| download | pcitool-b0a034e6ef4a958235a56ebde0831c0f30a84d30.tar.gz pcitool-b0a034e6ef4a958235a56ebde0831c0f30a84d30.tar.bz2 pcitool-b0a034e6ef4a958235a56ebde0831c0f30a84d30.tar.xz pcitool-b0a034e6ef4a958235a56ebde0831c0f30a84d30.zip  | |
Merge with Suren branch. Fix memory leaks.
Diffstat (limited to 'pywrap')
| -rw-r--r-- | pywrap/CMakeLists.txt | 10 | ||||
| -rw-r--r-- | pywrap/pcipywrap.c | 477 | ||||
| -rw-r--r-- | pywrap/pcipywrap.h | 4 | ||||
| -rw-r--r--[-rwxr-xr-x] | pywrap/test_pcipywrap.py | 18 | 
4 files changed, 252 insertions, 257 deletions
diff --git a/pywrap/CMakeLists.txt b/pywrap/CMakeLists.txt index bebdf2e..f1c909e 100644 --- a/pywrap/CMakeLists.txt +++ b/pywrap/CMakeLists.txt @@ -11,12 +11,12 @@ include_directories(  set(HEADERS pcipywrap.h)  #Creating python wrapping -INCLUDE(${SWIG_USE_FILE}) -INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) -SET(CMAKE_SWIG_FLAGS "") +include(${SWIG_USE_FILE}) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +set(CMAKE_SWIG_FLAGS "") -SWIG_ADD_MODULE(pcipywrap python pcipywrap.i pcipywrap.c) -SWIG_LINK_LIBRARIES(pcipywrap ${PYTHON_LIBRARIES} pcilib) +swig_add_module(pcipywrap python pcipywrap.i pcipywrap.c) +swig_link_libraries(pcipywrap ${PYTHON_LIBRARIES} pcilib)  #install pcilib python wrapper into Python site packages folder  execute_process ( COMMAND python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" OUTPUT_VARIABLE PYTHON_SITE_PACKAGES OUTPUT_STRIP_TRAILING_WHITESPACE) diff --git a/pywrap/pcipywrap.c b/pywrap/pcipywrap.c index a22dea9..fe53966 100644 --- a/pywrap/pcipywrap.c +++ b/pywrap/pcipywrap.c @@ -9,24 +9,24 @@ char* full_log = NULL;   */  char* vmake_str(const char* msg, va_list vl)  { -	char *buf; -	size_t sz; -	 -	va_list vl_copy; -	va_copy(vl_copy, vl); -	 -	sz = vsnprintf(NULL, 0, msg, vl); -	buf = (char *)malloc(sz + 1); -	 -	if(!buf) -	{ -		return NULL; -	} +    char *buf; +    size_t sz; -	vsnprintf(buf, sz+1, msg, vl_copy); -	va_end(vl_copy); -	 -	return buf; +    va_list vl_copy; +    va_copy(vl_copy, vl); + +    sz = vsnprintf(NULL, 0, msg, vl); +    buf = (char *)malloc(sz + 1); + +    if(!buf) +    { +        return NULL; +    } + +    vsnprintf(buf, sz+1, msg, vl_copy); +    va_end(vl_copy); + +    return buf;  } @@ -36,69 +36,69 @@ char* vmake_str(const char* msg, va_list vl)   */  char* make_str(const char* msg, ...)  { -	va_list vl; +    va_list vl;      va_start(vl, msg); -	char *buf = vmake_str(msg, vl); -	va_end(vl); -	return buf; +    char *buf = vmake_str(msg, vl); +    va_end(vl); +    return buf;  }  /*!   * \brief Version of pcilib_logger_t, that saves error text to Python exeption   */ -void pcilib_print_error_to_py(void *arg, const char *file, int line,  -							  pcilib_log_priority_t prio, const char *msg, -							  va_list va) {							   -	//wrap error message with file and line number -	char* buf_raw_msg = vmake_str(msg, va); -	char* buf_wrapped_message = make_str("%s [%s:%d]\n", buf_raw_msg, file, line); -	 -	if(prio == PCILIB_LOG_ERROR) -	{ -		if(!full_log) -			full_log = make_str(""); -			 -		//copy received message to log -		char* buf = full_log; -		full_log = make_str("%s%s", buf, buf_wrapped_message); -		free(buf); -	} -	else -		printf(buf_wrapped_message); -		 -	free(buf_wrapped_message); -	free(buf_raw_msg); +void pcilib_print_error_to_py(void *arg, const char *file, int line, +                              pcilib_log_priority_t prio, const char *msg, +                              va_list va) { +    //wrap error message with file and line number +    char* buf_raw_msg = vmake_str(msg, va); +    char* buf_wrapped_message = make_str("%s [%s:%d]\n", buf_raw_msg, file, line); + +    if(prio == PCILIB_LOG_ERROR) +    { +        if(!full_log) +            full_log = make_str(""); + +        //copy received message to log +        char* buf = full_log; +        full_log = make_str("%s%s", buf, buf_wrapped_message); +        free(buf); +    } +    else +        printf("%s", buf_wrapped_message); + +    free(buf_wrapped_message); +    free(buf_raw_msg);  }  void set_python_exception(const char* msg, ...)  { -	va_list vl; +    va_list vl;      va_start(vl, msg); -	char *buf = vmake_str(msg, vl); -	 -	char* wrapped_exeption; -	if(full_log) -		wrapped_exeption = make_str("%s\nprogramm error log:\n%s", buf, full_log); -	else -		wrapped_exeption = buf; -	 -	free(full_log); -	full_log = NULL; -	 -	PyErr_SetString(PyExc_Exception, wrapped_exeption); -	 -	free(buf); -	if(full_log) -		free(wrapped_exeption); -	va_end(vl); +    char *buf = vmake_str(msg, vl); + +    char* wrapped_exeption; +    if(full_log) +        wrapped_exeption = make_str("%s\nprogramm error log:\n%s", buf, full_log); +    else +        wrapped_exeption = buf; + +    free(full_log); +    full_log = NULL; + +    PyErr_SetString(PyExc_Exception, wrapped_exeption); + +    free(buf); +    if(full_log) +        free(wrapped_exeption); +    va_end(vl);  }  void __redirect_logs_to_exeption()  { -	pcilib_set_logger(pcilib_get_log_level(),  -					  pcilib_print_error_to_py, -					  pcilib_get_logger_context()); +    pcilib_set_logger(pcilib_get_log_level(), +                      pcilib_print_error_to_py, +                      pcilib_get_logger_context());  }  /*! @@ -126,14 +126,14 @@ void add_pcilib_value_to_dict(pcilib_t* ctx, PyObject* dict, pcilib_value_t* val  {      PyObject *py_val = (PyObject*)pcilib_get_value_as_pyobject(ctx, val, NULL); -	if(py_val) +    if(py_val)          pcilib_pydict_set_item(dict, -                              PyString_FromString(name), -                              py_val); -	else +                               PyString_FromString(name), +                               py_val); +    else          pcilib_pydict_set_item(dict, -                              PyString_FromString("defvalue"), -                              PyString_FromString("invalid")); +                               PyString_FromString("defvalue"), +                               PyString_FromString("invalid"));  }  PyObject * pcilib_convert_property_info_to_pyobject(pcilib_t* ctx, pcilib_property_info_t listItem) @@ -142,41 +142,41 @@ PyObject * pcilib_convert_property_info_to_pyobject(pcilib_t* ctx, pcilib_proper      if(listItem.name)          pcilib_pydict_set_item(pylistItem, -                   PyString_FromString("name"), -                   PyString_FromString(listItem.name)); +                               PyString_FromString("name"), +                               PyString_FromString(listItem.name));      if(listItem.description)          pcilib_pydict_set_item(pylistItem, -                   PyString_FromString("description"), -                   PyString_FromString(listItem.description)); +                               PyString_FromString("description"), +                               PyString_FromString(listItem.description)); -   if(listItem.path) +    if(listItem.path)          pcilib_pydict_set_item(pylistItem, -                   PyString_FromString("path"), -                   PyString_FromString(listItem.path)); +                               PyString_FromString("path"), +                               PyString_FromString(listItem.path));      //serialize types      const char* type = "invalid";      switch(listItem.type)      { -        case PCILIB_TYPE_INVALID: -            type = "invalid"; -            break; -        case PCILIB_TYPE_STRING: -             type = "string"; -             break; -        case PCILIB_TYPE_DOUBLE: -             type = "double"; -             break; -        case PCILIB_TYPE_LONG : -             type = "long"; -             break; -        default: -             break; +    case PCILIB_TYPE_INVALID: +        type = "invalid"; +        break; +    case PCILIB_TYPE_STRING: +        type = "string"; +        break; +    case PCILIB_TYPE_DOUBLE: +        type = "double"; +        break; +    case PCILIB_TYPE_LONG : +        type = "long"; +        break; +    default: +        break;      }      pcilib_pydict_set_item(pylistItem, -               PyString_FromString("type"), -               PyString_FromString(type)); +                           PyString_FromString("type"), +                           PyString_FromString(type));      //serialize modes @@ -192,8 +192,8 @@ PyObject * pcilib_convert_property_info_to_pyobject(pcilib_t* ctx, pcilib_proper          pcilib_pylist_append(modes, PyString_FromString("NO_CHK"));      pcilib_pydict_set_item(pylistItem, -                   PyString_FromString("mode"), -                   modes); +                           PyString_FromString("mode"), +                           modes);      //serialize flags      PyObject* flags = PyList_New(0); @@ -202,13 +202,13 @@ PyObject * pcilib_convert_property_info_to_pyobject(pcilib_t* ctx, pcilib_proper          pcilib_pylist_append(flags, PyString_FromString("childs"));      pcilib_pydict_set_item(pylistItem, -                   PyString_FromString("flags"), -                   flags); +                           PyString_FromString("flags"), +                           flags);      if(listItem.unit) -         pcilib_pydict_set_item(pylistItem, -                    PyString_FromString("unit"), -                    PyString_FromString(listItem.unit)); +        pcilib_pydict_set_item(pylistItem, +                               PyString_FromString("unit"), +                               PyString_FromString(listItem.unit));      return pylistItem;  } @@ -219,18 +219,18 @@ PyObject * pcilib_convert_register_info_to_pyobject(pcilib_t* ctx, pcilib_regist      if(listItem.name)          pcilib_pydict_set_item(pylistItem, -		                      PyString_FromString("name"), -		                      PyString_FromString(listItem.name)); +                               PyString_FromString("name"), +                               PyString_FromString(listItem.name));      if(listItem.description)          pcilib_pydict_set_item(pylistItem, -                              PyString_FromString("description"), -                              PyString_FromString(listItem.description)); +                               PyString_FromString("description"), +                               PyString_FromString(listItem.description)); -   if(listItem.bank) +    if(listItem.bank)          pcilib_pydict_set_item(pylistItem, -                              PyString_FromString("bank"), -                              PyString_FromString(listItem.bank)); +                               PyString_FromString("bank"), +                               PyString_FromString(listItem.bank));      //serialize modes      PyObject* modes = PyList_New(0); @@ -253,27 +253,27 @@ PyObject * pcilib_convert_register_info_to_pyobject(pcilib_t* ctx, pcilib_regist          pcilib_pylist_append(modes, PyString_FromString("NO_CHK"));      pcilib_pydict_set_item(pylistItem, -						  PyString_FromString("mode"), -                          modes); -                   +                           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); -		 +        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); +                               PyString_FromString("range"), +                               range);      }      if(listItem.values) @@ -283,36 +283,36 @@ PyObject * pcilib_convert_register_info_to_pyobject(pcilib_t* ctx, pcilib_regist          for (int j = 0; listItem.values[j].name; j++)          {              PyObject* valuesItem = PyDict_New(); -             +              pcilib_value_t val = {0}; -			pcilib_set_value_from_register_value(ctx, &val, listItem.values[j].value); +            pcilib_set_value_from_register_value(ctx, &val, listItem.values[j].value); + +            pcilib_value_t min = {0}; +            pcilib_set_value_from_register_value(ctx, &min, listItem.values[j].min); + +            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); -		 -			pcilib_value_t max = {0}; -			pcilib_set_value_from_register_value(ctx, &max, listItem.values[j].max); -                          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");              if(listItem.values[j].name)                  pcilib_pydict_set_item(valuesItem, -									  PyString_FromString("name"), -									  PyString_FromString(listItem.values[j].name)); +                                       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)); +									            PyString_FromString("description"), +									            PyString_FromString(listItem.values[j].description));              pcilib_pylist_append(values, valuesItem);          }          pcilib_pydict_set_item(pylistItem, -                              PyString_FromString("values"), -                              values); +                               PyString_FromString("values"), +                               values);      }      return pylistItem; @@ -320,163 +320,160 @@ PyObject * pcilib_convert_register_info_to_pyobject(pcilib_t* ctx, pcilib_regist  Pcipywrap *new_Pcipywrap(const char* fpga_device, const char* model)  { -	//opening device +    //opening device      pcilib_t* ctx = pcilib_open(fpga_device, model);      if(!ctx)      { -		set_python_exception("Failed pcilib_open(%s, %s)", fpga_device, model); -		return NULL; -	} -	Pcipywrap *self; -	self = (Pcipywrap *) malloc(sizeof(Pcipywrap)); -	self->shared = 0; -	self->ctx = ctx; -	return self; +        set_python_exception("Failed pcilib_open(%s, %s)", fpga_device, model); +        return NULL; +    } +    Pcipywrap *self; +    self = (Pcipywrap *) malloc(sizeof(Pcipywrap)); +    self->shared = 0; +    self->ctx = ctx; +    return self;  }  Pcipywrap *create_Pcipywrap(PyObject* ctx)  { -	if(!PyCObject_Check(ctx)) -	{ +    if(!PyCObject_Check(ctx)) +    {          set_python_exception("Incorrect ctx type. Only PyCObject is allowed"); -		return NULL; -	} -	 -	Pcipywrap *self; -	self = (Pcipywrap *) malloc(sizeof(Pcipywrap)); -	self->shared = 1; -	self->ctx = PyCObject_AsVoidPtr(ctx); -	return self; +        return NULL; +    } + +    Pcipywrap *self; +    self = (Pcipywrap *) malloc(sizeof(Pcipywrap)); +    self->shared = 1; +    self->ctx = PyCObject_AsVoidPtr(ctx); +    return self;  } -void delete_Pcipywrap(Pcipywrap *self) {	 -	if(!self->shared) -		pcilib_close(self->ctx); -		 -	free(self); +void delete_Pcipywrap(Pcipywrap *self) { +    if(!self->shared) +        pcilib_close(self->ctx); + +    free(self);  }  PyObject* Pcipywrap_read_register(Pcipywrap *self, const char *regname, const char *bank)  { -	pcilib_value_t val = {0}; +    pcilib_value_t val = {0};      pcilib_register_value_t reg_value; -	 -	int err;  -	 -	err = pcilib_read_register(self->ctx, bank, regname, ®_value); -	if(err) -	{ -		set_python_exception("Failed pcilib_read_register"); -		return NULL; -	} -	 -	err = pcilib_set_value_from_register_value(self->ctx, &val, reg_value); -	if(err) -	{ -		set_python_exception("Failed pcilib_set_value_from_register_value"); -		return NULL; -	} + +    int err; + +    err = pcilib_read_register(self->ctx, bank, regname, ®_value); +    if(err) +    { +        set_python_exception("Failed pcilib_read_register"); +        return NULL; +    } + +    err = pcilib_set_value_from_register_value(self->ctx, &val, reg_value); +    if(err) +    { +        set_python_exception("Failed pcilib_set_value_from_register_value"); +        return NULL; +    }      return pcilib_get_value_as_pyobject(self->ctx, &val, NULL);  }  PyObject* Pcipywrap_write_register(Pcipywrap *self, PyObject* val, const char *regname, const char *bank)  { -	pcilib_value_t val_internal = {0}; +    pcilib_value_t val_internal = {0};      pcilib_register_value_t reg_value; -	 -	int err;  -	 + +    int err; +      err = pcilib_set_value_from_pyobject(self->ctx, &val_internal, val); -	 -	if(err) -	{ -		set_python_exception("Failed pcilib_set_value_from_pyobject"); -		return NULL; -	} -	 -	 -	reg_value = pcilib_get_value_as_register_value(self->ctx, &val_internal, &err); -	if(err) -	{ -		set_python_exception("Failed pcilib_set_value_from_pyobject, (error %i)", err); -		return NULL; -	} -	 -	err = pcilib_write_register(self->ctx, bank, regname, reg_value); -	 -	if(err) -	{ -		set_python_exception("Failed pcilib_set_value_from_pyobject, (error %i)", err); -		return NULL; -	} -	 + +    if(err) +    { +        set_python_exception("Failed pcilib_set_value_from_pyobject"); +        return NULL; +    } + + +    reg_value = pcilib_get_value_as_register_value(self->ctx, &val_internal, &err); +    if(err) +    { +        set_python_exception("Failed pcilib_set_value_from_pyobject, (error %i)", err); +        return NULL; +    } + +    err = pcilib_write_register(self->ctx, bank, regname, reg_value); + +    if(err) +    { +        set_python_exception("Failed pcilib_set_value_from_pyobject, (error %i)", err); +        return NULL; +    } +      return PyInt_FromLong((long)1);  }  PyObject* Pcipywrap_get_property(Pcipywrap *self, const char *prop) -{	 -	int err; -	pcilib_value_t val = {0}; -	 -	err  = pcilib_get_property(self->ctx, prop, &val); -	 -	if(err) -	{ -		set_python_exception("Failed pcilib_get_property, (error %i)", err); -		return NULL; -	} -	 +{ +    int err; +    pcilib_value_t val = {0}; + +    err  = pcilib_get_property(self->ctx, prop, &val); + +    if(err) +    { +        set_python_exception("Failed pcilib_get_property, (error %i)", err); +        return NULL; +    } +      return pcilib_get_value_as_pyobject(self->ctx, &val, NULL);  }  PyObject* Pcipywrap_set_property(Pcipywrap *self, PyObject* val, const char *prop)  { -	int err; -	 -	pcilib_value_t val_internal = {0}; +    int err; + +    pcilib_value_t val_internal = {0};      err = pcilib_set_value_from_pyobject(self->ctx, &val_internal, val); -	if(err) -	{ -		set_python_exception("pcilib_set_value_from_pyobject, (error %i)", err); -		return NULL; -	} -	 -	err  = pcilib_set_property(self->ctx, prop, &val_internal); -	if(err) -	{ -		set_python_exception("pcilib_set_property, (error %i)", err); -		return NULL; -	} -	 -	return PyInt_FromLong((long)1); +    if(err) +    { +        set_python_exception("pcilib_set_value_from_pyobject, (error %i)", err); +        return NULL; +    } + +    err  = pcilib_set_property(self->ctx, prop, &val_internal); +    if(err) +    { +        set_python_exception("pcilib_set_property, (error %i)", err); +        return NULL; +    } + +    return PyInt_FromLong((long)1);  }  PyObject* Pcipywrap_get_registers_list(Pcipywrap *self, const char *bank)  { -	pcilib_register_info_t *list = pcilib_get_register_list(self->ctx, bank, PCILIB_LIST_FLAGS_DEFAULT); -	 -	PyObject* pyList = PyList_New(0); -    for(int i = 0; i < ((pcilib_t*)self->ctx)->num_reg; i++) +    pcilib_register_info_t *list = pcilib_get_register_list(self->ctx, bank, PCILIB_LIST_FLAGS_DEFAULT); +    PyObject* pyList = PyList_New(0); +    for(int i = 0; i < 10/*((pcilib_t*)self->ctx)->num_reg*/; i++)      { -		//serialize item attributes +        //serialize item attributes          PyObject* pylistItem = pcilib_convert_register_info_to_pyobject(self->ctx, list[i]);          pcilib_pylist_append(pyList, pylistItem);      } -          pcilib_free_register_info(self->ctx, list); -	 -	return pyList; +    return pyList;  }  PyObject* Pcipywrap_get_register_info(Pcipywrap *self, const char* reg,const char *bank)  {      pcilib_register_info_t *info = pcilib_get_register_info(self->ctx, bank, reg, PCILIB_LIST_FLAGS_DEFAULT); -	if(!info) -	{ +    if(!info) +    {          return NULL; -	} +    }      PyObject* py_info = pcilib_convert_register_info_to_pyobject(self->ctx, info[0]); diff --git a/pywrap/pcipywrap.h b/pywrap/pcipywrap.h index 47d91b7..5876a06 100644 --- a/pywrap/pcipywrap.h +++ b/pywrap/pcipywrap.h @@ -6,8 +6,8 @@  #include <Python.h>  typedef struct { -  void* ctx; -  int shared; +    void* ctx; +    int shared;  } Pcipywrap;  /*! diff --git a/pywrap/test_pcipywrap.py b/pywrap/test_pcipywrap.py index 1b6c942..d736639 100755..100644 --- a/pywrap/test_pcipywrap.py +++ b/pywrap/test_pcipywrap.py @@ -84,15 +84,13 @@ class test_pcipywrap():           while(1):              val = random.randint(0, 8096)              self.pcilib = pcipywrap.Pcipywrap(self.device, self.model) -            print self.pcilib.get_property_list(self.branch) -            print self.pcilib.get_register_info(self.register) -            print self.pcilib.get_registers_list(); -          -            print self.pcilib.read_register(self.register) -            print self.pcilib.write_register(val, self.register) -          -            print self.pcilib.get_property(self.prop) -            print self.pcilib.set_property(val, self.prop) +            #print self.pcilib.get_property_list(self.branch) +            #print self.pcilib.get_register_info(self.register) +            #print self.pcilib.get_registers_list(); +            #print self.pcilib.read_register(self.register) +            #print self.pcilib.write_register(val, self.register) +            #print self.pcilib.get_property(self.prop) +            #print self.pcilib.set_property(val, self.prop)        except KeyboardInterrupt:           print 'testing done'           pass @@ -263,5 +261,5 @@ if __name__ == '__main__':     if opts.unlock_global:        lib.testLocking(4)       if(opts.get_server_message): -      lib.testLocking(5)   +      lib.testLocking(5)  | 
