diff options
Diffstat (limited to 'OpenSim/Region/CoreModules/Asset')
-rw-r--r-- | OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs | 85 |
1 files changed, 49 insertions, 36 deletions
diff --git a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs index 389fb7b..127ca1d 100644 --- a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs +++ b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs | |||
@@ -257,53 +257,66 @@ namespace Flotsam.RegionModules.AssetCache | |||
257 | 257 | ||
258 | private void UpdateFileCache(string key, AssetBase asset) | 258 | private void UpdateFileCache(string key, AssetBase asset) |
259 | { | 259 | { |
260 | string filename = GetFileName(asset.ID); | 260 | // TODO: Spawn this off to some seperate thread to do the actual writing |
261 | 261 | if (asset != null) | |
262 | try | ||
263 | { | 262 | { |
264 | // If the file is already cached, don't cache it, just touch it so access time is updated | 263 | string filename = GetFileName(key); |
265 | if (File.Exists(filename)) | 264 | |
266 | { | 265 | try |
267 | File.SetLastAccessTime(filename, DateTime.Now); | ||
268 | } | ||
269 | else | ||
270 | { | 266 | { |
271 | // Once we start writing, make sure we flag that we're writing | 267 | // If the file is already cached, don't cache it, just touch it so access time is updated |
272 | // that object to the cache so that we don't try to write the | 268 | if (File.Exists(filename)) |
273 | // same file multiple times. | ||
274 | lock (m_CurrentlyWriting) | ||
275 | { | 269 | { |
276 | #if WAIT_ON_INPROGRESS_REQUESTS | 270 | // We don't really want to know about sharing |
277 | if (m_CurrentlyWriting.ContainsKey(filename)) | 271 | // violations here. If the file is locked, then |
272 | // the other thread has updated the time for us. | ||
273 | try | ||
278 | { | 274 | { |
279 | return; | 275 | File.SetLastAccessTime(filename, DateTime.Now); |
280 | } | 276 | } |
281 | else | 277 | catch |
282 | { | ||
283 | m_CurrentlyWriting.Add(filename, new ManualResetEvent(false)); | ||
284 | } | ||
285 | |||
286 | #else | ||
287 | if (m_CurrentlyWriting.Contains(filename)) | ||
288 | { | 278 | { |
289 | return; | ||
290 | } | 279 | } |
291 | else | 280 | } else { |
281 | |||
282 | // Once we start writing, make sure we flag that we're writing | ||
283 | // that object to the cache so that we don't try to write the | ||
284 | // same file multiple times. | ||
285 | lock (m_CurrentlyWriting) | ||
292 | { | 286 | { |
293 | m_CurrentlyWriting.Add(filename); | 287 | #if WAIT_ON_INPROGRESS_REQUESTS |
294 | } | 288 | if (m_CurrentlyWriting.ContainsKey(filename)) |
289 | { | ||
290 | return; | ||
291 | } | ||
292 | else | ||
293 | { | ||
294 | m_CurrentlyWriting.Add(filename, new ManualResetEvent(false)); | ||
295 | } | ||
296 | |||
297 | #else | ||
298 | if (m_CurrentlyWriting.Contains(filename)) | ||
299 | { | ||
300 | return; | ||
301 | } | ||
302 | else | ||
303 | { | ||
304 | m_CurrentlyWriting.Add(filename); | ||
305 | } | ||
295 | #endif | 306 | #endif |
296 | } | ||
297 | 307 | ||
298 | Util.FireAndForget( | 308 | } |
299 | delegate { WriteFileCache(filename, asset); }); | 309 | |
310 | Util.FireAndForget( | ||
311 | delegate { WriteFileCache(filename, asset); }); | ||
312 | } | ||
313 | } | ||
314 | catch (Exception e) | ||
315 | { | ||
316 | m_log.ErrorFormat( | ||
317 | "[FLOTSAM ASSET CACHE]: Failed to update cache for asset {0}. Exception {1} {2}", | ||
318 | asset.ID, e.Message, e.StackTrace); | ||
300 | } | 319 | } |
301 | } | ||
302 | catch (Exception e) | ||
303 | { | ||
304 | m_log.ErrorFormat( | ||
305 | "[FLOTSAM ASSET CACHE]: Failed to update cache for asset {0}. Exception {1} {2}", | ||
306 | asset.ID, e.Message, e.StackTrace); | ||
307 | } | 320 | } |
308 | } | 321 | } |
309 | 322 | ||