openjdk / panama-foreign Public
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
8275054: Racy updates when releasing confined scopes #596
8275054: Racy updates when releasing confined scopes #596
Conversation
Another solution would have been to trigger an exception when setting up a dependency from a shared scope to a confined scope - but we still need the same logic for implicitly closeable scopes anyway. |
|
Webrevs
|
@mcimadamore This change now passes all automated pre-integration checks. After integration, the commit message for the final commit will be:
You can use pull request commands such as /summary, /contributor and /issue to adjust it as needed. At the time when this comment was updated there had been 1 new commit pushed to the
Please see this link for an up-to-date comparison between the source branch of this pull request and the
|
/integrate |
@mcimadamore Pushed as commit b0cf974. |
As the subject says, there are cases where a close dependency on a confined parent scope can occur from an unrelated thread:
the confined scope is acquired by another confined scope featuring implicit cleanup - in which case the cleaner thread will do the release
the confined scope is acquired, in the same thread, by a shared scope. Since a shared scope can be closed by any other thread, it follows that release can also be done by any thread.
In such cases we can have races (either between release/release or between acquire/release) and the
lockCount
variable of the updated scope becomes garbage.The solution is to add an extra variable
asyncReleaseCount
. If a release request occur from the same thread that owns the confined scope, we proceed as usual, otherwise we atomically increment theasyncReleaseCount
. When the confined scope is later closed, iflockCount == 0
, nothing needs to be done, so we can just close. Otherwise, we need to check thatlockCount - asyncReleaseCount == 0
. This works because a confined segment can only be acquired by the same thread owning it. So, iflockCount == 0
there can be no other pending release.Progress
Issue
Reviewers
Reviewing
Using
git
Checkout this PR locally:
$ git fetch https://git.openjdk.java.net/panama-foreign pull/596/head:pull/596
$ git checkout pull/596
Update a local copy of the PR:
$ git checkout pull/596
$ git pull https://git.openjdk.java.net/panama-foreign pull/596/head
Using Skara CLI tools
Checkout this PR locally:
$ git pr checkout 596
View PR using the GUI difftool:
$ git pr show -t 596
Using diff file
Download this PR as a diff file:
https://git.openjdk.java.net/panama-foreign/pull/596.diff