summaryrefslogtreecommitdiff
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
parent1a3ca3c5dbcb261658139110d51c3e2fb7b01146 (diff)
libdistrio_common: make lookups by name more robust
- check for corba exceptions Signed-off-by: Manuel Traut <manut@mecka.net>
-rw-r--r--common/distrio_helper.cpp30
-rw-r--r--common/distrio_helper.h2
2 files changed, 26 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;
diff --git a/common/distrio_helper.h b/common/distrio_helper.h
index 0a571db..f0ad95c 100644
--- a/common/distrio_helper.h
+++ b/common/distrio_helper.h
@@ -43,6 +43,8 @@ static corba_ref ref = {
int init_corba (int argc, char **argv);
/** run the orb - function starts orb in new thread and returns */
int run_orb (void);
+/** join the orb - function blocks until orb is shutdown */
+int join_orb (void);
/** register a digital io with a common name at the naming service */
int register_digital (Distrio_Digital_i *digital);