00001
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include <stdlib.h>
00036 #include <string.h>
00037 #include <pthread.h>
00038
00039 #include "sensingC.h"
00040 #include "sensix.h"
00041 #include "sense_discover.h"
00042 #include "sense_impl.h"
00043 #include "discovery_service.h"
00044 #include "corba_discovery.h"
00045
00046 using namespace sensix;
00047
00048
00049 extern pthread_mutex_t orb_mutex;
00050 extern CORBA::ORB_var global_orb;
00051
00052 pthread_mutex_t sibling_mutex = PTHREAD_MUTEX_INITIALIZER;
00053 bool_t siblings_running = false;
00054
00055
00056 static void _run(Request_var sensix_service)
00057 {
00058 pthread_mutex_lock(&sibling_mutex);
00059 while(siblings_running) {
00060 pthread_mutex_unlock(&sibling_mutex);
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 pthread_mutex_lock(&sibling_mutex);
00084 }
00085 pthread_mutex_unlock(&sibling_mutex);
00086 }
00087
00088
00089 static void _shutdown(int sig)
00090 {
00091 pthread_mutex_lock(&sibling_mutex);
00092 siblings_running = false;
00093 pthread_mutex_unlock(&sibling_mutex);
00094 }
00095
00096
00097 static void _client(unsigned char which, void *arguments)
00098 {
00099 Request_var sensix_service;
00100 struct args *a;
00101
00102 if (arguments == NULL)
00103 die("Siblings thread", "nil arguments");
00104 a = (struct args*)arguments;
00105
00106 pthread_mutex_lock(&orb_mutex);
00107 pthread_mutex_unlock(&orb_mutex);
00108
00109 siblings_running = true;
00110 log_info("%s: SENSIX client for siblings\n", APP);
00111
00112 try {
00113 CORBA::Object_var tmp = discover_object(0, a->level,
00114 global_orb);
00115 sensix_service = Request::_narrow(tmp.in());
00116 _run(sensix_service);
00117
00118 pthread_mutex_lock(&orb_mutex);
00119
00120 }
00121 catch (CORBA::Exception &ex) {
00122 log_error("%s: Clients CORBA exception - %s\n", APP, ex._info().c_str());
00123 }
00124 pthread_mutex_unlock(&orb_mutex);
00125
00126 log_info("%s: Siblings client closing\n", APP);
00127 }
00128
00129
00130
00131 void siblings_shutdown(int sig)
00132 {
00133 _shutdown(sig);
00134 }
00135
00136
00137 void *siblings_client(void *arguments)
00138 {
00139 _client(SIBLINGS, arguments);
00140 return NULL;
00141 }
00142
00143
00144 void descendants_shutdown(int sig)
00145 {
00146 _shutdown(sig);
00147 }
00148
00149
00150 void *descendants_client(void *arguments)
00151 {
00152 _client(DESCENDANTS, arguments);
00153 return NULL;
00154 }
00155