| 
					
				 | 
			
			
				@@ -0,0 +1,75 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using System;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using System.Collections.Generic;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using System.Linq;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using System.Text;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using System.Threading;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+namespace MediaBrowser.Common.Logging
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public abstract class ThreadedLogger : BaseLogger
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Thread loggingThread;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Queue<Action> queue = new Queue<Action>();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        AutoResetEvent hasNewItems = new AutoResetEvent(false);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        volatile bool terminate = false;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        bool waiting = false;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public ThreadedLogger()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            : base()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            loggingThread = new Thread(new ThreadStart(ProcessQueue));
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            loggingThread.IsBackground = true;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            loggingThread.Start();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        void ProcessQueue()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            while (!terminate)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                waiting = true;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                hasNewItems.WaitOne(10000, true);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                waiting = false;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Queue<Action> queueCopy;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                lock (queue)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    queueCopy = new Queue<Action>(queue);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    queue.Clear();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                foreach (var log in queueCopy)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    log();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        protected override void LogEntry(LogRow row)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            lock (queue)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                queue.Enqueue(() => AsyncLogMessage(row));
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            hasNewItems.Set();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        protected abstract void AsyncLogMessage(LogRow row);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        protected override void Flush()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            while (!waiting)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Thread.Sleep(1);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public override void Dispose()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Flush();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            terminate = true;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            hasNewItems.Set();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            base.Dispose();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}
 
			 |