You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ma...@apache.org on 2012/09/27 23:30:59 UTC
svn commit: r1391225 - in
/felix/trunk/deviceaccess/src/main/java/org/apache/felix/das:
Activator.java DeviceManager.java util/DriverMatcher.java
Author: marrs
Date: Thu Sep 27 21:30:58 2012
New Revision: 1391225
URL: http://svn.apache.org/viewvc?rev=1391225&view=rev
Log:
FELIX-3660 Applied the supplied patch.
Modified:
felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/Activator.java
felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/DeviceManager.java
felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/util/DriverMatcher.java
Modified: felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/Activator.java
URL: http://svn.apache.org/viewvc/felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/Activator.java?rev=1391225&r1=1391224&r2=1391225&view=diff
==============================================================================
--- felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/Activator.java (original)
+++ felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/Activator.java Thu Sep 27 21:30:58 2012
@@ -41,10 +41,10 @@ public class Activator extends Dependenc
{
/** the bundle context */
- private BundleContext m_context;
+ private volatile BundleContext m_context;
/** the dependency manager */
- private DependencyManager m_manager;
+ private volatile DependencyManager m_manager;
/** the device manager */
private DeviceManager m_deviceManager;
@@ -96,7 +96,7 @@ public class Activator extends Dependenc
.setCallbacks( "locatorAdded", "locatorRemoved" ) );
svc.add( createServiceDependency().setService( Driver.class, driverFilter ).setRequired( false )
- .setCallbacks( "driverAdded", "driverRemoved" ) );
+ .setCallbacks( "driverAdded", "driverModified", "driverRemoved" ) );
svc.add( createServiceDependency().setService( deviceFilter ).setRequired( false )
.setCallbacks( "deviceAdded", "deviceModified", "deviceRemoved" ) );
Modified: felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/DeviceManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/DeviceManager.java?rev=1391225&r1=1391224&r2=1391225&view=diff
==============================================================================
--- felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/DeviceManager.java (original)
+++ felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/DeviceManager.java Thu Sep 27 21:30:58 2012
@@ -211,15 +211,26 @@ public class DeviceManager implements Lo
debug( "driver appeared: " + Util.showDriver( ref ) );
//immediately check for idle devices
-// submit( new CheckForIdleDevices() );
+ submit( new CheckForIdleDevices() );
}
+ public void driverModified( ServiceReference ref, Object obj )
+ {
+ final Driver driver = Driver.class.cast( obj );
+
+ debug( "driver modified: " + Util.showDriver( ref ) );
+ m_drivers.remove( ref );
+ m_drivers.put( ref , new DriverAttributes( ref, driver ) );
+
+ // check if devices have become idle
+ // after some time
+ schedule( new CheckForIdleDevices() );
+ }
public void driverRemoved( ServiceReference ref )
{
- String driverId = String.class.cast( ref.getProperty( Constants.DRIVER_ID ) );
debug( "driver lost: " + Util.showDriver( ref ) );
- m_drivers.remove( driverId );
+ m_drivers.remove( ref );
// check if devices have become idle
// after some time
@@ -464,6 +475,11 @@ public class DeviceManager implements Lo
private boolean isDriverBundle( Bundle bundle )
{
ServiceReference[] refs = bundle.getRegisteredServices();
+
+ if (refs == null) {
+ return false;
+ }
+
for ( ServiceReference ref : refs )
{
if ( m_driverImplFilter.match( ref ) )
@@ -491,7 +507,14 @@ public class DeviceManager implements Lo
{
// just call the tryUninstall; the da itself
// will know if it should really uninstall the driver.
- da.tryUninstall();
+ try
+ {
+ da.tryUninstall();
+ }
+ catch (Exception e)
+ {
+ debug(da.getDriverId() + " uninstall failed");
+ }
}
return null;
@@ -557,7 +580,7 @@ public class DeviceManager implements Lo
// first find matching driver bundles
// if there are no driver locators
- // we'll have to do with the drivers that where
+ // we'll have to do with the drivers that were
// added 'manually'
Set<String> driverIds = m_driverLoader.findDrivers( m_locators, dict );
@@ -673,8 +696,7 @@ public class DeviceManager implements Lo
// its a referral
info( "attach led to a referral to: " + newDriverId );
m_excluded.add( m_finalDriver );
- return driverAttachment( dict, new String[]
- { newDriverId } );
+ return driverAttachment( dict, new String[]{ newDriverId } );
}
catch ( Throwable t )
{
Modified: felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/util/DriverMatcher.java
URL: http://svn.apache.org/viewvc/felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/util/DriverMatcher.java?rev=1391225&r1=1391224&r2=1391225&view=diff
==============================================================================
--- felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/util/DriverMatcher.java (original)
+++ felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/util/DriverMatcher.java Thu Sep 27 21:30:58 2012
@@ -27,6 +27,7 @@ import java.util.TreeMap;
import org.apache.felix.das.DriverAttributes;
import org.apache.felix.das.Log;
+import org.osgi.framework.Bundle;
import org.osgi.framework.ServiceReference;
import org.osgi.service.device.Constants;
import org.osgi.service.device.DriverSelector;
@@ -109,9 +110,20 @@ public class DriverMatcher
public Match selectBestMatch( ServiceReference deviceRef, DriverSelector selector )
{
- Match[] matches = m_matches.toArray( new Match[0] );
+// Match[] matches = m_matches.toArray( new Match[0] );
+
+ //(re)check bundle status
+ List<Match> activeMatches = new ArrayList<Match>();
+ for (Match match : m_matches) {
+ if (match.getDriver().getBundle().getState() == Bundle.ACTIVE) {
+ activeMatches.add(match);
+ } else {
+ m_log.debug("skipping: " + match + ", it's bundle is: " + match.getDriver().getBundle().getState());
+ }
+ }
try
{
+ Match[] matches = activeMatches.toArray( new Match[0] );
int index = selector.select( deviceRef, matches );
if ( index != DriverSelector.SELECT_NONE && index >= 0 && index < matches.length )
{