1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-09-10 12:03:16 +02:00

[255390] check memory to determine whether to queue

This commit is contained in:
David McKnight 2008-12-04 21:28:19 +00:00
parent 9aa73afcd1
commit bb0ad05d71

View file

@ -12,8 +12,8 @@
* Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley. * Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley.
* *
* Contributors: * Contributors:
* {Name} (company) - description of contribution.
* David McKnight (IBM) - [202822] don't need to remove children from map here * 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; package org.eclipse.dstore.internal.core.util;
@ -96,25 +96,48 @@ public class DataElementRemover extends Handler
numGCed++; numGCed++;
} }
public synchronized void addToQueueForRemoval(DataElement element) public synchronized void addToQueueForRemoval(DataElement element)
{ {
synchronized (_queue) 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()) if (_dataStore.isDoSpirit() && _dataStore == element.getDataStore())
{ {
QueueItem item = new QueueItem(element, System.currentTimeMillis()); QueueItem item = new QueueItem(element, System.currentTimeMillis());
_queue.add(item); _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() public void handle()
{ {
clearQueue(); clearQueue(false);
} }
public synchronized void clearQueue() public synchronized void clearQueue(boolean force)
{ {
synchronized (_queue) synchronized (_queue)
{ {
@ -139,7 +162,7 @@ public class DataElementRemover extends Handler
_dataStore.memLog("Size of queue: " + _queue.size()); //$NON-NLS-1$ _dataStore.memLog("Size of queue: " + _queue.size()); //$NON-NLS-1$
ArrayList toRefresh = new ArrayList(); 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; DataElement toBeDisconnected = ((QueueItem) _queue.removeFirst()).dataElement;
if (!toBeDisconnected.isSpirit()) if (!toBeDisconnected.isSpirit())
@ -149,6 +172,7 @@ public class DataElementRemover extends Handler
DataElement parent = toBeDisconnected.getParent(); DataElement parent = toBeDisconnected.getParent();
if (!toRefresh.contains(parent)) if (!toRefresh.contains(parent))
{ {
//System.out.println("disconnect parent:"+parent.getName());
toRefresh.add(toBeDisconnected.getParent()); toRefresh.add(toBeDisconnected.getParent());
} }
//_dataStore.refresh(toBeDisconnected); //_dataStore.refresh(toBeDisconnected);
@ -169,6 +193,7 @@ public class DataElementRemover extends Handler
_dataStore.memLog("Elements disconnected so far: " + numDisconnected); //$NON-NLS-1$ _dataStore.memLog("Elements disconnected so far: " + numDisconnected); //$NON-NLS-1$
_dataStore.memLog("Spirit elements cleaned so far: " + numRemoved); //$NON-NLS-1$ _dataStore.memLog("Spirit elements cleaned so far: " + numRemoved); //$NON-NLS-1$
_dataStore.memLog("DataElements GCed so far: " + numGCed); //$NON-NLS-1$ _dataStore.memLog("DataElements GCed so far: " + numGCed); //$NON-NLS-1$
System.gc();
} }
} }