From bb0ad05d71baa66fe90e5d093b58f0bb76d300de Mon Sep 17 00:00:00 2001 From: David McKnight Date: Thu, 4 Dec 2008 21:28:19 +0000 Subject: [PATCH] [255390] check memory to determine whether to queue --- .../core/util/DataElementRemover.java | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/internal/core/util/DataElementRemover.java b/rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/internal/core/util/DataElementRemover.java index e71aa809a72..529dacdd28a 100644 --- a/rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/internal/core/util/DataElementRemover.java +++ b/rse/plugins/org.eclipse.dstore.core/src/org/eclipse/dstore/internal/core/util/DataElementRemover.java @@ -12,8 +12,8 @@ * Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley. * * Contributors: - * {Name} (company) - description of contribution. * David McKnight (IBM) - [202822] don't need to remove children from map here + * David McKnight (IBM) - [255390] check memory to determine whether to queue *******************************************************************************/ package org.eclipse.dstore.internal.core.util; @@ -96,25 +96,48 @@ public class DataElementRemover extends Handler numGCed++; } + public synchronized void addToQueueForRemoval(DataElement element) - { + { synchronized (_queue) { - + if(isMemoryThresholdExceeded()) { + if(element.isSpirit()) { + unmap(element); + } + + // do immediate clearing of queue since we're low on memory + clearQueue(true); + return; + } if (_dataStore.isDoSpirit() && _dataStore == element.getDataStore()) { QueueItem item = new QueueItem(element, System.currentTimeMillis()); _queue.add(item); } } + notifyInput(); + } + + private boolean isMemoryThresholdExceeded(){ + // trying to avoid using Java 1.5 + Runtime runtime = Runtime.getRuntime(); + long freeMem = runtime.freeMemory(); + + if (freeMem < 10000){ + + return true; + } + + return false; } public void handle() { - clearQueue(); + clearQueue(false); } - public synchronized void clearQueue() + public synchronized void clearQueue(boolean force) { synchronized (_queue) { @@ -139,7 +162,7 @@ public class DataElementRemover extends Handler _dataStore.memLog("Size of queue: " + _queue.size()); //$NON-NLS-1$ ArrayList toRefresh = new ArrayList(); - while (_queue.size() > 0 && System.currentTimeMillis() - ((QueueItem) _queue.getFirst()).timeStamp > _expiryTime) + while (_queue.size() > 0 && (force || System.currentTimeMillis() - ((QueueItem) _queue.getFirst()).timeStamp > _expiryTime)) { DataElement toBeDisconnected = ((QueueItem) _queue.removeFirst()).dataElement; if (!toBeDisconnected.isSpirit()) @@ -149,6 +172,7 @@ public class DataElementRemover extends Handler DataElement parent = toBeDisconnected.getParent(); if (!toRefresh.contains(parent)) { + //System.out.println("disconnect parent:"+parent.getName()); toRefresh.add(toBeDisconnected.getParent()); } //_dataStore.refresh(toBeDisconnected); @@ -169,6 +193,7 @@ public class DataElementRemover extends Handler _dataStore.memLog("Elements disconnected so far: " + numDisconnected); //$NON-NLS-1$ _dataStore.memLog("Spirit elements cleaned so far: " + numRemoved); //$NON-NLS-1$ _dataStore.memLog("DataElements GCed so far: " + numGCed); //$NON-NLS-1$ + System.gc(); } }