if (e.getException() instanceof RuntimeException) throw (RuntimeException) e.getException();
	protected AbstractBundle installWorker(String location, PrivilegedExceptionAction action) throws BundleException {		synchronized (installLock) {			while (true) {				/* Check that the bundle is not already installed. */				AbstractBundle bundle = getBundleByLocation(location);				/* If already installed, return bundle object */				if (bundle != null) {					return bundle;				}				Thread current = Thread.currentThread();				/* Check for and make reservation */				Thread reservation = (Thread) installLock.put(location, current);				/* if the location is not already reserved */				if (reservation == null) {					/* we have made the reservation and can continue */					break;				}				/* the location was already reserved */				/*				 * If the reservation is held by the current thread, we have				 * recursed to install the same bundle!				 */				if (current.equals(reservation)) {					throw new BundleException(Msg.formatter.getString("BUNDLE_INSTALL_RECURSION_EXCEPTION")); //$NON-NLS-1$				}				try {					/* wait for the reservation to be released */					installLock.wait();				} catch (InterruptedException e) {				}			}		}		/* Don't call adaptor while holding the install lock */		try {			AbstractBundle bundle = (AbstractBundle) AccessController.doPrivileged(action);			publishBundleEvent(BundleEvent.INSTALLED, bundle);			return bundle;		} catch (PrivilegedActionException e) {			throw (BundleException) e.getException();		} finally {			synchronized (installLock) {				/* release reservation */				installLock.remove(location);				/* wake up all waiters */				installLock.notifyAll();			}		}	}