[pytango] 69/483: first attempt to make it windows friendly
Sandor Bodo-Merle
sbodomerle-guest at moszumanska.debian.org
Thu Sep 28 19:14:25 UTC 2017
This is an automated email from the git hooks/post-receive script.
sbodomerle-guest pushed a commit to annotated tag bliss_8.10
in repository pytango.
commit 721f8605babae987be067a85edd64874699ce0dc
Author: tiagocoutinho <tiagocoutinho at 4e9c00fd-8f2e-0410-aa12-93ce3db5e235>
Date: Mon Nov 28 15:46:19 2011 +0000
first attempt to make it windows friendly
git-svn-id: http://svn.code.sf.net/p/tango-cs/code/bindings/PyTango/trunk@18504 4e9c00fd-8f2e-0410-aa12-93ce3db5e235
---
src/server/tango_util.cpp | 97 +++++++++++++++++++++++++++++++++++++----------
1 file changed, 77 insertions(+), 20 deletions(-)
diff --git a/src/server/tango_util.cpp b/src/server/tango_util.cpp
index 9bf6b2d..e85a3ee 100644
--- a/src/server/tango_util.cpp
+++ b/src/server/tango_util.cpp
@@ -33,21 +33,87 @@
using namespace boost::python;
-/// @todo GET RID OF THIS!! I HATE "HERE_OLD_TANGO___"
-#ifndef WIN32
-# define HERE_OLD_TANGO___
-#endif
+#ifndef _TG_WINDOWS_
+#include <unistd.h>
+#include <signal.h>
+#include <dlfcn.h>
+#endif /* _TG_WINDOWS_ */
-#ifdef HERE_OLD_TANGO___
- void Tango::DServer::class_factory()
+typedef Tango::DeviceClass *(*Cpp_creator_ptr)(const char *);
+
+Tango::DeviceClass* create_cpp_class(const std::string& class_name,
+ const std::string& par_name)
+{
+ std::string lib_name = class_name;
+ std::string sym_name = "_create_" + class_name + "_class";
+
+#ifdef _TG_WINDOWS_
+ HMODULE mod;
+
+ if ((mod = LoadLibrary(lib_name.c_str())) == NULL)
+ {
+ char *str = 0;
+
+ DWORD l_err = GetLastError();
+ ::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL,
+ l_err,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(char *)&str,0,NULL);
+
+ cerr << "Error: " << str << endl;
+
+ TangoSys_OMemStream o;
+ o << "Trying to load shared library " << lib_name
+ << " failed. It returns error: " << str << ends;
+ ::LocalFree((HLOCAL)str);
+
+ Tango::Except::throw_exception("API_ClassNotFound", o.str(),
+ "DServer::create_cpp_class");
+ }
+ FARPROC proc;
+
+ if ((proc = GetProcAddress(mod,sym_name.c_str())) == NULL)
{
- Tango::DServer* dserver = this;
+ TangoSys_OMemStream o;
+ o << "Class " << cl_name << " does not have the C creator function "
+ "(_create_<Class name>_class)" << ends;
+
+ Tango::Except::throw_exception("API_ClassNotFound", o.str(),
+ "DServer::create_cpp_class");
+ }
+ Cpp_creator_ptr mt = (Cpp_creator_ptr)proc;
#else
+ lib_name += ".so";
+
+ void *lib_ptr = dlopen(lib_name.c_str(), RTLD_NOW);
+ if (lib_ptr == NULL)
+ {
+ TangoSys_OMemStream o;
+ o << "Trying to load shared library " << lib_name
+ << " failed. It returns error: " << dlerror() << ends;
+
+ Tango::Except::throw_exception("API_ClassNotFound",o.str(),
+ "DServer::create_cpp_class");
+ }
+
+ void *sym = dlsym(lib_ptr,sym_name.c_str());
+ if (sym == NULL)
+ {
+ TangoSys_OMemStream o;
+ o << "Class " << class_name << " does not have the C creator function "
+ "(_create_<Class name>_class)" << ends;
+
+ Tango::Except::throw_exception("API_ClassNotFound", o.str(),
+ "DServer::create_cpp_class");
+ }
+ Cpp_creator_ptr mt = (Cpp_creator_ptr)sym;
+#endif /* _TG_WINDOWS_ */
+ Tango::DeviceClass *dc = (*mt)(par_name.c_str());
+ return dc;
+}
+
namespace PyUtil
{
void _class_factory(Tango::DServer* dserver)
{
-#endif
AutoPythonGIL guard;
PYTANGO_MOD
@@ -62,7 +128,8 @@ namespace PyUtil
tuple class_info = extract<tuple>(cpp_class_list[i]);
char *class_name = extract<char *>(class_info[0]);
char *par_name = extract<char *>(class_info[1]);
- dserver->create_cpp_class(class_name, par_name);
+ Tango::DeviceClass* cpp_dc = create_cpp_class(class_name, par_name);
+ dserver->_add_class(cpp_dc);
}
//
@@ -82,22 +149,12 @@ namespace PyUtil
}
}
-#ifdef HERE_OLD_TANGO___
-namespace PyUtil
-{
- void server_init(Tango::Util & instance, bool with_window = false)
- {
- AutoPythonAllowThreads guard;
- instance.server_init(with_window);
- }
-#else
void server_init(Tango::Util & instance, bool with_window = false)
{
AutoPythonAllowThreads guard;
- instance.set_class_factory_cb(_class_factory);
+ Tango::DServer::register_class_factory(_class_factory);
instance.server_init(with_window);
}
-#endif
void server_run(Tango::Util & instance)
{
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/pytango.git
More information about the debian-science-commits
mailing list