private void close() { for (Entry<S, Integer> e : services.entrySet()) { for (int i = e.getValue().intValue(); i > 0; i--) { so.ungetService(e.getKey()); } } services.clear(); cciService = null; }
/** * Releases a service object for the {@link #getServiceReference() associated} service. * * @see org.osgi.framework.ServiceObjects#ungetService() */ public void ungetService(S service) { synchronized (rls) { if (rls.isEmpty()) { throw new IllegalStateException("Reference unbound"); } Integer refCnt = services.get(service); if (refCnt != null) { int cnt = refCnt.intValue() - 1; if (cnt == 0) { services.remove(service); } else { services.put(service, new Integer(cnt)); } } else { throw new IllegalArgumentException("Service not from this ComponentServiceObjects"); } } so.ungetService(service); }
@Override public boolean getServiceObject( ComponentContextImpl<S> key, BundleContext context, SimpleLogger logger) { final T service = key.getComponentServiceObjectsHelper() .getPrototypeRefInstance(this.getRef(), serviceObjects); if (service == null) { setFailed(); logger.log( LogService.LOG_WARNING, "Could not get service from serviceobjects for ref {0}", new Object[] {getRef()}, null); return false; } if (!setServiceObject(key, service)) { // Another thread got the service before, so unget our serviceObjects.ungetService(service); } return true; }