DirectoryResource: Fix child resource race conditions and cache

master
Harald Wolff 2019-09-02 10:15:56 +02:00
parent 43321555e3
commit 32c6a8e15d
1 changed files with 20 additions and 11 deletions

View File

@ -59,22 +59,30 @@ namespace ln.http.resources
return true;
String cPath = PathHelper.FindPath(searchPaths.Select((p) => System.IO.Path.Combine(p, name)));
if ((cPath == null) && cache.ContainsKey(name))
cache.Remove(name);
lock (cache)
{
if ((cPath == null) && cache.ContainsKey(name))
cache.Remove(name);
}
return (cPath != null);
}
public override void AddResource(Resource resource)
{
cache.Add(resource.Name,resource);
lock (cache)
{
cache.Add(resource.Name, resource);
}
}
public override void RemoveResource(Resource resource)
{
if (cache.ContainsValue(resource))
cache.Remove(resource.Name);
lock (cache)
{
if (cache.ContainsValue(resource))
cache.Remove(resource.Name);
}
}
public void InjectResource(Resource resource)
@ -90,8 +98,11 @@ namespace ln.http.resources
if (injectedResources.ContainsKey(name))
return injectedResources[name];
if (cache.ContainsKey(name))
return cache[name];
lock (cache)
{
if (cache.ContainsKey(name))
return cache[name];
}
String cPath = PathHelper.FindPath(searchPaths.Select((p) => System.IO.Path.Combine(p,name)));
if (cPath == null)
@ -101,7 +112,6 @@ namespace ln.http.resources
{
DirectoryResource child = new DirectoryResource(this, searchPaths.Select((p)=> System.IO.Path.Combine(p,name)));
child.ResourceTypeHook = ResourceTypeHook;
cache[name] = child;
return child;
}
else if (File.Exists(cPath))
@ -117,7 +127,6 @@ namespace ln.http.resources
{
resource = new FileResource(this, fileInfo);
}
cache[name] = resource;
return resource;
}