diff options
| author | Manuel Traut <manut@mecka.net> | 2012-06-03 18:38:55 +0200 |
|---|---|---|
| committer | Manuel Traut <manut@mecka.net> | 2012-06-03 18:38:55 +0200 |
| commit | 5a4291a430d1584d05382510449408f4d70327a9 (patch) | |
| tree | c9d8b31c04e6d3040d62f59465d4af058c8050a7 | |
| parent | 539deb398f598acbe12b188b65a047c62f8157fb (diff) | |
libdistrio_common: corba helpers orb needs to run in thread
- otherwise registration of objects won't work
- because orb has to host objects which will be registered
-> id (7) is a callback which cant be called if not hosted
Signed-off-by: Manuel Traut <manut@mecka.net>
| -rw-r--r-- | common/distrio_helper.cpp | 62 | ||||
| -rw-r--r-- | common/distrio_helper.h | 7 |
2 files changed, 49 insertions, 20 deletions
diff --git a/common/distrio_helper.cpp b/common/distrio_helper.cpp index 07ac538..2f49941 100644 --- a/common/distrio_helper.cpp +++ b/common/distrio_helper.cpp @@ -4,13 +4,13 @@ */ #include <iostream> - #include "distrio_helper.h" int init_corba (int argc, char **argv) { int ret = 0; - CORBA::Object_var obj, root_poa, naming_service; + CORBA::Object_var obj, root_poa, naming_service, manager_obj; + CosNaming::Name name; try { ref.orb = CORBA::ORB_init (argc, argv); @@ -29,13 +29,28 @@ int init_corba (int argc, char **argv) ret = -EINVAL; goto out; } + name.length (1); + name[0].id = CORBA::string_dup ("distrio_manager"); + name[0].kind = CORBA::string_dup (""); + manager_obj = ref.nc->resolve (name); + if (CORBA::is_nil (manager_obj)) { + std::cerr << "can't resolve distrio_manager @naming service" << std::endl; + ret = -EINVAL; + goto out; + } + ref.manager = Distrio::Manager::_narrow (manager_obj); + if (CORBA::is_nil (ref.manager)) { + std::cerr << "resolved invalid distrio_manager object" << std::endl; + ret = -EINVAL; + goto out; + } } catch (CORBA::Exception &e) { std::cerr << "CORBA initialization failed: " << e << std::endl; ret = -EINVAL; goto out; } - ref.init = 1; + ref.init = ORB_INIT; out: return ret; @@ -46,10 +61,10 @@ int register_digital (std::string _name, Distrio_Digital_i *digital) CosNaming::Name name; CORBA::Object_var obj, manager_obj; PortableServer::ObjectId_var oid; - Distrio::Manager_var manager; Distrio::Digital_ptr ptr; + Distrio::Error *e; - if (!ref.init) { + if (ref.init != ORB_RUNNING) { std::cerr << "corba not initialized" << std::endl; return -1; } @@ -68,37 +83,46 @@ int register_digital (std::string _name, Distrio_Digital_i *digital) } try { - name[0].id = CORBA::string_dup ("distrio_manager"); - name[0].kind = CORBA::string_dup (""); - manager_obj = ref.nc->resolve (name); - manager = Distrio::Manager::_narrow (manager_obj); ptr = Distrio::Digital::_narrow (obj); - manager->register_io_digital (ptr); - } catch (CORBA::Exception &e) { + e = ref.manager->register_io_digital (ptr); + std::cout << e->description << std::endl; + free (e); + } catch (CORBA::Exception &_e) { std::cerr << "CORBA register digital io at distrio manager failed: " - << e << std::endl; + << _e << std::endl; return -1; } return 0; } -int run_orb () -{ - if (!ref.init) { - std::cerr << "corba not initialized" << std::endl; - return -1; - } +pthread_t orb_thread; +void *orb_runner (void *args) +{ try { ref.poa_mgr = ref.poa->the_POAManager (); ref.poa_mgr->activate (); ref.orb->run (); ref.orb->destroy (); } catch (CORBA::Exception &e) { - std::cerr << "CORBA initialization failed: " << e << std::endl; + std::cerr << "run CORBA orb failed: " << e << std::endl; + } +} + +int run_orb () +{ + if (ref.init != ORB_INIT) { + std::cerr << "corba not initialized or orb already running" << std::endl; return -1; } + if (pthread_create (&orb_thread, NULL, orb_runner, NULL)) { + std::cerr << "create thread for corba orb failed" << std::endl; + return -1; + } + + ref.init = ORB_RUNNING; + return 0; } diff --git a/common/distrio_helper.h b/common/distrio_helper.h index 7bad2de..da1e290 100644 --- a/common/distrio_helper.h +++ b/common/distrio_helper.h @@ -17,6 +17,10 @@ #include <orbsvcs/CosNamingC.h> +#define ORB_NOT_INITIALIZED 0 +#define ORB_INIT 1 +#define ORB_RUNNING 2 + /** * handle to corba objects needed for registration of new objects and running * the ORB @@ -28,10 +32,11 @@ typedef struct _corba_ref { PortableServer::POA_var poa; PortableServer::POAManager_var poa_mgr; CosNaming::NamingContext_var nc; + Distrio::Manager_var manager; } corba_ref; static corba_ref ref = { - .init = 0, + .init = ORB_NOT_INITIALIZED, }; /** initialize corba orb - argc, argv as passed to main() */ |
