[ http://issues.apache.org/jira/browse/FELIX-169?page=all ]

Felix Meschberger updated FELIX-169:
------------------------------------

    Attachment: FELIX-169_2.diff

Proposed patch with following additions:
  * Felix.shutdown() method split into public Felix.shutdown() (checks status, 
calls Felix.shutdownInternal(), exits VM if not embedded) and private 
Felix.shutdownInternal() doing the rest of the work of the former 
Felix.shutdown() method.
  * SystemBundle.stop() method split into SystemBundle.stop() (just calls 
Felix.shutdown() in a separate thread if the framework is running) and 
SystemBundle.shutdown() (actually stops the SystemBundle)

The reasoning for these new methods is as follows:
   (1) Felix.shutdown() and SystemBundle.stop() should behave the same for a 
running framework: The framework should be shut down - albeit Felix.shutdown() 
works synchronously and SystemBundle.stop() must work asynchronously (according 
to the spec).
   (2) Calling Felix.shutdown() or SystemBundle.stop() (e.g. through 
context.getBundle(0).stop()) while the framework is shutting down should have 
no effect.
   (3) After taking the startlevel to zero, the SystemBundle must be regularly 
stopped, which primarily means stopping any BundleActivators started.

With the former combined SystemBundle.stop() method, issue (2) could not be 
solved, as either the BundleActivators were never stopped (as no shutdown 
thread was started) or calling SystemBundle.stop() while the framework was 
being stopped would result in the BundleActivators being stopped to early.

I split the Felix.shutdown() method just for source code complexity reasons: 
The framework shutdown should complete - with or without exception - and the 
the VM should be stopped no matter what if the framework is not embedded. 
Therefore, shutdown processing should be encapsulated by a try-catch statement.

> Shutdown of Felix through Felix.shutdown() does not call custom activator 
> stop methods
> --------------------------------------------------------------------------------------
>
>                 Key: FELIX-169
>                 URL: http://issues.apache.org/jira/browse/FELIX-169
>             Project: Felix
>          Issue Type: Bug
>            Reporter: Felix Meschberger
>         Attachments: FELIX-169.diff, FELIX-169_2.diff
>
>
> When starting Felix through Felix.start() a list of BundleActivator objects 
> may be handed in. Additionally, the SystemBundle adds some more 
> BundleActivators (e.g. the URLHandlersActivator. When stopping Felix through 
> the SystemBundle.stop() method, a separate thread is started, which calls the 
> Felix.shutdown() method, which ultimately calls back into the 
> SystemBundle.stop() method, which now - amongst other things - calls the 
> BundleActivator.stop() method of the additional BundleActivators.
> If shutting Felix down through Felix.shutdown() directly, a separate thread 
> is not started, and hence the BundleActivator.stop() methods are not called.
> I assume, the test for the m_shutdownThread field in the SystemBundle.stop 
> method is superfluous as this field is only set then Felix is stopped through 
> the system bundle.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to