(file) Return to ModuleController.h CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

Diff for /pegasus/src/Pegasus/Common/ModuleController.h between version 1.2 and 1.40

version 1.2, 2002/03/14 23:28:56 version 1.40, 2005/03/10 00:38:17
Line 1 
Line 1 
 //%////-*-c++-*-////////////////////////////////////////////////////////////////  //%2005////////////////////////////////////////////////////////////////////////
 // //
 // Copyright (c) 2000, 2001 The Open group, BMC Software, Tivoli Systems, IBM  // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
   // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
   // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
   // IBM Corp.; EMC Corporation, The Open Group.
   // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
   // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
   // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
   // EMC Corporation; VERITAS Software Corporation; The Open Group.
 // //
 // Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to // of this software and associated documentation files (the "Software"), to
Line 22 
Line 29 
 // //
 // Author: Mike Day (mdday@us.ibm.com) <<< Wed Mar 13 20:49:40 2002 mdd >>> // Author: Mike Day (mdday@us.ibm.com) <<< Wed Mar 13 20:49:40 2002 mdd >>>
 // //
 // Modified By:  // Modified By: Amit K Arora, IBM (amita@in.ibm.com)
 // //
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
  
Line 30 
Line 37 
 #define Pegasus_Module_Controller_h #define Pegasus_Module_Controller_h
  
 #include <Pegasus/Common/Config.h> #include <Pegasus/Common/Config.h>
   #include <Pegasus/Common/Constants.h>
 #include <Pegasus/Common/Message.h> #include <Pegasus/Common/Message.h>
 #include <Pegasus/Common/Exception.h>  #include <Pegasus/Common/InternalException.h>
 #include <Pegasus/Common/IPC.h> #include <Pegasus/Common/IPC.h>
 #include <Pegasus/Common/Thread.h> #include <Pegasus/Common/Thread.h>
 #include <Pegasus/Common/AsyncOpNode.h> #include <Pegasus/Common/AsyncOpNode.h>
 #include <Pegasus/Common/Cimom.h> #include <Pegasus/Common/Cimom.h>
 #include <Pegasus/Common/CimomMessage.h> #include <Pegasus/Common/CimomMessage.h>
 #include <Pegasus/Common/MessageQueueService.h> #include <Pegasus/Common/MessageQueueService.h>
   #include <Pegasus/Common/peg_authorization.h>
   #include <Pegasus/Common/Linkage.h>
   #include <Pegasus/Common/AutoPtr.h>
   
  
 PEGASUS_NAMESPACE_BEGIN PEGASUS_NAMESPACE_BEGIN
  
