summaryrefslogtreecommitdiff
path: root/trunk/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy.cpp')
-rw-r--r--trunk/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy.cpp435
1 files changed, 435 insertions, 0 deletions
diff --git a/trunk/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy.cpp b/trunk/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy.cpp
new file mode 100644
index 00000000000..4d15bdd853a
--- /dev/null
+++ b/trunk/TAO/orbsvcs/orbsvcs/AV/Endpoint_Strategy.cpp
@@ -0,0 +1,435 @@
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// cos
+//
+// = FILENAME
+// Endpoint_Strategy.cpp
+//
+// = AUTHOR
+// Sumedh Mungee <sumedh@cs.wustl.edu>
+//
+//
+// ============================================================================
+
+#include "orbsvcs/AV/Endpoint_Strategy.h"
+
+#include "tao/debug.h"
+#include "tao/ORB_Core.h"
+
+#include "ace/Process_Semaphore.h"
+
+ACE_RCSID(AV, Endpoint_Strategy, "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// ----------------------------------------------------------------------
+// TAO_AV_Endpoint_Strategy
+// ----------------------------------------------------------------------
+
+// Constructor
+TAO_AV_Endpoint_Strategy::TAO_AV_Endpoint_Strategy (void)
+{
+}
+
+// Destructor.
+TAO_AV_Endpoint_Strategy::~TAO_AV_Endpoint_Strategy (void)
+{
+
+}
+
+// The base class defines the "failure" case, so that unless the
+// subclasses override this, the call will fail. This is done so that
+// subclasses need only define the calls that they want to support,
+// and the remaining calls will fail automagically
+int
+TAO_AV_Endpoint_Strategy::create_A (AVStreams::StreamEndPoint_A_ptr & /* stream_endpoint */,
+ AVStreams::VDev_ptr & /* vdev */
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) Error creating A endpoint\n"),
+ -1);
+}
+
+// The base class defines the "failure" case, so that unless the
+// subclasses override this, the call will fail. This is done so that
+// subclasses need only define the calls that they want to support,
+// and the remaining calls will fail automagically
+int
+TAO_AV_Endpoint_Strategy::create_B (AVStreams::StreamEndPoint_B_ptr & /* stream_endpoint */,
+ AVStreams::VDev_ptr & /*vdev */
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) Error creating B endpoint\n"),
+ -1);
+}
+
+
+// ----------------------------------------------------------------------
+// TAO_AV_Endpoint_Process_Strategy
+// ----------------------------------------------------------------------
+
+// Constructor
+TAO_AV_Endpoint_Process_Strategy::TAO_AV_Endpoint_Process_Strategy (ACE_Process_Options *process_options)
+ : process_options_ (process_options),
+ pid_ (-1)
+{
+ ACE_OS::hostname (this->host_,
+ sizeof this->host_);
+}
+
+// Destructor.
+TAO_AV_Endpoint_Process_Strategy::~TAO_AV_Endpoint_Process_Strategy (void)
+{
+}
+
+// Spawns the process, and waits for it to finish booting.
+// Then uses bind_to_naming_service, get_stream_endpoint, and get_vdev
+// to get the object references to the various objects created in the
+// child
+int
+TAO_AV_Endpoint_Process_Strategy::activate (void)
+{
+ ACE_Process process;
+
+ // Create a new process to contain this endpoint
+ this->pid_ = process.spawn (*this->process_options_);
+
+ // Process creation failed
+ if (this->pid_ == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) ACE_Process:: spawn failed: %p\n",
+ "spawn"),
+ -1);
+
+ // Create a unique semaphore name, using my hostname, and pid.
+ char sem_str [BUFSIZ];
+
+ // create a unique semaphore name
+ ACE_OS::sprintf (sem_str,
+ "%s:%s:%ld",
+ "TAO_AV_Process_Semaphore",
+ this->host_,
+ static_cast<long int> (this->pid_));
+
+ ACE_DEBUG ((LM_DEBUG,
+ "(%P|%t) semaphore is %s\n",
+ sem_str));
+ // Create the semaphore
+ ACE_Process_Semaphore semaphore (0, // 0 means that the
+ // semaphore is locked initially
+ sem_str);
+
+ // wait until the child finishes booting
+ while (1)
+ {
+ if (semaphore.acquire () == -1)
+ {
+ // See if my child process is still alive -- if not, return an error
+ if (ACE_OS::kill (this->pid_,
+ 0) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) Process_Strategy: Process being waited on died unexpectedly.\n"),
+ -1);
+ // if we were not interrupted due to a EINTR, break
+ if (errno != EINTR)
+ break;
+ }
+ else
+ break;
+ }
+
+ // The job of the semaphore is done, remove it.
+ if (semaphore.remove () == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) semaphore remove failed: %p\n",
+ "remove"),
+ -1);
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // Get ourselves a Naming service
+ this->bind_to_naming_service (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Get the stream endpoint created by the child from the naming service
+ this->get_stream_endpoint (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Get the Vdev created by the child from the naming service
+ this->get_vdev (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Endpoint_Process_Strategy::activate");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// Get ourselves a Naming service reference
+int
+TAO_AV_Endpoint_Process_Strategy::bind_to_naming_service (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ if (CORBA::is_nil (this->naming_context_.in ()) == 0)
+ return 0;
+
+ CORBA::Object_var naming_obj =
+ TAO_ORB_Core_instance ()->orb ()->resolve_initial_references ("NameService" ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (CORBA::is_nil (naming_obj.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ " (%P|%t) Unable to resolve the Name Service.\n"),
+ -1);
+ this->naming_context_ =
+ CosNaming::NamingContext::_narrow (naming_obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Endpoint_Process_Strategy::bind_to_naming_service");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// Get the VDev created in the child process from the namingservice
+int
+TAO_AV_Endpoint_Process_Strategy::get_vdev (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ char vdev_name [BUFSIZ];
+ ACE_OS::sprintf (vdev_name,
+ "%s:%s:%ld",
+ "VDev",
+ this->host_,
+ (long) this->pid_);
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)%s\n",vdev_name));
+
+ // Create the name
+ CosNaming::Name VDev_Name (1);
+ VDev_Name.length (1);
+ VDev_Name [0].id = CORBA::string_dup (vdev_name);
+
+ // Get the CORBA::Object
+ CORBA::Object_var vdev =
+ this->naming_context_->resolve (VDev_Name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Narrow it
+ this->vdev_ =
+ AVStreams::VDev::_narrow (vdev.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Check if valid
+ if (CORBA::is_nil (this->vdev_.in() ))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ " could not resolve Stream_Endpoint_B in Naming service <%s>\n"),
+ -1);
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Endpoint_Process_Strategy::get_vdev");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// ----------------------------------------------------------------------
+// TAO_AV_Endpoint_Process_Strategy_A
+// ----------------------------------------------------------------------
+
+// Constructor
+TAO_AV_Endpoint_Process_Strategy_A::TAO_AV_Endpoint_Process_Strategy_A (ACE_Process_Options *process_options)
+ : TAO_AV_Endpoint_Process_Strategy (process_options)
+{
+}
+
+// Destructor
+TAO_AV_Endpoint_Process_Strategy_A::~TAO_AV_Endpoint_Process_Strategy_A (void)
+{
+}
+
+// the "A" type endpoint creator
+int
+TAO_AV_Endpoint_Process_Strategy_A::create_A (AVStreams::StreamEndPoint_A_ptr &stream_endpoint,
+ AVStreams::VDev_ptr &vdev
+ ACE_ENV_ARG_DECL_NOT_USED)
+{
+ // use the baseclass activate
+ if (this->activate () == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) TAO_AV_Endpoint_Process_Strategy: Error in activate ()\n"),
+ -1);
+
+ // return the object references
+ stream_endpoint = AVStreams::StreamEndPoint_A::_duplicate( this->stream_endpoint_a_.in() );
+ vdev = AVStreams::VDev::_duplicate( this->vdev_.in() );
+ return 0;
+
+}
+
+// Gets the stream endpoint object reference from the naming service
+int
+TAO_AV_Endpoint_Process_Strategy_A::get_stream_endpoint (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ char stream_endpoint_name[BUFSIZ];
+ ACE_OS::sprintf (stream_endpoint_name,
+ "%s:%s:%ld",
+ "Stream_Endpoint_A",
+ this->host_,
+ (long) this->pid_);
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)%s\n",stream_endpoint_name));
+
+ // Create the name
+ CosNaming::Name Stream_Endpoint_A_Name (1);
+
+ Stream_Endpoint_A_Name.length (1);
+ Stream_Endpoint_A_Name [0].id = CORBA::string_dup (stream_endpoint_name);
+
+ // Get the CORBA::Object
+ CORBA::Object_var stream_endpoint_a =
+ this->naming_context_->resolve (Stream_Endpoint_A_Name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Narrow the reference
+ this->stream_endpoint_a_ =
+ AVStreams::StreamEndPoint_A::_narrow (stream_endpoint_a.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Check for validity
+ if (CORBA::is_nil (this->stream_endpoint_a_.in() ))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ " could not resolve Stream_Endpoint_A in Naming service <%s>\n"),
+ -1);
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Endpoint_Process_Strategy_A::get_stream_endpoint");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// ----------------------------------------------------------------------
+// TAO_AV_Endpoint_Process_Strategy_B
+// ----------------------------------------------------------------------
+
+// Constructor
+TAO_AV_Endpoint_Process_Strategy_B::TAO_AV_Endpoint_Process_Strategy_B (ACE_Process_Options *process_options)
+ : TAO_AV_Endpoint_Process_Strategy (process_options)
+{
+}
+
+// Destructor
+TAO_AV_Endpoint_Process_Strategy_B::~TAO_AV_Endpoint_Process_Strategy_B (void)
+{
+}
+
+// Creates and returns a "B" type endpoint
+int
+TAO_AV_Endpoint_Process_Strategy_B::create_B (AVStreams::StreamEndPoint_B_ptr &stream_endpoint,
+ AVStreams::VDev_ptr &vdev
+ ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ if (this->activate () == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%P|%t) TAO_AV_Endpoint_Process_Strategy: Error in activate ()\n"),
+ -1);
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)TAO_AV_Endpoint_Process_Strategy_B::create_B ()\n: stream_endpoint is:%s\n",
+ TAO_ORB_Core_instance ()->orb ()->object_to_string (this->stream_endpoint_b_.in()
+ ACE_ENV_ARG_PARAMETER)));
+ ACE_TRY_CHECK;
+ stream_endpoint = AVStreams::StreamEndPoint_B::_duplicate ( this->stream_endpoint_b_.in() );
+ vdev = AVStreams::VDev::_duplicate( this->vdev_.in() );
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Endpoint_Process_Strategy_B::create_B\n");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+// Gets the B type stream_endpoint from the Naming service
+int
+TAO_AV_Endpoint_Process_Strategy_B::get_stream_endpoint (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_TRY
+ {
+ char stream_endpoint_name[BUFSIZ];
+ ACE_OS::sprintf (stream_endpoint_name,
+ "%s:%s:%ld",
+ "Stream_Endpoint_B",
+ this->host_,
+ (long) this->pid_);
+
+ if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,"(%P|%t)%s\n",stream_endpoint_name));
+
+ // Create the name
+ CosNaming::Name Stream_Endpoint_B_Name (1);
+
+ Stream_Endpoint_B_Name.length (1);
+ Stream_Endpoint_B_Name [0].id = CORBA::string_dup (stream_endpoint_name);
+
+ // Get the CORBA::Object reference
+ CORBA::Object_var stream_endpoint_b =
+ this->naming_context_->resolve (Stream_Endpoint_B_Name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Narrow the reference
+ this->stream_endpoint_b_ =
+ AVStreams::StreamEndPoint_B::_narrow (stream_endpoint_b.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Check for validity
+ if (CORBA::is_nil (this->stream_endpoint_b_.in() ))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ " could not resolve Stream_Endpoint_B in Naming service <%s>\n"),
+ -1);
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,"TAO_AV_Endpoint_Process_Strategy_B::get_stream_endpoint");
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL