summaryrefslogtreecommitdiff
path: root/common/distrio_helper.cpp
diff options
context:
space:
mode:
authorManuel Traut <manut@mecka.net>2012-06-08 01:21:44 +0200
committerManuel Traut <manut@mecka.net>2012-06-08 01:21:44 +0200
commit47074177e4d6675918684fad34a6b5fe39c380e7 (patch)
treeaa687d822069ea5043c6d1da0cfea77f1ff4b073 /common/distrio_helper.cpp
parent1a3ca3c5dbcb261658139110d51c3e2fb7b01146 (diff)
libdistrio_common: make lookups by name more robust
- check for corba exceptions Signed-off-by: Manuel Traut <manut@mecka.net>
Diffstat (limited to 'common/distrio_helper.cpp')
-rw-r--r--common/distrio_helper.cpp30
1 files changed, 24 insertions, 6 deletions
diff --git a/common/distrio_helper.cpp b/common/distrio_helper.cpp
index 1efa79f..fa55d4c 100644
--- a/common/distrio_helper.cpp
+++ b/common/distrio_helper.cpp
@@ -87,6 +87,16 @@ int run_orb ()
return 0;
}
+int join_orb ()
+{
+ if (ref.init != ORB_RUNNING) {
+ std::cerr << "corba orb not running" << std::endl;
+ return -1;
+ }
+
+ return pthread_join (orb_thread, NULL);
+}
+
int register_digital (Distrio_Digital_i *digital)
{
CosNaming::Name name;
@@ -260,9 +270,13 @@ void lookup_analog (std::string _name, Distrio::Analog_list_var ana_list,
::CORBA::String_var name;
Distrio::Error *e;
- e = ana_list[i]->name (name);
- free (e);
-
+ try {
+ e = ana_list[i]->name (name);
+ if (!::CORBA::is_nil (e))
+ free (e);
+ } catch (::CORBA::Exception &ex) {
+ std::cerr << "get name of analog io failed\n" << ex << std::cerr;
+ }
if (! _name.compare (name.in ())) {
*ptr = ana_list[i];
return;
@@ -281,9 +295,13 @@ void lookup_digital (std::string _name, Distrio::Digital_list_var dig_list,
::CORBA::String_var name;
Distrio::Error *e;
- e = dig_list[i]->name (name);
- free (e);
-
+ try {
+ e = dig_list[i]->name (name);
+ if (!::CORBA::is_nil (e))
+ free (e);
+ } catch (::CORBA::Exception &ex) {
+ std::cerr << "get name of digital io failed\n" << ex << std::cerr;
+ }
if (! _name.compare (name.in ())) {
*ptr = dig_list[i];
return;