You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by dp...@apache.org on 2017/04/26 09:12:30 UTC

[46/50] [abbrv] logging-log4net git commit: Implemented nestable locking and delegated impersonation to the locking model.

Implemented nestable locking and delegated impersonation to the locking model.



Project: http://git-wip-us.apache.org/repos/asf/logging-log4net/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4net/commit/e4b66da7
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4net/tree/e4b66da7
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4net/diff/e4b66da7

Branch: refs/heads/origin/trunk
Commit: e4b66da7f737a0eb0a99f86737c4906091610e1d
Parents: 0ce7747
Author: Niall Daley <ni...@apache.org>
Authored: Tue Mar 15 21:12:29 2005 +0000
Committer: Niall Daley <ni...@apache.org>
Committed: Tue Mar 15 21:12:29 2005 +0000

----------------------------------------------------------------------
 src/Appender/FileAppender.cs | 170 +++++++++++++++++++-------------------
 1 file changed, 87 insertions(+), 83 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4net/blob/e4b66da7/src/Appender/FileAppender.cs
----------------------------------------------------------------------
diff --git a/src/Appender/FileAppender.cs b/src/Appender/FileAppender.cs
index 4cb76a4..2e9e6f7 100755
--- a/src/Appender/FileAppender.cs
+++ b/src/Appender/FileAppender.cs
@@ -88,6 +88,8 @@ namespace log4net.Appender
 
 			private Stream m_realStream=null;
 			private LockingModelBase m_lockingModel=null;
+			private int m_readTotal=-1;
+			private int m_lockLevel=0;
 
 			public LockingStream(LockingModelBase locking) : base()
 			{
@@ -103,7 +105,10 @@ namespace log4net.Appender
 			// Methods
 			public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state)
 			{
-				throw new NotSupportedException("Read operations are not supported on the LockingStream");
+				AssertLocked();
+				IAsyncResult ret=m_realStream.BeginRead(buffer,offset,count,callback,state);
+				m_readTotal=EndRead(ret);
+				return ret;
 			}
 
 			/// <summary>
@@ -124,12 +129,12 @@ namespace log4net.Appender
 
 			public override int EndRead(IAsyncResult asyncResult) 
 			{
-				throw new NotSupportedException("Read operations are not supported on the LockingStream");
+				AssertLocked();
+				return m_readTotal;
 			}
 			public override void EndWrite(IAsyncResult asyncResult) 
 			{
-				AssertLocked();
-				m_realStream.EndWrite(asyncResult);
+				//No-op, it's already been handled
 			}
 			public override void Flush() 
 			{
@@ -138,11 +143,11 @@ namespace log4net.Appender
 			}
 			public override int Read(byte[] buffer, int offset, int count) 
 			{
-				throw new NotSupportedException("Read operations are not supported on the LockingStream");
+				return m_realStream.Read(buffer,offset,count);
 			}
 			public override int ReadByte() 
 			{
-				throw new NotSupportedException("Read operations are not supported on the LockingStream");
+				return m_realStream.ReadByte();
 			}
 			public override long Seek(long offset, SeekOrigin origin) 
 			{
@@ -224,23 +229,31 @@ namespace log4net.Appender
 				}
 			}
 
