blob: d15e4eafb6a9e02524f15d554ff03259f9f371be (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
// **********************************************************************
//
// Copyright (c) 2003-2013 ZeroC, Inc. All rights reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************
package IceInternal;
public final class LocatorManager
{
static private class LocatorKey implements Cloneable
{
public boolean
equals(Object o)
{
assert(o instanceof LocatorKey);
LocatorKey k = (LocatorKey)o;
if(!k._id.equals(_id))
{
return false;
}
if(!k._encoding.equals(_encoding))
{
return false;
}
return true;
}
public int
hashCode()
{
int h = 5381;
h = IceInternal.HashUtil.hashAdd(h, _id);
h = IceInternal.HashUtil.hashAdd(h, _encoding);
return h;
}
public java.lang.Object
clone()
{
java.lang.Object o = null;
try
{
o = super.clone();
}
catch(CloneNotSupportedException ex)
{
assert false; // impossible
}
return o;
}
LocatorKey set(Ice.LocatorPrx locator)
{
Reference r = ((Ice.ObjectPrxHelperBase)locator).__reference();
_id = r.getIdentity();
_encoding = r.getEncoding();
return this;
}
private Ice.Identity _id;
private Ice.EncodingVersion _encoding;
}
LocatorManager(Ice.Properties properties)
{
_background = properties.getPropertyAsInt("Ice.BackgroundLocatorCacheUpdates") > 0;
}
synchronized void
destroy()
{
for(LocatorInfo info : _table.values())
{
info.destroy();
}
_table.clear();
_locatorTables.clear();
}
//
// Returns locator info for a given locator. Automatically creates
// the locator info if it doesn't exist yet.
//
public LocatorInfo
get(Ice.LocatorPrx loc)
{
if(loc == null)
{
return null;
}
//
// The locator can't be located.
//
Ice.LocatorPrx locator = Ice.LocatorPrxHelper.uncheckedCast(loc.ice_locator(null));
//
// TODO: reap unused locator info objects?
//
synchronized(this)
{
LocatorInfo info = _table.get(locator);
if(info == null)
{
//
// Rely on locator identity for the adapter table. We want to
// have only one table per locator (not one per locator
// proxy).
//
LocatorTable table = _locatorTables.get(_lookupKey.set(locator));
if(table == null)
{
table = new LocatorTable();
_locatorTables.put((LocatorKey)_lookupKey.clone(), table);
}
info = new LocatorInfo(locator, table, _background);
_table.put(locator, info);
}
return info;
}
}
final private boolean _background;
private java.util.HashMap<Ice.LocatorPrx, LocatorInfo> _table =
new java.util.HashMap<Ice.LocatorPrx, LocatorInfo>();
private java.util.HashMap<LocatorKey, LocatorTable> _locatorTables =
new java.util.HashMap<LocatorKey, LocatorTable>();
private LocatorKey _lookupKey = new LocatorKey(); // A key used for the lookup
}
|