[Ace-users] Singlethread servant upcall (using CSD)

Jochen Rothenbacher jochen.rothenbacher at nsn.com
Mon Oct 1 01:58:04 CDT 2007


    ACE VERSION: 5.5.6

    HOST MACHINE and OPERATING SYSTEM:
      sun solaris 10

    TARGET MACHINE and OPERATING SYSTEM, if different from HOST:
    COMPILER NAME AND VERSION (AND PATCHLEVEL):
            
      CC: Sun C++ 5.7 Patch 117830-08 2006/07/12

    THE $ACE_ROOT/ace/config.h FILE [if you use a link to a platform-
    specific file, simply state which one]:

      #include "ace/config-sunos5.10.h"
    
    THE $ACE_ROOT/include/makeinclude/platform_macros.GNU FILE [if you
    use a link to a platform-specific file, simply state which one
    (unless this isn't used in this case, e.g., with Microsoft Visual
    C++)]: 
    
      include $(ACE_ROOT)/include/makeinclude/platform_sunos5_sunc++.GNU

    CONTENTS OF $ACE_ROOT/bin/MakeProjectCreator/config/default.features
    (used by MPC when you generate your own makefiles):
      ssl=0
      qos=0


    DOES THE PROBLEM AFFECT:
        EXECUTION:
        Singlethread servant upcall not working?
          

    SYNOPSIS:
       Although policy set to SINGLE_THREAD_MODEL calls are dispated in 
       two threads.


    DESCRIPTION:
      
       We have a multithreaded process framework using the CSD.

       The process consists of a main thread with the mainloop which 
       triggers several event input queues to dispatch events. The input 
       queues have seperate (worker-)threads for feeding the queues with
       events.

       One of these input queues is feeded with CORBA calls using the 
       CSD. In this thread we run the CORBA::ORB::run() to handle events.

       Each server is using a child POA which is configured with these 
       policies 

         // Create the child POA.
         CORBA::PolicyList policies;
         policies.length(2);
           policies[0] =
         mRootPoa->create_implicit_activation_policy 
                       (PortableServer::IMPLICIT_ACTIVATION);
         policies[1] = mRootPoa->create_thread_policy 
                       (PortableServer::SINGLE_THREAD_MODEL);
       

      The CSD is used as follows. We've overloaded 
      dispatch_remote_request_i()

         TAO::CSD::Strategy_Base::DispatchResult 
                               SYS::Strategy::dispatch_remote_request_i
                              (TAO_ServerRequest&   server_request,
                               const PortableServer::ObjectId& object_id,
                               PortableServer::POA_ptr         poa,
                               const char*                     operation,
                               PortableServer::Servant         servant)
          {

             // create the CorbaRequest object, and then add it to 
             // our "request queue".
    
             if (mInputManager) {
                CorbaRequest* request = new CorbaRequest(server_request,
                                                    object_id, poa, 
                                                    operation, servant);
             (void)mInputManager->enqueue(request);
             }
           }

       Further we configured "direct collocation" with the IDL Compiler 
       flags "Sp -Gd".        

       What we observed was that there were incoming calls using our 
       Strategy appearing in the thread where we call CORBA::ORB::run() 
       to handle events, but also a few in the main thread where
       we call our mainloop.
       
       Shouldn't the policy PortableServer::SINGLE_THREAD_MODEL guarantee  
       that there are no concurrent servant upcalls?

       Gruss Jochen


-- 
----------------------------------------------------------
Jochen Rothenbacher     


More information about the Ace-users mailing list