/* * ==================================================================== * Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at http://svnkit.com/license.html. * If newer versions of this license are posted there, you may use a * newer version instead, at your option. * ==================================================================== */ package org.tmatesoft.svn.core.javahl; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; import org.tmatesoft.svn.core.internal.util.SVNHashMap; import java.util.Iterator; import java.util.Map; /** * @version 1.3 * @author TMate Software Ltd. */ public class SVNClientImplTracker implements Runnable { private static ReferenceQueue ourQueue; private static Map ourReferences = new SVNHashMap(); public static void registerClient(SVNClientImpl client) { synchronized (SVNClientImplTracker.class) { if (ourQueue == null) { ourQueue = new ReferenceQueue(); Thread th = new Thread(new SVNClientImplTracker()); th.setDaemon(true); th.start(); } } synchronized (ourReferences) { SVNClientImpl oldClient = null; for (Iterator refs = ourReferences.keySet().iterator(); refs.hasNext();) { WeakReference reference = (WeakReference) refs.next(); if (reference.get() == Thread.currentThread()) { oldClient = (SVNClientImpl) ourReferences.get(reference); if (oldClient != null) { oldClient.dispose(); } refs.remove(); } } WeakReference ref = new WeakReference(Thread.currentThread(), ourQueue); oldClient = (SVNClientImpl) ourReferences.put(ref, client); if (oldClient != null) { oldClient.dispose(); } } } public void run() { while(true) { Reference reference = null; try { reference = ourQueue.remove(); } catch (IllegalArgumentException e) { } catch (InterruptedException e) { } if (reference == null) { continue; } synchronized (ourReferences) { SVNClientImpl oldClient = (SVNClientImpl) ourReferences.remove(reference); if (oldClient != null) { oldClient.dispose(); } } } } }