You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-cvs@jakarta.apache.org by ce...@apache.org on 2001/05/08 21:21:01 UTC

cvs commit: jakarta-log4j/src/java/org/apache/log4j AsyncAppender.java

ceki        01/05/08 12:21:00

  Modified:    src/java/org/apache/log4j AsyncAppender.java
  Log:
  Corrected the deadlock problem reported in bug #1603.
  
  Revision  Changes    Path
  1.17      +13 -10    jakarta-log4j/src/java/org/apache/log4j/AsyncAppender.java
  
  Index: AsyncAppender.java
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/AsyncAppender.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- AsyncAppender.java	2001/04/26 17:31:01	1.16
  +++ AsyncAppender.java	2001/05/08 19:20:57	1.17
  @@ -138,14 +138,18 @@
        dispatcher thread which will process all pending events before
        exiting. 
     */
  -  synchronized
     public 
     void close() {
  -    if(closed) // avoid multiple close, otherwise one gets NullPointerException
  -      return; 
  -
  -    closed = true;
  -
  +    synchronized(this) {
  +      if(closed) // avoid multiple close, otherwise one gets NullPointerException
  +	return; 
  +      closed = true;
  +    }
  +    
  +    // The following cannot be synchronized on "this" because the
  +    // dispatcher synchronizes with "this" in its while loop. If we
  +    // did synhcronize we would systematically get deadlocks when
  +    // close was called.
       dispatcher.close();
       try {
         dispatcher.join();
  @@ -333,7 +337,7 @@
       this.aai = container.aai;
       // set the dispatcher priority to lowest possible value
       this.setPriority(Thread.MIN_PRIORITY);
  -    
  +    this.setName(container.getName()+"Dispatcher");
       // set the dispatcher priority to MIN_PRIORITY plus or minus 2
       // depending on the direction of MIN to MAX_PRIORITY.
       //+ (Thread.MAX_PRIORITY > Thread.MIN_PRIORITY ? 1 : -1)*2);
  @@ -379,17 +383,16 @@
   	    return;
   	  }
   	  try {
  -	    //cat.debug("Waiting for new event to dispatch.");
  +	    //LogLog.debug("Waiting for new event to dispatch.");
   	    bf.wait();
   	  } catch(InterruptedException e) {
   	    LogLog.error("The dispathcer should not be interrupted.");
   	    break;
   	  }
   	}
  -	//cat.debug("About to get new event.");
   	event = bf.get();
   	if(bf.wasFull()) {
  -	  //cat.debug("Notifying AsyncAppender about freed space.");
  +	  //LogLog.debug("Notifying AsyncAppender about freed space.");
   	  bf.notify();
   	}
         } // synchronized
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-cvs-unsubscribe@jakarta.apache.org
For additional commands, e-mail: log4j-cvs-help@jakarta.apache.org