-			public void AcquireLock()
+			public bool AcquireLock()
 			{
+				bool ret=false;
 				lock(this)
 				{
-					if (m_realStream == null)
+					if (m_lockLevel==0)
 					{
 						// If lock is already acquired, nop
 						m_realStream=m_lockingModel.AcquireLock();
 					}
+					if (m_realStream!=null)
+					{
+						m_lockLevel++;
+						ret=true;
+					}
 				}
+				return ret;
 			}
 
 			public void ReleaseLock()
 			{
 				lock(this)
 				{
-					if (m_realStream != null)
+					m_lockLevel--;
+					if (m_lockLevel==0)
 					{
 						// If already unlocked, nop
 						m_lockingModel.ReleaseLock();
@@ -266,7 +279,7 @@ namespace log4net.Appender
 		/// </remarks>
 		public abstract class LockingModelBase
 		{
-			private IErrorHandler m_errorHandler=null;
+			private FileAppender m_appender=null;
 
 			/// <summary>
 			/// Open the output file
@@ -319,34 +332,12 @@ namespace log4net.Appender
 			public abstract void ReleaseLock();
 
 			/// <summary>
-			/// Gets or sets the <see cref="IErrorHandler"/> for this appender.
+			/// The appender we are related to. Used to identify the security context to work within, and the error handler to use.
 			/// </summary>
-			/// <value>The <see cref="IErrorHandler"/> of the appender</value>
-			/// <remarks>
-			/// <para>
-			/// The <see cref="AppenderSkeleton"/> provides a default 
-			/// implementation for the <see cref="ErrorHandler"/> property. 
-			/// </para>
-			/// </remarks>
-			virtual public IErrorHandler ErrorHandler 
+			public FileAppender CurrentAppender
 			{
-				get { return this.m_errorHandler; }
-				set 
-				{
-					lock(this) 
-					{
-						if (value == null) 
-						{
-							// We do not throw exception here since the cause is probably a
-							// bad config file.
-							LogLog.Warn("AppenderSkeleton: You have tried to set a null error-handler.");
-						} 
-						else 
-						{
-							m_errorHandler = value;
-						}
-					}
-				}
+				get { return m_appender; }
+				set { m_appender=value; }
 			}
 		}
 
@@ -381,22 +372,25 @@ namespace log4net.Appender
 			{
 				try
 				{
-					// Ensure that the directory structure exists
-					string directoryFullName = Path.GetDirectoryName(filename);
-
-					// Only create the directory if it does not exist
-					// doing this check here resolves some permissions failures
-					if (!Directory.Exists(directoryFullName))
+					using(CurrentAppender.SecurityContext.Impersonate(this))
 					{
-						Directory.CreateDirectory(directoryFullName);
-					}
+						// Ensure that the directory structure exists
+						string directoryFullName = Path.GetDirectoryName(filename);
+
+						// Only create the directory if it does not exist
+						// doing this check here resolves some permissions failures
+						if (!Directory.Exists(directoryFullName))
+						{
+							Directory.CreateDirectory(directoryFullName);
+						}
 
-					FileMode fileOpenMode = append ? FileMode.Append : FileMode.Create;
-					m_stream = new FileStream(filename, fileOpenMode, FileAccess.Write, FileShare.Read);
+						FileMode fileOpenMode = append ? FileMode.Append : FileMode.Create;
+						m_stream = new FileStream(filename, fileOpenMode, FileAccess.Write, FileShare.Read);
+					}
 				}
 				catch (Exception e1)
 				{
-					ErrorHandler.Error("Unable to acquire lock on file "+filename+". "+e1.Message);
+					CurrentAppender.ErrorHandler.Error("Unable to acquire lock on file "+filename+". "+e1.Message);
 				}
 			}
 
@@ -410,7 +404,10 @@ namespace log4net.Appender
 			/// </remarks>
 			public override void CloseFile()
 			{
-				m_stream.Close();
+				using(CurrentAppender.SecurityContext.Impersonate(this))
+				{
+					m_stream.Close();
+				}
 			}
 
 			/// <summary>
@@ -508,23 +505,26 @@ namespace log4net.Appender
 				{
 					try
 					{
-						// Ensure that the directory structure exists
-						string directoryFullName = Path.GetDirectoryName(m_filename);
-
-						// Only create the directory if it does not exist
-						// doing this check here resolves some permissions failures
-						if (!Directory.Exists(directoryFullName))
+						using(CurrentAppender.SecurityContext.Impersonate(this))
 						{
-							Directory.CreateDirectory(directoryFullName);
+							// Ensure that the directory structure exists
+							string directoryFullName = Path.GetDirectoryName(m_filename);
+
+							// Only create the directory if it does not exist
+							// doing this check here resolves some permissions failures
+							if (!Directory.Exists(directoryFullName))
+							{
+								Directory.CreateDirectory(directoryFullName);
+							}
+
+							FileMode fileOpenMode = m_append ? FileMode.Append : FileMode.Create;
+							m_stream = new FileStream(m_filename, fileOpenMode, FileAccess.Write, FileShare.Read);
+							m_append=true;
 						}
-
-						FileMode fileOpenMode = m_append ? FileMode.Append : FileMode.Create;
-						m_stream = new FileStream(m_filename, fileOpenMode, FileAccess.Write, FileShare.Read);
-						m_append=true;
 					}
 					catch (Exception e1)
 					{
-						ErrorHandler.Error("Unable to acquire lock on file "+m_filename+". "+e1.Message);
+						CurrentAppender.ErrorHandler.Error("Unable to acquire lock on file "+m_filename+". "+e1.Message);
 					}
 				}
 				return m_stream;
@@ -541,8 +541,11 @@ namespace log4net.Appender
 			/// </remarks>
 			public override void ReleaseLock()
 			{
-				m_stream.Close();
-				m_stream=null;
+				using(CurrentAppender.SecurityContext.Impersonate(this))
+				{
+					m_stream.Close();
+					m_stream=null;
+				}
 			}
 		}
 
@@ -740,7 +743,7 @@ namespace log4net.Appender
 				m_lockingModel = new FileAppender.ExclusiveLock();
 			}
 
-			m_lockingModel.ErrorHandler = this.ErrorHandler;
+			m_lockingModel.CurrentAppender=this;
 
 			using(SecurityContext.Impersonate(this))
 			{
@@ -806,14 +809,16 @@ namespace log4net.Appender
 		/// </remarks>
 		override protected void Append(LoggingEvent loggingEvent) 
 		{
-			m_stream.AcquireLock();
-			try
+			if (m_stream.AcquireLock())
 			{
-				base.Append(loggingEvent);
-			}
-			finally
-			{
-				m_stream.ReleaseLock();
+				try
+				{
+					base.Append(loggingEvent);
+				}
+				finally
+				{
+					m_stream.ReleaseLock();
+				}
 			}
 		}
 
@@ -854,14 +859,16 @@ namespace log4net.Appender
 		{
 			if (m_stream!=null)
 			{
-				m_stream.AcquireLock();
-				try
-				{
-					base.WriteHeader();
-				}
-				finally
+				if (m_stream.AcquireLock())
 				{
-					m_stream.ReleaseLock();
+					try
+					{
+						base.WriteHeader();
+					}
+					finally
+					{
+						m_stream.ReleaseLock();
+					}
 				}
 			}
 		}
@@ -976,12 +983,9 @@ namespace log4net.Appender
 				m_fileName = fileName;
 				m_appendToFile = append;
 
-				using(SecurityContext.Impersonate(this))
-				{
-					LockingModel.ErrorHandler=this.ErrorHandler;
-					LockingModel.OpenFile(fileName,append,m_encoding);
-					m_stream=new LockingStream(LockingModel);
-				}
+				LockingModel.CurrentAppender=this;
+				LockingModel.OpenFile(fileName,append,m_encoding);
+				m_stream=new LockingStream(LockingModel);
 
 				if (m_stream != null)
 				{