aboutsummaryrefslogtreecommitdiffstats
path: root/ddms
diff options
context:
space:
mode:
authorSiva Velusamy <vsiva@google.com>2011-08-23 09:47:27 -0700
committerSiva Velusamy <vsiva@google.com>2011-08-23 17:08:23 -0700
commitf35c5c55a2d644a7705637b4ff99aa6417d7577b (patch)
treebb80f9d7c2f5d8e4123873c203562a7f64c34d1f /ddms
parent726b97c5d578ade3c616174b415c1c58d83cfa29 (diff)
downloadsdk-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')
-rw-r--r--ddms/app/src/com/android/ddms/PrefsDialog.java7
-rw-r--r--ddms/app/src/com/android/ddms/UIThread.java4
-rw-r--r--ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatMessageList.java50
-rw-r--r--ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatPanel.java23
-rw-r--r--ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatReceiver.java23
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);
+ }
}