[ 
https://issues.apache.org/jira/browse/FELIX-2748?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Richard S. Hall updated FELIX-2748:
-----------------------------------

    Affects Version/s:     (was: framework-3.0.6)
                       framework-3.0.7
        Fix Version/s: framework-3.2.0

> Possible synchronization issue with BundleContext.getBundle()
> -------------------------------------------------------------
>
>                 Key: FELIX-2748
>                 URL: https://issues.apache.org/jira/browse/FELIX-2748
>             Project: Felix
>          Issue Type: Bug
>          Components: Framework
>    Affects Versions: framework-3.0.7
>            Reporter: Sahoo
>             Fix For: framework-3.2.0
>
>
> On 12/26/10 23:24, Sahoo wrote:
> > Hi,
> >
> > Looking at the code, it seems to me that BundleContext.getBundle() can 
> > return a bundle even though the BundleContext has been invalidated. I say 
> > this based on the following reasoning:
> >
> > public BundleContext.getBundle()
> > {
> >         checkValidity();
> >
> >         return m_bundle;
> > }
> >
> > private void checkValidity() // non-synchronized method
> > {
> >         if (m_valid) // m_valid is a non-volatile field
> >         {
> >             switch (m_bundle.getState())
> >             {
> >                 case Bundle.ACTIVE:
> >                 case Bundle.STARTING:
> >                 case Bundle.STOPPING:
> >                     return;
> >             }
> >         }
> >
> >         throw new IllegalStateException("Invalid BundleContext.");
> >
> > }
> >
> > protected void invalidate()    {        m_valid = false;    }
> >
> > class Bundle  {
> >   public int getState() // non-synchronized method
> >     {
> >         return m_state;
> >     }
> > }
> >
> > time t1: thread1 has access to bundleContext.
> > time t2: thread2 calls b.update()
> > time t3: bundle has been stopped and is now in STARTING state. thread1 
> > calls bundleContext.getBundle().
> > Since m_valid is not a volatile field, it can see m_valid as true, although 
> > thread2 would have set it to false. Since m_state is volatile, it sees its 
> > value as STARTING. So, it fails to detect invalidation of the bundle and is 
> > returned with the bundle object instead of IllegalStateException.
> >
> > Am I missing anything here?
> No, I think you are correct.
> I'll have to think about it a little more, but I think the real issue here is 
> the fact that the validity of the bundle context has to be more directly tied 
> to the bundle. They can't be treated as independent values, because even if 
> they were both volatile or synchronized, you could still end up with a change 
> in state between checking each value.
> I think the simpler BundleContext.checkValidity() method should be something 
> like:
>     m_bundle._getBundleContext() == this
> Which says as long as "this" bundle context is the bundle's bundle context, 
> then it is valid. I think. I'll still need to think about it. :-)
> Want to open a bug on this issue?
> Is this a theoretical exercise or are you suffering from this?
> -> richard

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to