Hi Gregg,

The contention appears to be around the use of the existing single thread synchronized Policy implementations like DynamicPolicyProvider.

There are numerous places where Thread is checked (not just subclasses) by the SecurityManager using the checkAccess(Thread) method, this is delegated to AccessController.checkPermission(perm)

checkPermission(perm) gets the AccessControlContext of the currently executing stack, AccessControlContext.optimize() is called to remove duplicate PermissionDomain's

then AccessControlContext.checkPermission(perm) is called to check the permission's of all the ProtectionDomain's on the current stack, the ProtectionDomain's on the stack are iterated through, the first ProtectionDomain.implies(Permission) that returns false returns causes the AccessControlContext to return false.

This means that if your thread is executing with several CodeSource's it will have to check several ProtectionDomains.

Each ProtectionDomain will check the policy, if the ProtectionDomain was created with the dynamic policy domain constructor:

public ProtectionDomain(CodeSource codesource,
               PermissionCollection permissions,
               ClassLoader classloader,
               Principal[] principals)

The ProtectionDomain first check's the Policy for the permission, then it checks it's own private PermissionCollection permissions passed in via the constructor, or that which has been merged with the permissions from the Policy.
Policy.getPermissions(ProtectionDomain)

In my RevokeablePolicy implementation, getPermissions doesn't return any dynamic Permission grant's, if it did, they could never be revoked as they would become merged with the ProtectionDomains private PermissionCollection.

So to sum up, you should get much better mileage if you try out my new ConcurrentDynamicPolicy implementation.

I know you've got a privately forked copy of River, but if you simply copy concurrent_policy_utils.jar and jsk-policy.jar from River's Hudson build, to your jre/lib/ext directory, you should be able to utilise it.

The ConcurrentDynanicPolicyProvider has passed all qa tests and jtreg tests, I'm just waiting for someone like yourself to report back concurrency improvements.

Cheers,

Peter.


Gregg Wonderly wrote:
The TaskManager class has a subclass of Thread that it uses to run tasks. The problem with subclassing Thread, is that there is a lock that is used in Thread to see if some methods are overridden so that security can be maintained. So, in an environment where Thread is used with a SecurityManager, it is better to use a Runnable to encapsulate the custom code, instead of a Thread.

The TaskThread class should be a Runnable instead of a Thread, and then there are just 3 other places where it is referenced that need some adjustment. The thread that is running inside of the runnable needs to be put into a per instance variable for one place where interrupt processing is handled.

Gregg Wonderly


Reply via email to