1 : //==============================================================================
2 : // File <$/src/cpp/prod/lib/stubmgr.cpp>
3 : // This file is part of YaOrb : Yet Another Object Request Broker,
4 : // Copyright (c) 2000-2003, Marc Alff.
5 : //
6 : // This program is free software; you can redistribute it and/or
7 : // modify it under the terms of the GNU General Public License
8 : // as published by the Free Software Foundation; either version 2
9 : // of the License, or (at your option) any later version.
10 : //
11 : // This program is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 : //
16 : // You should have received a copy of the GNU General Public License
17 : // along with this program; if not, write to the Free Software
18 : // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 : //
20 : //==============================================================================
21 :
22 : #include <yaorb/CORBA.h>
23 : #include <yaorb/YAORB.h>
24 :
25 : #include "src/cpp/prod/lib/dimensioning.h"
26 : #include "src/cpp/prod/tool/DEVELOPMENT.h"
27 : #include "src/cpp/prod/tool/Assert.h"
28 : #include "src/cpp/prod/tool/Hash.h"
29 : #include "src/cpp/prod/tool/Log.h"
30 :
31 : //=============================================================================
32 : // StubInfo Hash table
33 : //=============================================================================
34 :
35 : class StubInfoHash : public THash<YAORB::StubInfo, YAORB::RepositoryID>
36 : {
37 : public :
38 : StubInfoHash(int size) ;
39 0 : ~StubInfoHash() {}
40 :
41 : private :
42 : static int myHashFn(const YAORB::RepositoryID* key) ;
43 : static bool myCmpFn(const YAORB::StubInfo* obj,
44 : const YAORB::RepositoryID *key) ;
45 :
46 : } ;
47 :
48 49 : StubInfoHash::StubInfoHash(int size)
49 98 : : THash<YAORB::StubInfo, YAORB::RepositoryID> ( & myHashFn, & myCmpFn, size)
50 : {
51 : }
52 :
53 : int
54 : StubInfoHash::myHashFn(
55 12 : const YAORB::RepositoryID* key)
56 : {
57 12 : return key->hash() ;
58 : }
59 :
60 : bool
61 : StubInfoHash::myCmpFn(
62 : const YAORB::StubInfo* obj,
63 4 : const YAORB::RepositoryID *key)
64 : {
65 : ASSERT(obj != NULL) ;
66 : ASSERT(key != NULL) ;
67 :
68 4 : const YAORB::ClassInfo* info = obj->GetClassInfo() ;
69 4 : const YAORB::RepositoryID* id = info->GetRepositoryID() ;
70 :
71 4 : if (id == key)
72 : {
73 : return true ;
74 : }
75 :
76 4 : if (*id == *key)
77 : {
78 : return true ;
79 : }
80 :
81 : return false ;
82 : }
83 :
84 49 : static StubInfoHash _hash(YAORB::DIM_STUB_INFO_HASH_TABLE) ;
85 :
86 : //=============================================================================
87 : // StubInfo link list
88 : //=============================================================================
89 :
90 : // Note : this pointer is **statically** initialized by
91 : // the **linker**, not dynamically initialized by __main in crt0.o !
92 :
93 : static YAORB::StubInfo * g_allStubInfo = NULL ;
94 :
95 : //=============================================================================
96 : // StubMgr
97 : //=============================================================================
98 :
99 : void
100 4 : YAORB::StubMgr::RegisterAll(void)
101 : {
102 : // FIXME : not MT-safe.
103 :
104 4 : YAORB::StubInfo *current = g_allStubInfo ;
105 : const YAORB::ClassInfo *info ;
106 : const YAORB::RepositoryID *id ;
107 4 : String message ;
108 :
109 12 : while (current != NULL)
110 : {
111 8 : info = current->GetClassInfo() ;
112 8 : id = info->GetRepositoryID() ;
113 : _hash.Insert(current, id) ;
114 :
115 8 : message = "Registering Stub : " ;
116 8 : message += id->getId() ;
117 8 : DEBUGLOG(message) ;
118 :
119 8 : current = current->_next ;
120 0 : }
121 : }
122 :
123 : void
124 : YAORB::StubMgr::RegisterStubInfo(
125 8 : YAORB::StubInfo* info)
126 : {
127 : // FIXME : not MT-safe.
128 : // Note : Safe during initialization in __main.
129 8 : info->_next = g_allStubInfo ;
130 8 : g_allStubInfo = info ;
131 : }
132 :
133 : YAORB::StubInfo*
134 : YAORB::StubMgr::FindStubInfo(
135 4 : const YAORB::RepositoryID* id)
136 : {
137 : YAORB::StubInfo *info = NULL ;
138 : info = _hash.FindByKey(id) ;
139 :
140 4 : if (info == NULL)
141 : {
142 0 : String message ;
143 0 : message = "Unknown Stub : " ;
144 0 : message += id->getId() ;
145 0 : DEBUGLOG(message) ;
146 : }
147 :
148 : return info ;
149 49 : }
150 49 :
|