Public Member Functions | Static Public Attributes | Private Attributes

Server_Interceptor Class Reference

#include <Request_Interceptor.h>

Inheritance diagram for Server_Interceptor:
Inheritance graph
[legend]
Collaboration diagram for Server_Interceptor:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 Server_Interceptor (TAO_RTScheduler_Current_ptr current)
virtual void receive_request_service_contexts (PortableInterceptor::ServerRequestInfo_ptr ri)
virtual void receive_request (PortableInterceptor::ServerRequestInfo_ptr ri)
virtual void send_reply (PortableInterceptor::ServerRequestInfo_ptr ri)
virtual void send_exception (PortableInterceptor::ServerRequestInfo_ptr ri)
virtual void send_other (PortableInterceptor::ServerRequestInfo_ptr ri)
virtual char * name (void)
virtual void destroy (void)

Static Public Attributes

static const IOP::ServiceId SchedulingInfo = 30

Private Attributes

TAO_RTScheduler_Current_var current_

Detailed Description

Definition at line 45 of file Request_Interceptor.h.


Constructor & Destructor Documentation

Server_Interceptor::Server_Interceptor ( TAO_RTScheduler_Current_ptr  current  ) 

Definition at line 246 of file Request_Interceptor.cpp.


Member Function Documentation

void Server_Interceptor::destroy ( void   )  [virtual]

Definition at line 463 of file Request_Interceptor.cpp.

{
}

char * Server_Interceptor::name ( void   )  [virtual]

Definition at line 457 of file Request_Interceptor.cpp.

{
    return  CORBA::string_dup ("RTSchdeuler_Server_Interceptor");
}

void Server_Interceptor::receive_request ( PortableInterceptor::ServerRequestInfo_ptr  ri  )  [virtual]

Definition at line 262 of file Request_Interceptor.cpp.

{
  if (TAO_debug_level > 0)
    ACE_DEBUG ((LM_DEBUG,
                "Server_Interceptor::receive_request\n"));

  IOP::ServiceContext_var serv_cxt;

  try
    {
      serv_cxt =
        ri->get_request_service_context (Server_Interceptor::SchedulingInfo);
    }
  catch (const ::CORBA::Exception&)
    {
      if (TAO_debug_level > 0)
        ACE_DEBUG ((LM_DEBUG,
                    "Invalid Service Request\n"));
      return;
    }

  if (TAO_debug_level > 0)
    ACE_DEBUG ((LM_DEBUG,
                "Request from Distributable Thread\n"));

  RTScheduling::Current::IdType_var guid_var;
  char* name = 0;
  CORBA::Policy_var sched_param = 0;
  CORBA::Policy_var implicit_sched_param = 0;

  TAO_RTScheduler_Current_i* new_current = 0;
  ACE_NEW_THROW_EX (new_current,
                    TAO_RTScheduler_Current_i (this->current_->orb (),
                                               this->current_->dt_hash ()),
                    CORBA::NO_MEMORY (
                           CORBA::SystemException::_tao_minor_code (
                             TAO::VMCID,
                             ENOMEM),
                           CORBA::COMPLETED_NO));

  // Scheduler retrieves scheduling parameters
  // from request and populates the out
  // parameters.
  RTScheduling::Scheduler_var scheduler = new_current->scheduler();
  scheduler->receive_request (ri,
                              guid_var.out (),
                              name,
                              sched_param.out (),
                              implicit_sched_param.out ());

  if (guid_var->length () == 0)
    {
      ACE_ERROR ((LM_ERROR,
                  "The scheduler MUST retreive and return the "
                  "GUID from the service context\n"));
      return;
    }
  RTScheduling::Current::IdType guid;
  guid.length (sizeof (size_t));
  ACE_OS::memcpy (guid.get_buffer (),
                  guid_var->get_buffer (),
                  sizeof (size_t));

  size_t id;
  ACE_OS::memcpy (&id,
                  guid.get_buffer (),
                  guid.length ());

  if (TAO_debug_level > 0)
    ACE_DEBUG ((LM_DEBUG,
                "The Guid is %d\n",
                id));

  // Create new DT.
  RTScheduling::DistributableThread_var dt = TAO_DistributableThread_Factory::create_DT ();

  // Add new DT to map.
  int result = new_current->dt_hash ()->bind (guid, dt);

  if (result != 0)
    {
      throw ::CORBA::INTERNAL ();
    }

  // Create new temporary current. Note that the new <sched_param> is
  // the current <implicit_sched_param> and there is no segment name.
  new_current->id (guid);
  new_current->name (name);
  new_current->scheduling_parameter (sched_param.in ());
  new_current->implicit_scheduling_parameter (implicit_sched_param.in ());
  new_current->DT (dt.in ());

  // Install new current in the ORB and store the previous current
  // implementation
  // current->implementation (new_current)
  TAO_TSS_Resources *tss = TAO_TSS_Resources::instance ();

  tss->rtscheduler_previous_current_impl_ = this->current_->implementation (new_current);
}

