You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Steven E. Harris" <se...@panix.com> on 2007/02/16 19:14:21 UTC
Confusion about concurrency in ServiceListener/ServiceTracker callbacks
I'm confused as to whether a ServiceListener can be called on from
multiple threads by the OSGi framework, say, if two service-related
events occurred "at the same" time by different threads registering
and unregistering services.
The question extends to ServiceTracker and its
ServiceTrackerCustomizer: Can the addingService(), modifiedService(),
and removedService() methods be called on concurrently, meaning that
their operation must be made thread-aware?
Section 6.1.21 of the OSGi R4 core specification reads:
,----
| When a ServiceEvent is fired, it is synchronously delivered to a
| BundleListener.
`----
Aside from it looking like "BundleListener" should probably be
"ServiceListener", the sentence sounds like it's saying that only one
ServiceEvent will be delivered to a ServiceListener at a time. Is that
true?
If so, can I also conclude that a ServiceTrackerCustomizer will only
be called on by one thread at a time? I ask because the
ServiceTrackerCustomizer implementation has some synchronized blocks
that are attempting to protect some of its data against concurrent
access, but the user-provided callback functions are called on outside
of those synchronized regions.
--
Steven E. Harris
Re: [osgi-dev] Re: Confusion about concurrency in ServiceListener/ServiceTracker
callbacks
Posted by BJ Hargrave <ha...@us.ibm.com>.
And to follow up on this, I updated the javadoc to specifically document
the thread-safety of ServiceTracker for 4.1.
BJ Hargrave
Senior Technical Staff Member, IBM
OSGi Fellow and CTO of the OSGi Alliance
hargrave@us.ibm.com
office: +1 386 848 1781
mobile: +1 386 848 3788
Re: Confusion about concurrency in ServiceListener/ServiceTracker callbacks
Posted by BJ Hargrave <ha...@us.ibm.com>.
This would be best asked in the osgi-dev list since it is not a felix
specific issue.
But ServiceTracker is designed to be thread safe (I wrote most of the code
and maintain it). Therefore STC implementations need to be thead safe as
well.
> Section 6.1.21 of the OSGi R4 core specification reads:
>
> ,----
> | When a ServiceEvent is fired, it is synchronously delivered to a
> | BundleListener.
> `----
>
Wow. Change history for that file makes it my mistake... I have fixed it
for 4.1. Thanks.
What the sentence is saying is that ServiceEvents are delivered
synchronously from the action that caused the event (e.g. register
service, etc.) and the action is blocked from completion until all
interested service listeners have been called and returned. A service
listener can be called by multiple threads delivering service events and
can be reentered by the same thread if the listener takes some action
which fires a service event.
Net: STC implementation must be thread safe.
BJ Hargrave
Senior Technical Staff Member, IBM
OSGi Fellow and CTO of the OSGi Alliance
hargrave@us.ibm.com
office: +1 386 848 1781
mobile: +1 386 848 3788
"Steven E. Harris" <se...@panix.com>
02/16/2007 01:14 PM
Please respond to
felix-dev@incubator.apache.org
To
felix-dev@incubator.apache.org
cc
Subject
Confusion about concurrency in ServiceListener/ServiceTracker callbacks
I'm confused as to whether a ServiceListener can be called on from
multiple threads by the OSGi framework, say, if two service-related
events occurred "at the same" time by different threads registering
and unregistering services.
The question extends to ServiceTracker and its
ServiceTrackerCustomizer: Can the addingService(), modifiedService(),
and removedService() methods be called on concurrently, meaning that
their operation must be made thread-aware?
Section 6.1.21 of the OSGi R4 core specification reads:
,----
| When a ServiceEvent is fired, it is synchronously delivered to a
| BundleListener.
`----
Aside from it looking like "BundleListener" should probably be
"ServiceListener", the sentence sounds like it's saying that only one
ServiceEvent will be delivered to a ServiceListener at a time. Is that
true?
If so, can I also conclude that a ServiceTrackerCustomizer will only
be called on by one thread at a time? I ask because the
ServiceTrackerCustomizer implementation has some synchronized blocks
that are attempting to protect some of its data against concurrent
access, but the user-provided callback functions are called on outside
of those synchronized regions.
--
Steven E. Harris