Line 46 
Line 58 
  
 class PEGASUS_COMMON_LINKAGE pegasus_module class PEGASUS_COMMON_LINKAGE pegasus_module
 { {
      private:
         class module_rep : public pegasus_auth_handle
         {
    public:    public:
               typedef pegasus_auth_handle Base;
  
       pegasus_module()              module_rep(ModuleController *controller,
       {                         const String & name,
       }                         void *module_address,
                          Message * (*receive_message)(Message *, void *),
                          void (*async_callback)(Uint32, Message *, void *),
                          void (*shutdown_notify)(Uint32 code, void *));
  
       virtual ~pegasus_module()              ~module_rep(void) ;
       {  
       }  
  
       Boolean operator == (const service_module *) const;              Boolean operator == (const module_rep *rep) const
       Boolean operator == (const String &  ) const ;              { if (rep == this ) return true; return false; }
       Boolean operator == (const service_module & ) const ;  
       Boolean operator == (const void *) const;  
  
       String & get_name(void);              Boolean operator == (const module_rep &rep) const
               { if (rep == *this) return true; return false; }
  
       // introspection interface              Boolean operator == (void *rep) const
       virtual Boolean query_interface(String & class_id,              { if ( (void *)this == rep ) return true; return false; }
                                       void **object_ptr) = 0;  
       virtual Uint32 reference(void) { _reference_count++; }              void reference(void) { _reference_count++; }
       virtual Uint32 dereference(void)  { _reference_count--; }              void dereference(void) { _reference_count--; }
               Uint32 reference_count(void)  { return _reference_count.value(); }
               const String & get_name(void) const { return _name; }
               void *get_module_address(void) const { return _module_address; }
   
               Message * module_receive_message(Message *msg);
   
               void _send_async_callback(Uint32 msg_handle, Message *msg, void *parm);
   
               void _send_shutdown_notify(void);
               void lock(void) { _thread_safety.lock(pegasus_thread_self()); }
               void unlock(void) { _thread_safety.unlock(); }
   
               Boolean authorized(void) ;
               Boolean authorized(Uint32);
               Boolean authorized(Uint32, Uint32);
  
    private:    private:
       virtual Boolean _rcv_msg(Message *) = 0;              module_rep(void);
       virtual void _send_async_callback(Uint32 msg_handle, Message *msg) = 0;              module_rep(const module_rep & );
               module_rep & operator= (const module_rep & rep);
   
  
       virtual Boolean _shutdown(Uint32) = 0;              Mutex _thread_safety;
       ModuleController *_controller;              AutoPtr<ModuleController> _controller;//PEP101
       String _name;       String _name;
       AtomicInt _reference_count;       AtomicInt _reference_count;
               AtomicInt _shutting_down;
   
               void *_module_address;
               Message * (*_receive_message)(Message *, void *);
               void (*_async_callback)(Uint32, Message *, void *);
               void (*_shutdown_notify)(Uint32 code, void *);
   
               static Message * default_receive_message(Message *msg, void *inst)
               { throw NotImplemented("Module Receive"); return 0; }
   
               static void default_async_callback(Uint32 handle, Message *msg, void *inst)
               { throw NotImplemented("Module Async Receive"); }
   
               static void default_shutdown_notify(Uint32 code, void *inst)
               { return; }
   
               static Message * closed_receive_message(Message *msg, void *inst)
               { throw ModuleClosed(); return 0; }
   
               static void closed_async_callback(Uint32 handle, Message *msg, void *inst)
               { throw ModuleClosed(); }
   
               friend class ModuleController;
         };
   
      public:
         pegasus_module(ModuleController *controller,
                        const String &id,
                        void *module_address,
                        Message * (*receive_message)(Message *, void *),
                        void (*async_callback)(Uint32, Message *, void *),
                        void (*shutdown_notify)(Uint32 code, void *)) ;
   
         pegasus_module(const pegasus_module & mod);
         pegasus_module & operator= (const pegasus_module & mod);
   
         virtual ~pegasus_module(void);
   
         virtual Boolean authorized(Uint32 operation);
         virtual Boolean authorized(void);
   
         Boolean operator == (const pegasus_module & mod) const ;
         Boolean operator == (const String &  mod) const;
         Boolean operator == (const void *mod) const;
   
         const String & get_name(void) const;
   
         // introspection interface
         Boolean query_interface(const String & class_id, void **object_ptr) const;
   
   
      private:
   
         AutoPtr<module_rep> _rep;//PEP101
   
         pegasus_module(void)
         {
         }
  
         Boolean _rcv_msg(Message *) ;
         Message * _receive_message(Message *msg);
         void _send_async_callback(Uint32 msg_handle, Message *msg, void *) ;
         void _send_shutdown_notify(void);
         Boolean _shutdown(void);
         PEGASUS_STD(bitset<32>) _allowed_operations;
   
         void reference(void) { _rep->reference(); }
         void dereference(void)  { _rep->dereference(); }
       friend class ModuleController;       friend class ModuleController;
 }; };
  
