private void processRefQueueTx() throws InterruptedException
	{
	    // need WeakHandle.geRef to return when ref is enqueued - deadlock otherwise!
	    WeakHandle.returnEnqueued.set(Boolean.TRUE); 
		WeakHandle ref = (WeakHandle)refQueue.remove(phantomQueuePollInterval);
		while (ref != null)
		{
		    final HGPersistentHandle h = ref.getPersistent();
		    gcLock.writeLock().lock(); // we won't allow modifications to the cache maps during this
		    try
		    {
		        TxCacheMap<HGPersistentHandle, WeakHandle>.Box theBox = liveHandlesTx.boxOf(h);
		        if (theBox == null)
		            continue;
		        boolean keep = false;		        
		        for (VBoxBody<WeakHandle> body = theBox.getBody(); body != null && !keep; body = body.next)
		        {
		            // body.value can be null here if the atom got garbage collected before 
		            // a transaction committed 
		        	if (body.value != null /* && body.value.getRef() != null */) //2nd test added AP 2012-01-31
		            {
		        		Object x = body.value.getRef();
		        		if (x != null)
		        		{
			                VBox<?> bb = atomsTx.boxOf(x);
			                if (bb != null)
			                    keep = true;
		        		}
		            }		                
		        }
		        if (!keep)
		            liveHandles.drop(h);		       
		    }
		    finally
		    {
		        gcLock.writeLock().unlock();
	            ref.clear();
	            synchronized (ref) { ref.notifyAll(); }         
	            ref = (WeakHandle)refQueue.poll();		        
		    }		    
		}
		WeakHandle.returnEnqueued.set(Boolean.FALSE);		
	}