Return-Path: X-Original-To: apmail-felix-commits-archive@www.apache.org Delivered-To: apmail-felix-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id A1317CB55 for ; Wed, 8 Aug 2012 08:51:33 +0000 (UTC) Received: (qmail 78711 invoked by uid 500); 8 Aug 2012 08:51:32 -0000 Delivered-To: apmail-felix-commits-archive@felix.apache.org Received: (qmail 78427 invoked by uid 500); 8 Aug 2012 08:51:23 -0000 Mailing-List: contact commits-help@felix.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@felix.apache.org Delivered-To: mailing list commits@felix.apache.org Received: (qmail 78378 invoked by uid 99); 8 Aug 2012 08:51:21 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 08 Aug 2012 08:51:21 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 08 Aug 2012 08:51:18 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 71D7E23888E3 for ; Wed, 8 Aug 2012 08:50:34 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1370708 - /felix/trunk/log/src/main/java/org/apache/felix/log/LogListenerThread.java Date: Wed, 08 Aug 2012 08:50:34 -0000 To: commits@felix.apache.org From: jawi@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20120808085034.71D7E23888E3@eris.apache.org> Author: jawi Date: Wed Aug 8 08:50:34 2012 New Revision: 1370708 URL: http://svn.apache.org/viewvc?rev=1370708&view=rev Log: FELIX-3623: made the locks used to notify listeners of new log entries as small as possible by breaking them in separate locks. Also notify all listeners of all current log entries, instead of the 'single delivery' policy used before. Modified: felix/trunk/log/src/main/java/org/apache/felix/log/LogListenerThread.java Modified: felix/trunk/log/src/main/java/org/apache/felix/log/LogListenerThread.java URL: http://svn.apache.org/viewvc/felix/trunk/log/src/main/java/org/apache/felix/log/LogListenerThread.java?rev=1370708&r1=1370707&r2=1370708&view=diff ============================================================================== --- felix/trunk/log/src/main/java/org/apache/felix/log/LogListenerThread.java (original) +++ felix/trunk/log/src/main/java/org/apache/felix/log/LogListenerThread.java Wed Aug 8 08:50:34 2012 @@ -33,8 +33,6 @@ import org.osgi.service.log.LogListener; */ final class LogListenerThread extends Thread { - // Whether the thread is stopping or not. - private boolean m_stopping = false; // The list of entries waiting to be delivered to the log listeners. private final List m_entriesToDeliver = new ArrayList(); // The list of listeners. @@ -87,7 +85,10 @@ final class LogListenerThread extends Th */ int getListenerCount() { - return m_listeners.size(); + synchronized (m_listeners) + { + return m_listeners.size(); + } } /** @@ -97,8 +98,7 @@ final class LogListenerThread extends Th { synchronized (m_entriesToDeliver) { - m_stopping = true; - m_entriesToDeliver.notifyAll(); + interrupt(); } } @@ -108,34 +108,11 @@ final class LogListenerThread extends Th */ public void run() { - boolean stop = false; - - for (; !stop;) + while (!isInterrupted()) { + List entriesToDeliver = new ArrayList(); synchronized (m_entriesToDeliver) { - if (!m_entriesToDeliver.isEmpty()) - { - LogEntry entry = (LogEntry) m_entriesToDeliver.remove(0); - - synchronized (m_listeners) - { - Iterator listenerIt = m_listeners.iterator(); - while (listenerIt.hasNext()) - { - try - { - LogListener listener = (LogListener) listenerIt.next(); - listener.logged(entry); - } - catch (Throwable t) - { - // catch and discard any exceptions thrown by the listener - } - } - } - } - if (m_entriesToDeliver.isEmpty()) { try @@ -144,14 +121,49 @@ final class LogListenerThread extends Th } catch (InterruptedException e) { - // do nothing + // the interrupt-flag is cleared; so, let's play nice and + // interrupt this thread again to stop it... + interrupt(); } } + else + { + // Copy all current entries and deliver them in a single go... + entriesToDeliver.addAll(m_entriesToDeliver); + m_entriesToDeliver.clear(); + } } - - if (m_stopping) + + if (!entriesToDeliver.isEmpty()) { - stop = true; + // Take a snapshot of all current listeners and deliver all + // pending messages to them... + List listeners = new ArrayList(); + synchronized (m_listeners) + { + listeners.addAll(m_listeners); + } + + Iterator entriesIt = entriesToDeliver.iterator(); + while (entriesIt.hasNext()) + { + LogEntry entry = (LogEntry) entriesIt.next(); + + Iterator listenerIt = listeners.iterator(); + while (listenerIt.hasNext()) + { + LogListener listener = (LogListener) listenerIt.next(); + + try + { + listener.logged(entry); + } + catch (Throwable t) + { + // catch and discard any exceptions thrown by the listener + } + } + } } } }