|
using System;
using System.Collections.Concurrent;
using System.Threading;
using log4net;
using Raven.Database.Data;
using Raven.Database.Storage;
namespace Raven.Database.Indexing
{
public class WorkContext
{
private readonly ConcurrentQueue<ServerError> serverErrors = new ConcurrentQueue<ServerError>();
private readonly object waitForWork = new object();
private volatile bool doWork = true;
private readonly ILog log = LogManager.GetLogger(typeof (WorkContext));
private ThreadLocal<bool> shouldNotifyOnWork = new ThreadLocal<bool>();
public bool DoWork
{
get { return doWork; }
}
public IndexStorage IndexStorage { get; set; }
public IndexDefinitionStorage IndexDefinitionStorage { get; set; }
public TransactionalStorage TransactionaStorage { get; set; }
public ServerError[] Errors
{
get { return serverErrors.ToArray(); }
}
public void WaitForWork()
{
if (!doWork)
return;
lock (waitForWork)
{
Monitor.Wait(waitForWork);
}
}
public void ShouldNotifyAboutWork()
{
shouldNotifyOnWork.Value = true;
}
public void NotifyAboutWork()
{
if (shouldNotifyOnWork.Value == false)
return;
shouldNotifyOnWork.Value = false;
lock (waitForWork)
{
log.Debug("Notifying background workers about work");
Monitor.PulseAll(waitForWork);
}
}
public void StopWork()
{
log.Debug("Stopping background workers");
doWork = false;
lock (waitForWork)
{
Monitor.PulseAll(waitForWork);
}
}
public void AddError(string index, string key, string error)
{
serverErrors.Enqueue(new ServerError
{
Document = key,
Error = error,
Index = index,
Timestamp = DateTime.Now
});
if (serverErrors.Count <= 50)
return;
ServerError ignored;
serverErrors.TryDequeue(out ignored);
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
I've been a software developer since 1996 and have enjoyed C# since 2003. I have a Bachelor's degree in Computer Science and for some reason, a Master's degree in Business Administration. I currently do software development contracting/consulting.
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.