00001
00002
00003
00004
00005 #ifndef IMR_AsyncStartupWaiterI_H_
00006 #define IMR_AsyncStartupWaiterI_H_
00007
00008 #include "locator_export.h"
00009 #include "AsyncStartupWaiterS.h"
00010
00011 #include "ace/Vector_T.h"
00012 #include "ace/Hash_Map_Manager.h"
00013 #include "ace/Bound_Ptr.h"
00014 #include "ace/SString.h"
00015
00016 #if !defined (ACE_LACKS_PRAGMA_ONCE)
00017 #pragma once
00018 #endif
00019
00020
00021 class ImR_Locator_i;
00022
00023 class Locator_Export AsyncStartupWaiter_i : public virtual POA_ImplementationRepository::AMH_AsyncStartupWaiter
00024 {
00025 struct PendingData {
00026 PendingData();
00027 PendingData(const char* partial_ior, const char* ior);
00028 ACE_CString partial_ior;
00029 ACE_CString ior;
00030 };
00031 typedef ACE_Vector<PendingData> PendingList;
00032 typedef ACE_Strong_Bound_Ptr<PendingList, ACE_Null_Mutex> PendingListPtr;
00033 typedef ACE_Hash_Map_Manager_Ex<ACE_CString,
00034 PendingListPtr,
00035 ACE_Hash<ACE_CString>,
00036 ACE_Equal_To<ACE_CString>,
00037 ACE_Null_Mutex> PendingMap;
00038
00039 typedef ACE_Vector<ImplementationRepository::AMH_AsyncStartupWaiterResponseHandler_var> RHList;
00040 typedef ACE_Strong_Bound_Ptr<RHList, ACE_Null_Mutex> RHListPtr;
00041 typedef ACE_Hash_Map_Manager_Ex<ACE_CString,
00042 RHListPtr,
00043 ACE_Hash<ACE_CString>,
00044 ACE_Equal_To<ACE_CString>,
00045 ACE_Null_Mutex> WaitingMap;
00046
00047 public:
00048
00049 void wait_for_startup (
00050 ImplementationRepository::AMH_AsyncStartupWaiterResponseHandler_ptr rh,
00051 const char* name ACE_ENV_ARG_DECL)
00052 ACE_THROW_SPEC ((CORBA::SystemException));
00053
00054 void unblock_one(const char* name, const char* partial_ior, const char* ior, bool queue);
00055 void unblock_all(const char* name);
00056
00057 void debug(bool dbg);
00058
00059 private:
00060
00061 ImplementationRepository::AMH_AsyncStartupWaiterResponseHandler_ptr
00062 get_one_waiter(const char* name);
00063
00064 void get_all_waiters(const char* name, RHList& ret);
00065
00066 void send_response(ImplementationRepository::AMH_AsyncStartupWaiterResponseHandler& rh,
00067 const char* name, const char* partial_ior, const char* ior);
00068 private:
00069 WaitingMap waiting_;
00070 PendingMap pending_;
00071 bool debug_;
00072 };
00073
00074 #endif
00075