diff options
author | Siva Velusamy <vsiva@google.com> | 2011-08-23 09:47:27 -0700 |
---|---|---|
committer | Siva Velusamy <vsiva@google.com> | 2011-08-23 17:08:23 -0700 |
commit | f35c5c55a2d644a7705637b4ff99aa6417d7577b (patch) | |
tree | bb80f9d7c2f5d8e4123873c203562a7f64c34d1f /ddms | |
parent | 726b97c5d578ade3c616174b415c1c58d83cfa29 (diff) | |
download | sdk-f35c5c55a2d644a7705637b4ff99aa6417d7577b.zip sdk-f35c5c55a2d644a7705637b4ff99aa6417d7577b.tar.gz sdk-f35c5c55a2d644a7705637b4ff99aa6417d7577b.tar.bz2 |
Make the logcat fifo size user configurable.
Add a preference where users can set the size of the message list.
Defaults to 1000.
Change-Id: Ia888c3802f07607274bfbdca0ade8fbda009ba55
Diffstat (limited to 'ddms')
5 files changed, 88 insertions, 19 deletions
diff --git a/ddms/app/src/com/android/ddms/PrefsDialog.java b/ddms/app/src/com/android/ddms/PrefsDialog.java index 42ab76c..4745ed7 100644 --- a/ddms/app/src/com/android/ddms/PrefsDialog.java +++ b/ddms/app/src/com/android/ddms/PrefsDialog.java @@ -23,6 +23,7 @@ import com.android.ddmlib.Log; import com.android.ddmlib.Log.LogLevel; import com.android.ddmuilib.DdmUiPreferences; import com.android.ddmuilib.PortFieldEditor; +import com.android.ddmuilib.logcat.LogCatMessageList; import com.android.ddmuilib.logcat.LogCatPanel; import com.android.sdkstats.SdkStatsPermissionDialog; import com.android.sdkstats.SdkStatsService; @@ -447,6 +448,12 @@ public final class PrefsDialog { "Text output font:", getFieldEditorParent()); addField(ffe); + + IntegerFieldEditor maxMessages = new IntegerFieldEditor( + LogCatMessageList.MAX_MESSAGES_PREFKEY, + "Maximum number of logcat messages to buffer", + getFieldEditorParent()); + addField(maxMessages); } } } diff --git a/ddms/app/src/com/android/ddms/UIThread.java b/ddms/app/src/com/android/ddms/UIThread.java index 27a66d1..0bb211b 100644 --- a/ddms/app/src/com/android/ddms/UIThread.java +++ b/ddms/app/src/com/android/ddms/UIThread.java @@ -1368,7 +1368,9 @@ public class UIThread implements IUiSelectionListener, IClientChangeListener { } private void createLogCatView(Composite parent) { - mLogCatPanel = new LogCatPanel(new LogCatReceiver(), DdmUiPreferences.getStore()); + IPreferenceStore prefStore = DdmUiPreferences.getStore(); + LogCatReceiver receiver = new LogCatReceiver(prefStore); + mLogCatPanel = new LogCatPanel(receiver, prefStore); mLogCatPanel.createPanel(parent); if (mCurrentDevice != null) { diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatMessageList.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatMessageList.java index ce9017d..7651250 100644 --- a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatMessageList.java +++ b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatMessageList.java @@ -16,28 +16,56 @@ package com.android.ddmuilib.logcat; -import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; /** * Container for a list of log messages. The list of messages are * maintained in a circular buffer (FIFO). */ public final class LogCatMessageList { - /** Size of the FIFO. - * FIXME: this should be a user preference. - */ - private static final int MAX_MESSAGES = 1000; + /** Preference key for size of the FIFO. */ + public static final String MAX_MESSAGES_PREFKEY = + "logcat.messagelist.max.size"; + + /** Default value for max # of messages. */ + public static final int MAX_MESSAGES_DEFAULT = 5000; - private Queue<LogCatMessage> mQ; + private int mFifoSize; + private BlockingQueue<LogCatMessage> mQ; private LogCatMessage[] mQArray; /** * Construct an empty message list. + * @param maxMessages capacity of the circular buffer + */ + public LogCatMessageList(int maxMessages) { + mFifoSize = maxMessages; + + mQ = new ArrayBlockingQueue<LogCatMessage>(mFifoSize); + mQArray = new LogCatMessage[mFifoSize]; + } + + /** + * Resize the message list. + * @param n new size for the list */ - public LogCatMessageList() { - mQ = new ArrayBlockingQueue<LogCatMessage>(MAX_MESSAGES); - mQArray = new LogCatMessage[MAX_MESSAGES]; + public synchronized void resize(int n) { + mFifoSize = n; + + if (mFifoSize > mQ.size()) { + /* if resizing to a bigger fifo, we can copy over all elements from the current mQ */ + mQ = new ArrayBlockingQueue<LogCatMessage>(mFifoSize, true, mQ); + } else { + /* for a smaller fifo, copy over the last n entries */ + LogCatMessage[] curMessages = mQ.toArray(new LogCatMessage[mQ.size()]); + mQ = new ArrayBlockingQueue<LogCatMessage>(mFifoSize); + for (int i = curMessages.length - mFifoSize; i < curMessages.length; i++) { + mQ.offer(curMessages[i]); + } + } + + mQArray = new LogCatMessage[mFifoSize]; } /** @@ -46,7 +74,7 @@ public final class LogCatMessageList { * @param m log to be inserted */ public synchronized void appendMessage(final LogCatMessage m) { - if (mQ.size() == MAX_MESSAGES) { + if (mQ.remainingCapacity() == 0) { /* make space by removing the first entry */ mQ.poll(); } @@ -65,7 +93,7 @@ public final class LogCatMessageList { * @return array containing all the log messages */ public Object[] toArray() { - if (mQ.size() == MAX_MESSAGES) { + if (mQ.size() == mFifoSize) { /* * Once the queue is full, it stays full until the user explicitly clears * all the logs. Optimize for this case by not reallocating the array. diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatPanel.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatPanel.java index 215bdbd..eda5fe9 100644 --- a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatPanel.java +++ b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatPanel.java @@ -130,11 +130,13 @@ public final class LogCatPanel extends SelectionDependentPanel mReceiver.addMessageReceivedEventListener(this); - initializeFilters(prefStore); - initializeFonts(prefStore); + initializeFilters(); + + setupDefaultPreferences(); + initializePreferenceUpdateListeners(); } - private void initializeFilters(IPreferenceStore prefStore) { + private void initializeFilters() { mLogCatFilters = new ArrayList<LogCatFilter>(); /* add default filter matching all messages */ @@ -150,15 +152,26 @@ public final class LogCatPanel extends SelectionDependentPanel mLogCatFilters.addAll(savedFilters); } - private void initializeFonts(IPreferenceStore prefStore) { + private void setupDefaultPreferences() { PreferenceConverter.setDefault(mPrefStore, LogCatPanel.LOGCAT_VIEW_FONT_PREFKEY, DEFAULT_LOGCAT_FONT); + mPrefStore.setDefault(LogCatMessageList.MAX_MESSAGES_PREFKEY, + LogCatMessageList.MAX_MESSAGES_DEFAULT); + } + private void initializePreferenceUpdateListeners() { mPrefStore.addPropertyChangeListener(new IPropertyChangeListener() { public void propertyChange(PropertyChangeEvent event) { - if (event.getProperty().equals(LogCatPanel.LOGCAT_VIEW_FONT_PREFKEY)) { + String changedProperty = event.getProperty(); + + if (changedProperty.equals(LogCatPanel.LOGCAT_VIEW_FONT_PREFKEY)) { mLogCatMessageLabelProvider.setFont(getFontFromPrefStore()); refreshLogCatTable(); + } else if (changedProperty.equals( + LogCatMessageList.MAX_MESSAGES_PREFKEY)) { + mReceiver.resizeFifo(mPrefStore.getInt( + LogCatMessageList.MAX_MESSAGES_PREFKEY)); + refreshLogCatTable(); } } }); diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatReceiver.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatReceiver.java index 0ba0ef6..410fee3 100644 --- a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatReceiver.java +++ b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatReceiver.java @@ -20,6 +20,8 @@ import com.android.ddmlib.IDevice; import com.android.ddmlib.Log; import com.android.ddmlib.MultiLineReceiver; +import org.eclipse.jface.preference.IPreferenceStore; + import java.util.ArrayList; import java.util.List; @@ -37,11 +39,15 @@ public final class LogCatReceiver { private List<ILogCatMessageEventListener> mLogCatMessageListeners; private LogCatMessageParser mLogCatMessageParser; private LogCatPidToNameMapper mPidToNameMapper; + private IPreferenceStore mPrefStore; /** * Construct a LogCat message receiver. + * @param prefStore */ - public LogCatReceiver() { + public LogCatReceiver(IPreferenceStore prefStore) { + mPrefStore = prefStore; + mLogCatMessageListeners = new ArrayList<ILogCatMessageEventListener>(); mLogCatMessageParser = new LogCatMessageParser(); mPidToNameMapper = new LogCatPidToNameMapper(); @@ -83,7 +89,7 @@ public final class LogCatReceiver { } mCurrentDevice = device; - mLogMessages = new LogCatMessageList(); + mLogMessages = new LogCatMessageList(getFifoSize()); mLogCatMessageParser.resetState(); startReceiverThread(); @@ -91,6 +97,11 @@ public final class LogCatReceiver { mPidToNameMapper.setDevice(mCurrentDevice); } + private int getFifoSize() { + int n = mPrefStore.getInt(LogCatMessageList.MAX_MESSAGES_PREFKEY); + return n == 0 ? LogCatMessageList.MAX_MESSAGES_DEFAULT : n; + } + private void startReceiverThread() { mCurrentLogCatOutputReceiver = new LogCatOutputReceiver(); @@ -192,4 +203,12 @@ public final class LogCatReceiver { l.messageReceived(messages); } } + + /** + * Resize the internal FIFO. + * @param size new size + */ + public void resizeFifo(int size) { + mLogMessages.resize(size); + } } |