summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManuel Traut <manut@mecka.net>2012-06-03 18:38:55 +0200
committerManuel Traut <manut@mecka.net>2012-06-03 18:38:55 +0200
commit5a4291a430d1584d05382510449408f4d70327a9 (patch)
treec9d8b31c04e6d3040d62f59465d4af058c8050a7
parent539deb398f598acbe12b188b65a047c62f8157fb (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.cpp62
-rw-r--r--common/distrio_helper.h7
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() */