RFR (XXS): 7006810: G1: Introduce peace-of-mind checking in the Suspendible Thread Set

Jesper Wilhelmsson jesper.wilhelmsson at oracle.com
Tue Apr 14 19:12:29 UTC 2015

Now you got a review from Kim as well, but yes Ramki is JDK 9 Reviewer and Per 
is JDK 9 Committer so with their reviews you were good to go.

Joseph Provino skrev den 14/4/15 16:56:
> Is review complete?  Can I use Ramki and Per as reviewers?
> thanks.
> joe
> On 4/10/2015 11:04 AM, Joseph Provino wrote:
>> Per, your analysis seems to be right on the money.
>> After initializing the variable and putting in asserts in join/leave
>> and removing the asserts (which did indeed get hit) in synchronize/desynchronize
>> it passes jprt.
>> Here's the latest webrev for review:
>> http://cr.openjdk.java.net/~jprovino/7006810/webrev.03
>> Thanks for all the reviews.
>> joe
>> On 4/9/2015 4:00 PM, Srinivas Ramakrishna wrote:
>>> On Thu, Apr 9, 2015 at 2:00 AM, Per Liden <per.liden at oracle.com
>>> <mailto:per.liden at oracle.com>> wrote:
>>>     Hi Joe/Ramki,
>>>     On 2015-04-09 09:58, Srinivas Ramakrishna wrote:
>>>         Hi Joe --
>>>         On Wed, Apr 8, 2015 at 4:27 PM, Joseph Provino
>>>         <joseph.provino at oracle.com <mailto:joseph.provino at oracle.com>
>>>         <mailto:joseph.provino at oracle.com
>>>         <mailto:joseph.provino at oracle.com>>> wrote:
>>>         ...
>>>             On 4/6/2015 2:20 PM, Srinivas Ramakrishna wrote:
>>>             ...
>>>                 Do we allow threads to recursively enter the suspendible thread
>>>                 set in nested fashion? I'm guessing we don't, in which case,
>>>             you would
>>>                 use this information local to the thread to prevent/forbid such
>>>                 recursive entries or exits when it isn't part of the set, by
>>>             asserting
>>>                 that the bit isn't set when a thread joins the set and never
>>>             clear
>>>                 before a thread leaves the set. I understand that there's a
>>>             scoped
>>>                 join/leave abstraction via SuspendibleThreadSetJoiner, but there
>>>                 also seem to be a bunch of naked join/leave calls, so the
>>>                 extra checking would likely be worthwhile.
>>>             This is a good question.  If I put in checks in join / leave
>>>             void SuspendibleThreadSet::join() {
>>>          assert(Thread::current()->is_suspendible_thread() == false,
>>>                  "Thread already joined");
>>>             void SuspendibleThreadSet::leave() {
>>>          //assert(Thread::current()->is_suspendible_thread(),
>>>                //  "Thread not joined");
>>>             jprt hits the assert in join.
>>>             It doesn't seem right to call join if a thread is already joined.
>>>             Would it be correct to just return if trying to rejoin or trying to
>>>             leave when not joined?
>>>         That would imply (along with the use of the scoped join/leave
>>>         abstraction) that nested joins/leaves are allowed.
>>>         I'd suggest then, that a thread keep track of the number of times it
>>>         joined and left by using a full-fledged
>>>         counter instead of a boolean bit.
>>>         Then your asserts would check that it wasn't trying to leave when its
>>>         count was 0.
>>>     Even if the STS allows nested joins (or rather, today it doesn't check
>>>     for it), to the best of my knowledge we don't have any such threads. Joe,
>>>     I suggest that you look at the threads using STS (not that many) to
>>>     confirm that this is the case. I don't think we should allow it, and
>>>     therefor I think the thread state should be kept as a bool rather than a
>>>     counter. As I mentioned in my other reply, there's a bug here. Since
>>>     _suspendible_thread is never properly initialized it might look like we
>>>     have already joined, when in fact we have just forgot to initialize it. I
>>>     suspect that's the reason why it might look like we have nested joins.
>>> Ah, OK. Hopefully Joe's testing after fixing the initialization confirmed
>>> that that was what was triggering the assert. I agree that it makes sense to
>>> keep it simple and disallow nested joins, if possible. (Haven't looked at the
>>> exit protocol carefully, but I will, as well as looking at the newer webrev.)
>>> -- ramki

More information about the hotspot-gc-dev mailing list