Line 85 
Line 185 
 class PEGASUS_COMMON_LINKAGE ModuleController : public MessageQueueService class PEGASUS_COMMON_LINKAGE ModuleController : public MessageQueueService
 { {
  
   
      public:
         typedef MessageQueueService Base;
   
         static const Uint32 GET_CLIENT_HANDLE;
         static const Uint32 REGISTER_MODULE;
         static const Uint32 DEREGISTER_MODULE;
         static const Uint32 FIND_SERVICE;
         static const Uint32 FIND_MODULE_IN_SERVICE;
         static const Uint32 GET_MODULE_REFERENCE;
         static const Uint32 MODULE_SEND_WAIT;
         static const Uint32 MODULE_SEND_WAIT_MODULE;
         static const Uint32 MODULE_SEND_ASYNC;
         static const Uint32 MODULE_SEND_ASYNC_MODULE;
         static const Uint32 BLOCKING_THREAD_EXEC;
         static const Uint32 ASYNC_THREAD_EXEC;
         static const Uint32 CLIENT_SEND_WAIT;
         static const Uint32 CLIENT_SEND_WAIT_MODULE;
         static const Uint32 CLIENT_SEND_ASYNC;
         static const Uint32 CLIENT_SEND_ASYNC_MODULE;
         static const Uint32 CLIENT_BLOCKING_THREAD_EXEC;
         static const Uint32 CLIENT_ASYNC_THREAD_EXEC;
         static const Uint32 CLIENT_SEND_FORGET;
         static const Uint32 CLIENT_SEND_FORGET_MODULE;
         static const Uint32 MODULE_SEND_FORGET;
         static const Uint32 MODULE_SEND_FORGET_MODULE;
   
   // ATTN-DME-P2-20020406 Removed private declaration.  client_handle is
   //          currently used in Pegasus/Provider/CIMOMHandle.cpp
   
   //   private:
         class client_handle : public pegasus_auth_handle
         {
            public:
               typedef pegasus_auth_handle Base;
   
               client_handle(const pegasus_identity & id)
                  :Base(id) ,
                   allowed_operations( GET_CLIENT_HANDLE |
                                       FIND_SERVICE |
                                       FIND_MODULE_IN_SERVICE |
                                       GET_MODULE_REFERENCE |
                                       CLIENT_SEND_WAIT |
                                       CLIENT_SEND_WAIT_MODULE |
                                       CLIENT_SEND_ASYNC |
                                       CLIENT_SEND_ASYNC_MODULE |
                                       CLIENT_BLOCKING_THREAD_EXEC |
                                       CLIENT_ASYNC_THREAD_EXEC),
                   reference_count(1)
               {
               }
   
               ~client_handle(void)
               {
               }
   
               client_handle & operator=(const client_handle & handle)
               {
                  if(this == &handle)
                     return *this;
                  reference_count++;
                  return *this;
               }
   
   
               virtual Boolean authorized(Uint32, Uint32);
               virtual Boolean authorized(Uint32 operation);
               virtual Boolean authorized(void);
               PEGASUS_STD(bitset<32>) allowed_operations;
               AtomicInt reference_count;
   
         };
   
         class callback_handle
         {
            public:
               static void * operator new(size_t );
               static void operator delete(void *, size_t);
            private:
               static callback_handle *_head;
               static const int BLOCK_SIZE;
               static Mutex _alloc_mut;
   
            public:
               callback_handle(pegasus_module * module, void *parm)
                  : _module(module), _parm(parm)
               {
               }
   
               ~callback_handle()
               {
                  if( _module->get_name() == String(PEGASUS_MODULENAME_TEMP) )
                    // delete _module;
                    _module.reset();
               }
   
               AutoPtr<pegasus_module> _module;//PEP101
               void *_parm;
         };
   
   
    public:    public:
       typedef MesageQueueService Base;  
  
       ModuleController(const char *name, Uint32 queueID);  
         ModuleController(const char *name);
   /*       ModuleController(const char *name,  */
   /*                     Sint16 min_threads,  */
   /*                     Sint16 max_threads, */
   /*                     struct timeval & create_thread, */
   /*                     struct timeval & destroy_thread); */
   
   
       ~ModuleController(void);       ~ModuleController(void);
  
  
  
   
       // module api       // module api
       ModuleController & register_module(pegasus_module *);        static ModuleController & register_module(const String & controller_name,
       deregister_module(pegasus_module *);                                                  const String & module_name,
                                                   void *module_address,
                                                   Message * (*receive_message)(Message *, void *),
                                                   void (*async_callback)(Uint32, Message *, void *),
                                                   void (*shutdown_notify)(Uint32, void *),
                                                   pegasus_module **instance = NULL)
  
       Uint32 find_service(pegasus_module & handle, String & name);           throw(AlreadyExistsException, IncompatibleTypesException);
       String & find_service(pegasus_module & handle, Uint32 queue_id);  
  
       pegasus_module & get_module_reference(pegasus_module & handle, String & name);        Boolean deregister_module(const String & module_name)
            throw(Permission);
  
         Uint32 find_service(const pegasus_module & handle, const String & name) throw(Permission);
   
         Uint32 find_module_in_service(const pegasus_module & handle,
                                       const String & module_name)
            throw(Permission, IPCException);
   
   
         pegasus_module * get_module_reference(const pegasus_module & my_handle,
                                               const String & module_name)
            throw(Permission);
  
       // send a message to another service       // send a message to another service
       Message *ModuleSendWait(pegasus_module & handle,        AsyncReply *ModuleSendWait(const pegasus_module & handle,
                               Uint32 destination_q,                               Uint32 destination_q,
                               Message *message);                                   AsyncRequest *request) throw(Permission, IPCException);
  
       // send a message to another module via another service       // send a message to another module via another service
       Message *ModuleSendWait(pegasus_module & handle,        AsyncReply *ModuleSendWait(const pegasus_module & handle,
                               Uint32 destination_q,                               Uint32 destination_q,
                               String & destination_module,                                   const String & destination_module,
                               Message *message);                                   AsyncRequest *message) throw(Permission, Deadlock, IPCException);
  
       // send a message to another service        // send an async message to another service
       Boolean ModuleSendAsync(pegasus_module & handle,        Boolean ModuleSendAsync(const pegasus_module & handle,
                               Uint32 msg_handle,                               Uint32 msg_handle,
                               Uint32 destination_q,                               Uint32 destination_q,
                               Message *message);                                AsyncRequest *message,
                                 void *callback_parm) throw(Permission, IPCException);
  
       // send a message to another module via another service        // send an async message to another module via another service
       Boolean ModuleSendAsync(pegasus_module & handle,        Boolean ModuleSendAsync(const pegasus_module & handle,
                               Uint32 msg_handle,                               Uint32 msg_handle,
                               Uint32 destination_q,                               Uint32 destination_q,
                               String & destination_module,                                const String & destination_module,
                               Message *message);                                AsyncRequest *message,
                                 void *callback_parm) throw(Permission, IPCException);
   
         Boolean ModuleSendForget(const pegasus_module & handle,
                                  Uint32 destination_q,
                                  AsyncRequest *message)
            throw(Permission, IPCException);
  
       Uint32 blocking_thread_exec(pegasus_module & handle,        Boolean ModuleSendForget(const pegasus_module & handle,
                                  Uint32 destination_q,
                                  const String & destination_module,
                                  AsyncRequest *message)
            throw(Permission, IPCException);
   
         void blocking_thread_exec(const pegasus_module & handle,
                                   PEGASUS_THREAD_RETURN (PEGASUS_THREAD_CDECL *thread_func)(void *),                                   PEGASUS_THREAD_RETURN (PEGASUS_THREAD_CDECL *thread_func)(void *),
                                   void *parm);                                  void *parm) throw(Permission, Deadlock, IPCException);
       Uint32 async_thread_exec(pegasus_module & handle,        void async_thread_exec(const pegasus_module & handle,
                                PEGASUS_THREAD_RETURN (PEGASUS_THREAD_CDECL *thread_func)(void *),                                PEGASUS_THREAD_RETURN (PEGASUS_THREAD_CDECL *thread_func)(void *),
                                void *parm);                               void *parm) throw(Permission, Deadlock, IPCException);
  
       // << Thu Mar 14 09:52:56 2002 mdd >>        Boolean verify_handle(pegasus_module *);
       // need to add a blocking semaphore to ThreadPool for "joinable" threads  
       // need to define a special message type for sending messages to modules        static ModuleController & get_client_handle(const pegasus_identity & id,
       //                                                    client_handle **handle)
            throw(IncompatibleTypesException);
   
         static ModuleController & get_client_handle(const char *controller,
                                                     const pegasus_identity & id,
                                                     client_handle **handle)
            throw(IncompatibleTypesException);
   
   
         void return_client_handle(client_handle *handle);
   
         // send a message to another service
         AsyncReply *ClientSendWait(const client_handle & handle,
                                    Uint32 destination_q,
                                    AsyncRequest *request)
            throw(Permission, IPCException);
   
         // send a message to another module via another service
         AsyncReply *ClientSendWait(const client_handle & handle,
                                    Uint32 destination_q,
                                    String & destination_module,
                                    AsyncRequest *message)
            throw(Permission, Deadlock, IPCException);
   
         // send an async message to another service
         Boolean ClientSendAsync(const client_handle & handle,
                                 Uint32 msg_handle,
                                 Uint32 destination_q,
                                 AsyncRequest *message,
                                 void (*async_callback)(Uint32, Message *, void *) ,
                                 void *callback_parm)
            throw(Permission, IPCException);
   
         // send an async message to another module via another service
         Boolean ClientSendAsync(const client_handle & handle,
                                 Uint32 msg_handle,
                                 Uint32 destination_q,
                                 const String & destination_module,
                                 AsyncRequest *message,
                                 void (*async_callback)(Uint32, Message *, void *),
                                 void *callback_parm )
            throw(Permission, IPCException);
   
         Boolean ClientSendForget(const client_handle & handle,
                                  Uint32 destination_q,
                                  AsyncRequest *message)
            throw(Permission, IPCException);
   
         Boolean ClientSendForget(const client_handle & handle,
                                  Uint32 destination_q,
                                  const String & destination_module,
                                  AsyncRequest *message)
            throw(Permission, IPCException);
   
         void client_blocking_thread_exec(const client_handle & handle,
                                          PEGASUS_THREAD_RETURN (PEGASUS_THREAD_CDECL *thread_func)(void *),
                                          void *parm)
            throw(Permission, Deadlock, IPCException);
         void client_async_thread_exec(const client_handle & handle,
                                       PEGASUS_THREAD_RETURN (PEGASUS_THREAD_CDECL *thread_func)(void *),
                                       void *parm)
            throw(Permission, Deadlock, IPCException);
  
    protected:    protected:
         // ATTN-RK-P2-20010322:  These methods are pure virtual in superclass
         virtual void handleEnqueue(void) {}
         virtual void handleEnqueue(Message *) {}
         virtual void _handle_async_request(AsyncRequest *rq);
         virtual void _handle_async_callback(AsyncOpNode *op);
  
    private:    private:
  
   
         class _module_lock
         {
            public:
               _module_lock(DQueue<pegasus_module> * list)
                  :_list(list)
               {
                  _list->lock();
   
               }
               ~_module_lock(void)
               {
                  _list->unlock();
               }
   
   
            private:
               _module_lock();
               DQueue<pegasus_module> * _list;
         };
   
   
   
         static void _async_handleEnqueue(AsyncOpNode *h, MessageQueue *q, void *parm);
       DQueue<pegasus_module> _modules;       DQueue<pegasus_module> _modules;
       ThreadPool _thread_pool;        pegasus_module _internal_module;
         AsyncReply *_send_wait(Uint32, AsyncRequest *);
         AsyncReply *_send_wait(Uint32, const String &, AsyncRequest *);
         Boolean _send_forget(Uint32, AsyncRequest *) throw(IPCException);
         Boolean _send_forget(Uint32, const String &, AsyncRequest *) throw(IPCException);
   
         void _blocking_thread_exec(
            PEGASUS_THREAD_RETURN (PEGASUS_THREAD_CDECL *thread_func)(void *),
            void *parm) ;
         void _async_thread_exec(
            PEGASUS_THREAD_RETURN (PEGASUS_THREAD_CDECL *thread_func)(void *),
            void *parm) ;
 }; };
  
  
   
   
   
   
   
   
   
 PEGASUS_NAMESPACE_END PEGASUS_NAMESPACE_END
  
  
 #endif // Pegasus_Module_Controller_h  #endif // Pegasus_Module_Controller_H


Legend:
Removed from v.1.2  
changed lines
  Added in v.1.40

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2