> Have you tried using a BundleTracker? > > It doesn't give you internal access to the Framework's locks... > nothing does I believe (and hope!).
In a way, it does. BundleTracker.Tracked implements SynchronousBundleListener. An instance of Tracked holds a lock on itself during the processing of the relevant listener callbacks (most of which hold a "state change" lock on the bundle). It thus "forwards" the internal "state change" lock to a lock on itself. So all the operations of BundleTracker that are synchronized on its associated instance of Tracked are effectively synchronized on the framework's internal "state change" lock. It's just a rather complicated way to access that "state change" lock. But thanks for the hint, I had forgotten about the bundle tracker---it's not required very often. It seems like big tool for my simple problem. I'll check if it does what I need. Michael > > It does however handle the complexity of getting current state and > listening at the same time. When you open the tracker, the > addingBundle() method (which you should override) is invoked with any > bundles that are *already* in the state that you are looking for. Then > addingBundle() is invoked for any bundles that later enter the state > you are looking for. In any case it is only invoked once, unless of > course a bundle transitions in and out of the required state multiple > times. This should solve your non-idempotent problem. > > Neil > > On Fri, 1 Mar 2019 at 12:39, Michael Lipp via osgi-dev > <osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org>> wrote: > > Hi, > > I just want to make sure: there's no method for obtaining the "state > change" lock on a Bundle, right? > > I'm asking because I want an action to be performed once the > bundle has > reached a particular state. Without this lock I have to follow the > usual > procedure for such cases: > > * Check for target state > > * Register listener > > * Check for target state again (because target state may have been > reached between previous check and registration of listener, so > listener > is never invoked). > > ... which gets a bit more complicated still if the action to be > performed when the target state is reached isn't idempotent. > > A bundle "state change" lock is mentioned in the > SynchronousBundleListener API, but I couldn't find a way to access it. > > Best regards, > > Michael > > _______________________________________________ > OSGi Developer Mail List > osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org> > https://mail.osgi.org/mailman/listinfo/osgi-dev >
_______________________________________________ OSGi Developer Mail List osgi-dev@mail.osgi.org https://mail.osgi.org/mailman/listinfo/osgi-dev