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?

Thanks,
Sahoo

Reply via email to