void Server_Interceptor::receive_request_service_contexts ( PortableInterceptor::ServerRequestInfo_ptr  ri  )  [virtual]

Definition at line 252 of file Request_Interceptor.cpp.

{
  if (TAO_debug_level > 0)
    ACE_DEBUG ((LM_DEBUG,
                "Server_Interceptor::receive_request_service_contexts\n"));

}

void Server_Interceptor::send_exception ( PortableInterceptor::ServerRequestInfo_ptr  ri  )  [virtual]

Definition at line 411 of file Request_Interceptor.cpp.

{
  if (TAO_debug_level > 0)
    ACE_DEBUG ((LM_DEBUG,
                "Server_Interceptor::send_exception\n"));

  TAO_RTScheduler_Current_i *current = 0;

  TAO_TSS_Resources *tss = TAO_TSS_Resources::instance ();

  current = static_cast<TAO_RTScheduler_Current_i *> (tss->rtscheduler_current_impl_);
  if (current != 0)
    {
      // Inform scheduler that upcall is complete.
      RTScheduling::Scheduler_var scheduler = current->scheduler ();
      scheduler->send_exception (ri);

      current->cleanup_DT ();
      current->cleanup_current ();
    }
}

void Server_Interceptor::send_other ( PortableInterceptor::ServerRequestInfo_ptr  ri  )  [virtual]

Definition at line 434 of file Request_Interceptor.cpp.

{
  if (TAO_debug_level > 0)
    ACE_DEBUG ((LM_DEBUG,
                "Server_Interceptor::send_other\n"));

  TAO_RTScheduler_Current_i *current = 0;

  TAO_TSS_Resources *tss = TAO_TSS_Resources::instance ();

  current = static_cast<TAO_RTScheduler_Current_i *> (tss->rtscheduler_current_impl_);
  if (current != 0)
    {
      // Inform scheduler that upcall is complete.
      RTScheduling::Scheduler_var scheduler = current->scheduler ();
      scheduler->send_other (ri);

      current->cleanup_DT ();
      current->cleanup_current ();
    }
}

void Server_Interceptor::send_reply ( PortableInterceptor::ServerRequestInfo_ptr  ri  )  [virtual]

Definition at line 364 of file Request_Interceptor.cpp.

{
  if (TAO_debug_level > 0)
    ACE_DEBUG ((LM_DEBUG,
                "Server_Interceptor::send_reply\n"));

  TAO_RTScheduler_Current_i *current = 0;
  TAO_RTScheduler_Current_i *prev_current = 0;

  TAO_TSS_Resources *tss = TAO_TSS_Resources::instance ();

  current = static_cast<TAO_RTScheduler_Current_i *> (tss->rtscheduler_current_impl_);
  if (current != 0)
    {
      RTScheduling::DistributableThread_var dt = current->DT ();
      if (dt->state () == RTScheduling::DistributableThread::CANCELLED)
        {
          current->cancel_thread ();

          return;
        }
      else ACE_DEBUG ((LM_DEBUG,
                       "Thread Not Cancelled\n"));


      // Inform scheduler that upcall is complete.
      RTScheduling::Scheduler_var scheduler = current->scheduler ();
      scheduler->send_reply (ri);

      current->cleanup_DT ();
      current->cleanup_current ();

      // Get the previous current if any.
      prev_current = static_cast<TAO_RTScheduler_Current_i *> (tss->rtscheduler_previous_current_impl_);

      // Restore the previous current.
      tss->rtscheduler_current_impl_ = prev_current;

      // Reset the previous current pointer.
      tss->rtscheduler_previous_current_impl_ = 0;

    }
  else ACE_DEBUG ((LM_DEBUG,
                   "Send Reply Current is 0\n"));
}


Member Data Documentation

Definition at line 70 of file Request_Interceptor.h.

const IOP::ServiceId Server_Interceptor::SchedulingInfo = 30 [static]

Definition at line 67 of file Request_Interceptor.h.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines