Remove unnecessary class variable

This commit is contained in:
Dean Herbert 2018-02-13 14:58:15 +09:00
parent 3561326306
commit ab34123ba8
1 changed files with 9 additions and 11 deletions

View File

@ -16,8 +16,6 @@ public class DatabaseContextFactory : IDatabaseContextFactory
private readonly object writeLock = new object(); private readonly object writeLock = new object();
private OsuDbContext writeContext;
private bool currentWriteDidWrite; private bool currentWriteDidWrite;
private volatile int currentWriteUsages; private volatile int currentWriteUsages;
@ -43,7 +41,7 @@ public DatabaseWriteUsage GetForWrite()
Interlocked.Increment(ref currentWriteUsages); Interlocked.Increment(ref currentWriteUsages);
return new DatabaseWriteUsage(writeContext ?? (writeContext = threadContexts.Value), usageCompleted); return new DatabaseWriteUsage(threadContexts.Value, usageCompleted);
} }
private void usageCompleted(DatabaseWriteUsage usage) private void usageCompleted(DatabaseWriteUsage usage)
@ -56,19 +54,12 @@ private void usageCompleted(DatabaseWriteUsage usage)
if (usages > 0) return; if (usages > 0) return;
if (currentWriteDidWrite) if (currentWriteDidWrite)
{ {
writeContext.Dispose();
currentWriteDidWrite = false; currentWriteDidWrite = false;
// once all writes are complete, we want to refresh thread-specific contexts to make sure they don't have stale local caches. // once all writes are complete, we want to refresh thread-specific contexts to make sure they don't have stale local caches.
recycleThreadContexts(); recycleThreadContexts();
} }
// always set to null (even when a write didn't occur) so we get the correct thread context on next write request.
writeContext = null;
} }
finally finally
{ {
@ -76,7 +67,14 @@ private void usageCompleted(DatabaseWriteUsage usage)
} }
} }
private void recycleThreadContexts() => threadContexts = new ThreadLocal<OsuDbContext>(CreateContext); private void recycleThreadContexts()
{
if (threadContexts != null)
foreach (var context in threadContexts.Values)
context.Dispose();
threadContexts = new ThreadLocal<OsuDbContext>(CreateContext, true);
}
protected virtual OsuDbContext CreateContext() protected virtual OsuDbContext CreateContext()
{ {