diff options
Diffstat (limited to 'OpenSim/Region/Modules')
-rw-r--r-- | OpenSim/Region/Modules/AvatarFactory/AvatarFactoryModule.cs | 204 |
1 files changed, 103 insertions, 101 deletions
diff --git a/OpenSim/Region/Modules/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/Modules/AvatarFactory/AvatarFactoryModule.cs index 3ac8e9a..7dae702 100644 --- a/OpenSim/Region/Modules/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/Modules/AvatarFactory/AvatarFactoryModule.cs | |||
@@ -59,112 +59,114 @@ namespace OpenSim.Region.Modules.AvatarFactory | |||
59 | 59 | ||
60 | public bool TryGetAvatarAppearance(LLUUID avatarId, out AvatarAppearance appearance) | 60 | public bool TryGetAvatarAppearance(LLUUID avatarId, out AvatarAppearance appearance) |
61 | { | 61 | { |
62 | appearance = m_scene.CommsManager.UserService.GetUserAppearance(avatarId); | ||
63 | return true; | ||
62 | 64 | ||
63 | //should only let one thread at a time do this part | 65 | // //should only let one thread at a time do this part |
64 | EventWaitHandle waitHandle = null; | 66 | // EventWaitHandle waitHandle = null; |
65 | bool fetchInProgress = false; | 67 | // bool fetchInProgress = false; |
66 | lock (m_syncLock) | 68 | // lock (m_syncLock) |
67 | { | 69 | // { |
68 | appearance = CheckCache(avatarId); | 70 | // appearance = CheckCache(avatarId); |
69 | if (appearance != null) | 71 | // if (appearance != null) |
70 | { | 72 | // { |
71 | return true; | 73 | // return true; |
72 | } | 74 | // } |
73 | |||
74 | //not in cache so check to see if another thread is already fetching it | ||
75 | if (m_fetchesInProgress.TryGetValue(avatarId, out waitHandle)) | ||
76 | { | ||
77 | fetchInProgress = true; | ||
78 | } | ||
79 | else | ||
80 | { | ||
81 | fetchInProgress = false; | ||
82 | |||
83 | //no thread already fetching this appearance, so add a wait handle to list | ||
84 | //for any following threads that want the same appearance | ||
85 | waitHandle = new EventWaitHandle(false, EventResetMode.ManualReset); | ||
86 | m_fetchesInProgress.Add(avatarId, waitHandle); | ||
87 | } | ||
88 | } | ||
89 | 75 | ||
90 | if (fetchInProgress) | 76 | // //not in cache so check to see if another thread is already fetching it |
91 | { | 77 | // if (m_fetchesInProgress.TryGetValue(avatarId, out waitHandle)) |
92 | waitHandle.WaitOne(); | 78 | // { |
93 | appearance = CheckCache(avatarId); | 79 | // fetchInProgress = true; |
94 | if (appearance != null) | 80 | // } |
95 | { | 81 | // else |
96 | waitHandle = null; | 82 | // { |
97 | return true; | 83 | // fetchInProgress = false; |
98 | } | ||
99 | else | ||
100 | { | ||
101 | waitHandle = null; | ||
102 | return false; | ||
103 | } | ||
104 | } | ||
105 | else | ||
106 | { | ||
107 | // BUG: !? (Reduced from 5000 to 500 by Adam) | ||
108 | Thread.Sleep(500); //why is this here? | ||
109 | |||
110 | //this is the first thread to request this appearance | ||
111 | //so let it check the db and if not found then create a default appearance | ||
112 | //and add that to the cache | ||
113 | appearance = CheckDatabase(avatarId); | ||
114 | if (appearance != null) | ||
115 | { | ||
116 | //appearance has now been added to cache so lets pulse any waiting threads | ||
117 | lock (m_syncLock) | ||
118 | { | ||
119 | m_fetchesInProgress.Remove(avatarId); | ||
120 | waitHandle.Set(); | ||
121 | } | ||
122 | // waitHandle.Close(); | ||
123 | waitHandle = null; | ||
124 | return true; | ||
125 | } | ||
126 | 84 | ||
127 | //not found a appearance for the user, so create a new default one | 85 | // //no thread already fetching this appearance, so add a wait handle to list |
128 | appearance = CreateDefault(avatarId); | 86 | // //for any following threads that want the same appearance |
129 | if (appearance != null) | 87 | // waitHandle = new EventWaitHandle(false, EventResetMode.ManualReset); |
130 | { | 88 | // m_fetchesInProgress.Add(avatarId, waitHandle); |
131 | //update database | 89 | // } |
132 | if (m_enablePersist) | 90 | // } |
133 | { | ||
134 | m_appearanceMapper.Add(avatarId.UUID, appearance); | ||
135 | } | ||
136 | 91 | ||
137 | //add appearance to dictionary cache | 92 | // if (fetchInProgress) |
138 | lock (m_avatarsAppearance) | 93 | // { |
139 | { | 94 | // waitHandle.WaitOne(); |
140 | m_avatarsAppearance[avatarId] = appearance; | 95 | // appearance = CheckCache(avatarId); |
141 | } | 96 | // if (appearance != null) |
97 | // { | ||
98 | // waitHandle = null; | ||
99 | // return true; | ||
100 | // } | ||
101 | // else | ||
102 | // { | ||
103 | // waitHandle = null; | ||
104 | // return false; | ||
105 | // } | ||
106 | // } | ||
107 | // else | ||
108 | // { | ||
109 | // // BUG: !? (Reduced from 5000 to 500 by Adam) | ||
110 | // Thread.Sleep(500); //why is this here? | ||
111 | |||
112 | // //this is the first thread to request this appearance | ||
113 | // //so let it check the db and if not found then create a default appearance | ||
114 | // //and add that to the cache | ||
115 | // appearance = CheckDatabase(avatarId); | ||
116 | // if (appearance != null) | ||
117 | // { | ||
118 | // //appearance has now been added to cache so lets pulse any waiting threads | ||
119 | // lock (m_syncLock) | ||
120 | // { | ||
121 | // m_fetchesInProgress.Remove(avatarId); | ||
122 | // waitHandle.Set(); | ||
123 | // } | ||
124 | // // waitHandle.Close(); | ||
125 | // waitHandle = null; | ||
126 | // return true; | ||
127 | // } | ||
142 | 128 | ||
143 | //appearance has now been added to cache so lets pulse any waiting threads | 129 | // //not found a appearance for the user, so create a new default one |
144 | lock (m_syncLock) | 130 | // appearance = CreateDefault(avatarId); |
145 | { | 131 | // if (appearance != null) |
146 | m_fetchesInProgress.Remove(avatarId); | 132 | // { |
147 | waitHandle.Set(); | 133 | // //update database |
148 | } | 134 | // if (m_enablePersist) |
149 | // waitHandle.Close(); | 135 | // { |
150 | waitHandle = null; | 136 | // m_appearanceMapper.Add(avatarId.UUID, appearance); |
151 | return true; | 137 | // } |
152 | } | 138 | |
153 | else | 139 | // //add appearance to dictionary cache |
154 | { | 140 | // lock (m_avatarsAppearance) |
155 | //something went wrong, so release the wait handle and remove it | 141 | // { |
156 | //all waiting threads will fail to find cached appearance | 142 | // m_avatarsAppearance[avatarId] = appearance; |
157 | //but its better for them to fail than wait for ever | 143 | // } |
158 | lock (m_syncLock) | 144 | |
159 | { | 145 | // //appearance has now been added to cache so lets pulse any waiting threads |
160 | m_fetchesInProgress.Remove(avatarId); | 146 | // lock (m_syncLock) |
161 | waitHandle.Set(); | 147 | // { |
162 | } | 148 | // m_fetchesInProgress.Remove(avatarId); |
163 | //waitHandle.Close(); | 149 | // waitHandle.Set(); |
164 | waitHandle = null; | 150 | // } |
165 | return false; | 151 | // // waitHandle.Close(); |
166 | } | 152 | // waitHandle = null; |
167 | } | 153 | // return true; |
154 | // } | ||
155 | // else | ||
156 | // { | ||
157 | // //something went wrong, so release the wait handle and remove it | ||
158 | // //all waiting threads will fail to find cached appearance | ||
159 | // //but its better for them to fail than wait for ever | ||
160 | // lock (m_syncLock) | ||
161 | // { | ||
162 | // m_fetchesInProgress.Remove(avatarId); | ||
163 | // waitHandle.Set(); | ||
164 | // } | ||
165 | // //waitHandle.Close(); | ||
166 | // waitHandle = null; | ||
167 | // return false; | ||
168 | // } | ||
169 | // } | ||
168 | } | 170 | } |
169 | 171 | ||
170 | private AvatarAppearance CreateDefault(LLUUID avatarId) | 172 | private AvatarAppearance CreateDefault(LLUUID avatarId) |