#include <Endpoint_Strategy.h>
Inheritance diagram for TAO_AV_Endpoint_Process_Strategy:


Public Member Functions | |
| TAO_AV_Endpoint_Process_Strategy (ACE_Process_Options *process_options) | |
| virtual | ~TAO_AV_Endpoint_Process_Strategy (void) |
| Destructor. | |
| virtual int | activate (void) |
Protected Member Functions | |
| virtual int | bind_to_naming_service (void) |
| Bind to the naming service. | |
| virtual int | get_stream_endpoint (void)=0 |
| virtual int | get_vdev (void) |
Protected Attributes | |
| CosNaming::NamingContext_var | naming_context_ |
| Naming context. | |
| ACE_Process_Options * | process_options_ |
| Name and arguments for the process to be created. | |
| char | host_ [MAXHOSTNAMELEN] |
| name of this host used for resolving unique names. | |
| pid_t | pid_ |
| My child's process id. | |
Definition at line 76 of file Endpoint_Strategy.h.
|
|
Constructor. The process_options contain the name and arguments for the process to be created Definition at line 71 of file Endpoint_Strategy.cpp. References ACE_OS::hostname().
00072 : process_options_ (process_options), 00073 pid_ (-1) 00074 { 00075 ACE_OS::hostname (this->host_, 00076 sizeof this->host_); 00077 } |
|
|
Destructor.
Definition at line 80 of file Endpoint_Strategy.cpp.
00081 {
00082 }
|
|
|
creates a new child process, and waits on a semaphore until the child process has finished creating the endpoints Definition at line 89 of file Endpoint_Strategy.cpp. References ACE_DEBUG, ACE_ERROR_RETURN, ACE_Process_Semaphore::acquire(), bind_to_naming_service(), get_stream_endpoint(), get_vdev(), ACE_OS::kill(), LM_DEBUG, LM_ERROR, ACE_Process_Semaphore::remove(), ACE_Process::spawn(), and ACE_OS::sprintf(). Referenced by TAO_AV_Endpoint_Process_Strategy_A::create_A(), and TAO_AV_Endpoint_Process_Strategy_B::create_B().
00090 {
00091 ACE_Process process;
00092
00093 // Create a new process to contain this endpoint
00094 this->pid_ = process.spawn (*this->process_options_);
00095
00096 // Process creation failed
00097 if (this->pid_ == -1)
00098 ACE_ERROR_RETURN ((LM_ERROR,
00099 "(%P|%t) ACE_Process:: spawn failed: %p\n",
00100 "spawn"),
00101 -1);
00102
00103 // Create a unique semaphore name, using my hostname, and pid.
00104 char sem_str [BUFSIZ];
00105
00106 // create a unique semaphore name
00107 ACE_OS::sprintf (sem_str,
00108 "%s:%s:%ld",
00109 "TAO_AV_Process_Semaphore",
00110 this->host_,
00111 static_cast<long int> (this->pid_));
00112
00113 ACE_DEBUG ((LM_DEBUG,
00114 "(%P|%t) semaphore is %s\n",
00115 sem_str));
00116 // Create the semaphore
00117 ACE_Process_Semaphore semaphore (0, // 0 means that the
00118 // semaphore is locked initially
00119 sem_str);
00120
00121 // wait until the child finishes booting
00122 while (1)
00123 {
00124 if (semaphore.acquire () == -1)
00125 {
00126 // See if my child process is still alive -- if not, return an error
00127 if (ACE_OS::kill (this->pid_,
00128 0) == -1)
00129 ACE_ERROR_RETURN ((LM_ERROR,
00130 "(%P|%t) Process_Strategy: Process being waited on died unexpectedly.\n"),
00131 -1);
00132 // if we were not interrupted due to a EINTR, break
00133 if (errno != EINTR)
00134 break;
00135 }
00136 else
00137 break;
00138 }
00139
00140 // The job of the semaphore is done, remove it.
00141 if (semaphore.remove () == -1)
00142 ACE_ERROR_RETURN ((LM_ERROR,
00143 "(%P|%t) semaphore remove failed: %p\n",
00144 "remove"),
00145 -1);
00146
00147 try
00148 {
00149 // Get ourselves a Naming service
00150 this->bind_to_naming_service ();
00151
00152 // Get the stream endpoint created by the child from the naming service
00153 this->get_stream_endpoint ();
00154
00155 // Get the Vdev created by the child from the naming service
00156 this->get_vdev ();
00157 }
00158 catch (const CORBA::Exception& ex)
00159 {
00160 ex._tao_print_exception (
00161 "TAO_AV_Endpoint_Process_Strategy::activate");
00162 return -1;
00163 }
00164 return 0;
00165 }
|
|
|
Bind to the naming service.
Definition at line 169 of file Endpoint_Strategy.cpp. References ACE_ERROR_RETURN, CORBA::is_nil(), LM_ERROR, naming_context_, TAO_ORB_Core::orb(), and TAO_ORB_Core_instance(). Referenced by activate().
00170 {
00171 try
00172 {
00173 if (CORBA::is_nil (this->naming_context_.in ()) == 0)
00174 return 0;
00175
00176 CORBA::Object_var naming_obj =
00177 TAO_ORB_Core_instance ()->orb ()->resolve_initial_references ("NameService");
00178
00179 if (CORBA::is_nil (naming_obj.in ()))
00180 ACE_ERROR_RETURN ((LM_ERROR,
00181 " (%P|%t) Unable to resolve the Name Service.\n"),
00182 -1);
00183 this->naming_context_ =
00184 CosNaming::NamingContext::_narrow (naming_obj.in ());
00185 }
00186 catch (const CORBA::Exception& ex)
00187 {
00188 ex._tao_print_exception (
00189 "TAO_AV_Endpoint_Process_Strategy::bind_to_naming_service");
00190 return -1;
00191 }
00192 return 0;
00193 }
|
|
|
Get the object reference for the newly created stream endpoint (which will be in the child process) Subclasses will define the functionality for this Implemented in TAO_AV_Endpoint_Process_Strategy_A, and TAO_AV_Endpoint_Process_Strategy_B. Referenced by activate(). |
|
|
Get the Vdev object reference for the newly created endpoint Definition at line 197 of file Endpoint_Strategy.cpp. References ACE_DEBUG, ACE_ERROR_RETURN, CORBA::is_nil(), LM_DEBUG, LM_ERROR, naming_context_, ACE_OS::sprintf(), CORBA::string_dup(), and TAO_debug_level. Referenced by activate().
00198 {
00199 try
00200 {
00201 char vdev_name [BUFSIZ];
00202 ACE_OS::sprintf (vdev_name,
00203 "%s:%s:%ld",
00204 "VDev",
00205 this->host_,
00206 (long) this->pid_);
00207
00208 if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)%s\n",vdev_name));
00209
00210 // Create the name
00211 CosNaming::Name VDev_Name (1);
00212 VDev_Name.length (1);
00213 VDev_Name [0].id = CORBA::string_dup (vdev_name);
00214
00215 // Get the CORBA::Object
00216 CORBA::Object_var vdev =
00217 this->naming_context_->resolve (VDev_Name);
00218
00219 // Narrow it
00220 this->vdev_ =
00221 AVStreams::VDev::_narrow (vdev.in ());
00222
00223 // Check if valid
00224 if (CORBA::is_nil (this->vdev_.in() ))
00225 ACE_ERROR_RETURN ((LM_ERROR,
00226 " could not resolve Stream_Endpoint_B in Naming service <%s>\n"),
00227 -1);
00228 }
00229 catch (const CORBA::Exception& ex)
00230 {
00231 ex._tao_print_exception (
00232 "TAO_AV_Endpoint_Process_Strategy::get_vdev");
00233 return -1;
00234 }
00235 return 0;
00236 }
|
|
|
name of this host used for resolving unique names.
Definition at line 114 of file Endpoint_Strategy.h. |
|
|
Naming context.
Definition at line 108 of file Endpoint_Strategy.h. Referenced by bind_to_naming_service(), and get_vdev(). |
|
|
My child's process id.
Definition at line 117 of file Endpoint_Strategy.h. |
|
|
Name and arguments for the process to be created.
Definition at line 111 of file Endpoint_Strategy.h. |
1.3.6