1 : //==============================================================================
2 : // File <$/src/cpp/prod/lib/skelmgr.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 : // SkelInfo Hash table
33 : //=============================================================================
34 :
35 : class SkelInfoHash : public THash<YAORB::SkelInfo, YAORB::RepositoryID>
36 : {
37 : public :
38 : SkelInfoHash(int size) ;
39 0 : ~SkelInfoHash() {}
40 :
41 : private :
42 : static int myHashFn(const YAORB::RepositoryID* key) ;
43 : static bool myCmpFn(const YAORB::SkelInfo* obj,
44 : const YAORB::RepositoryID *key) ;
45 :
46 : } ;
47 :
48 49 : SkelInfoHash::SkelInfoHash(int size)
49 98 : : THash<YAORB::SkelInfo, YAORB::RepositoryID> ( & myHashFn, & myCmpFn, size)
50 : {
51 : }
52 :
53 : int
54 : SkelInfoHash::myHashFn(
55 16 : const YAORB::RepositoryID* key)
56 : {
57 16 : return key->hash() ;
58 : }
59 :
60 : bool
61 : SkelInfoHash::myCmpFn(
62 : const YAORB::SkelInfo* obj,
63 0 : const YAORB::RepositoryID *key)
64 : {
65 : ASSERT(obj != NULL) ;
66 : ASSERT(key != NULL) ;
67 :
68 0 : const YAORB::ClassInfo* info = obj->GetClassInfo() ;
69 0 : const YAORB::RepositoryID* id = info->GetRepositoryID() ;
70 :
71 0 : if (id == key)
72 : {
73 : return true ;
74 : }
75 :
76 0 : if (*id == *key)
77 : {
78 : return true ;
79 : }
80 :
81 : return false ;
82 : }
83 :
84 49 : static SkelInfoHash _hash(YAORB::DIM_SKEL_INFO_HASH_TABLE) ;
85 :
86 : //=============================================================================
87 : // SkelInfo 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::SkelInfo * g_allSkelInfo = NULL ;
94 :
95 : //=============================================================================
96 : // SkelMgr
97 : //=============================================================================
98 :
99 : void
100 2 : YAORB::SkelMgr::RegisterAll(void)
101 : {
102 : // FIXME : not MT-safe.
103 :
104 2 : YAORB::SkelInfo *current = g_allSkelInfo ;
105 : const YAORB::ClassInfo *info ;
106 : const YAORB::RepositoryID *id ;
107 2 : String message ;
108 :
109 18 : while (current != NULL)
110 : {
111 16 : info = current->GetClassInfo() ;
112 16 : id = info->GetRepositoryID() ;
113 : _hash.Insert(current, id) ;
114 :
115 16 : message = "Registering Skel : " ;
116 16 : message += id->getId() ;
117 16 : DEBUGLOG(message) ;
118 :
119 16 : current = current->_next ;
120 0 : }
121 : }
122 :
123 : void
124 : YAORB::SkelMgr::RegisterSkelInfo(
125 23 : YAORB::SkelInfo* info)
126 : {
127 : // FIXME : not MT-safe.
128 : // Note : Safe during initialization in __main.
129 23 : info->_next = g_allSkelInfo ;
130 23 : g_allSkelInfo = info ;
131 : }
132 :
133 : YAORB::SkelInfo*
134 : YAORB::SkelMgr::FindSkelInfo(
135 0 : const YAORB::RepositoryID* id)
136 : {
137 : YAORB::SkelInfo *info = NULL ;
138 : info = _hash.FindByKey(id) ;
139 :
140 0 : if (info == NULL)
141 : {
142 0 : String message ;
143 0 : message = "Unknown skel : " ;
144 0 : message += id->getId() ;
145 0 : DEBUGLOG(message) ;
146 : }
147 :
148 : return info ;
149 49 : }
150 49 :
|