This thread seems to have "hopped away" to the concurrency-interest list in 
mid-Dec-2015. This posting is intended to capture a summary of reasoning and 
some of the discussion there so that we have it in the record in core-libs-dev. 
Mostly by including the contents of several posts in the continuations of the 
original thread.

See thread continuations here: 
http://cs.oswego.edu/pipermail/concurrency-interest/2015-December/thread.html#14576
 and here: 
http://cs.oswego.edu/pipermail/concurrency-interest/2015-December/thread.html#14580

Summary:

On the reasoning for moving from Thread.SpinLoopHint to Runtime.onSpinWait:

From Gil Tene, on Tue, Dec 1, 2015 at 3:45 PM
> …
> Thread.spinLoopHint() was my first choice as well. But I was swayed by strong 
> arguments against "hint" in the method name. Including the lack of "action" 
> and ambiguity about roles. We looked at various names that were either clear 
> and way too long or way too short or implementation specific (or narrowing), 
> like skip, pause, relax, etc.
> 
> Given the spec we agreed on, the name we were looking for was something that 
> would be equivalent to the obvious expectations from something named as 
> elaborately as:
> 
> maybeYouShouldTryToImproveThePerformanceOfTheSpinWaitLoopMakingThisCall(), 
> with the receiver being either the thread or the runtime.
> 
> The "maybe you should try" part is important because doing nothing is a valid 
> option, and accidentally failing to achieve the goal is probably ok, but 
> consistently working in the opposite direction of the goal would be 
> "surprising behavior". The "...making this call" part is important because of 
> ambiguities around roles and actions (the call is not expected to spin, or 
> wait, it's the caller that is doing those things).
> 
> Given the natural way we'd describe what the options are for the receiver in 
> plain language, it became clear that Runtime fit better: we naturally say 
> "the runtime may..." and "indicate to the runtime...", not "the thread may" 
> or "indicate to the thread...". In addition, some of the implementation 
> possibilities (e.g. switch this thread to spin on a dedicated core) may 
> involve actions that are natural runtime actions but far outside of the scope 
> of what Thread might do.
> 
> With an event delivery paradigm ("I'm in a spin wait loop, you may want to do 
> something about that") Runtime.onSpinWait() fits common naming conventions 
> and roles. It's also  readable enough to understand that the Runtime is being 
> told that a spin wait is going on. And in that sense, it is just as 
> expressive as spinLoopHint(), while actually following a naming convention. 
> We left the "try to improve the performance" to the spec/JavaDoc because it 
> was very hard to fit in the name.

From Martin Thompson, on Tue, Dec 1, 2015 at 9:13 AM:
> ...
> The "on" prefix was suggested as the caller is notifying the runtime that it 
> is in a spin-wait loop. This allows the runtime the option of reacting to the 
> event, or not, and allows flexibility in how it chooses to react to this 
> information. The method is not waiting; the method is notifying that the 
> caller is waiting.
> 
> Yes, but we don't have Runtime.onGC() or Runtime.onRunFinalization(), and 
> both of those are documented as "suggesting" the VM perform those actions.  
> spinLoopHint() sounded much better than what's proposed here, and carries the 
> suggestion/hint/optionality that's desired.  IMHO, onSpinWait() is the least 
> appealing options proposed thus far.
> 
> System.gc() and Runtime.runFinalizersOnExit(boolean) are clear instructions 
> to the system/runtime to do something in an imperative fashion. The 
> onSpinWait() is a declarative statement about the state of the current 
> thread. I can understand a dislike to a name. We all have personal taste on 
> this but I don't think you are comparing similar semantics.
> 
> Consider the runtime as an object. You send it a message via a method. What 
> exactly is spinLoopHint() telling the Runtime what to do? It is applying an 
> event but not expressing it via any convention. "spinLoopHint()" works for me 
> on a Thread to an extent. We should express intent or declare status for 
> this. Hints don't fit comfortably in a programming model.
> 
> The actual naming does not matter so much as this will only be used by 
> minority of programmers. I'll prepare to be flamed on that :-) However it is 
> desperately needed and anything that makes it slip the date to make Java 9 
> would be such a let down.



Some discussion about naming choices, aiming the API at the target user, and 
what we expect people might do across platforms:

From Gil Tene, on Tue, Dec 1, 2015 at 4:35 PM:
> …
> On Dec 1, 2015, at 8:02 AM, Vitaly Davidovich <vita...@gmail.com> wrote:
> 
>> See my earlier suggestion about keeping target user of this API in mind and 
>> the level of this API (i.e. low).
> 
> In this sense (limited target audience that is very technical) 
> Thread.foobar(), Thread.spinLoopHint(), Thread.relax(), and 
> Runtime.onSpinWait() are all equivalent.
> 
> The naming debate is mostly driven by longer term thinking, wanting to avoid 
> unforeseen consequences, and s wish for readability. Which are the things 
> that seem to drive most naming debates and make naming one of those hard 
> things to do in CS.
> 
> Given that it's already cost a month of elapsed time, I'd like to try to push 
> forward with what we ended up with.
> 
>> As for doing nothing in the implementation, OK.  But I bet if someone using 
>> this API finds out it does nothing on their platform they're going to stop 
>> using this API and go back to manual hacks that have at least some chance of 
>> achieving desired results.  So while I understand the general motivation of 
>> not leaking implementation details, I don't agree this API is the 
>> appropriate place for that.
> 
> The main driver for this JEP is the fact that in Java today, there are no 
> good manual hack options, and on platforms that do support 
> enhanced-performance spinning, spin wait loops written in Java remain 
> inferior (in performance and reaction time) to ones written in other 
> languages.
> 
> I expect spin-loop writers to naturally use Runtime.onSpinWait() across 
> platforms, accepting that it may do nothing on some (e.g. On platforms where 
> no HW support for better spinning performance exists) and improve spinning 
> performance on others. E.g. I fully expect the various disruptor waitFor() 
> variants will still exist, but half of them will probably end up using 
> Runtime.onSpinWait() for enhanced performance, and would do nothing different 
> (in their Java code) for x86, Aarch64, Aarch32, Power, SPARC, or MIPS.


And some discussions on the term "relax":

From Gil Tene, on Tue, Dec 1, 2015 at 4:19 PM:
> On Dec 1, 2015, at 7:32 AM, Vitaly Davidovich <vita...@gmail.com> wrote:
> 
>> On why "relax" (or other "this is how it will be achieved" naming options) 
>> are not a good fit IMO:
>> 
>> But relax, although a common term for this scenario, is still vague enough 
>> as to not indicate exactly how it does this, so I don't see any leakage of 
>> implementation details.  Moreover, the niche target users of this API are 
>> likely going to know exactly what they want at the machine instruction level 
>> on the platform(s) they care about.  This isn't some widely applicable 
>> general purpose API -- it's a low level API, and low level APIs should not 
>> be intentionally vague.  I'm almost certain that 99% of people using this 
>> API will know, either ahead of time or by researching, exactly what happens 
>> under the hood.  When trying to control things at this level, implementation 
>> details start to matter.
> 
> The goal of the call is not to relax the CPU. It is to improve the 
> performance of the spin loop.
> 
> This makes goal the opposite of what "relax" suggests. While the spec rules 
> (and clearly says that performance improvement is the goal), we'd probably 
> agree that names like "chill()", "slowDown()", or "dontBotherWithSpeed()" 
> would be a bad fit. "Relax" fits right in with those...
> 
> The fact that the performance-enhancing goal can actually be technically 
> achieved in some specific CPUs by relaxing their execution in specific ways 
> is surprising in itself. It makes for interesting conversation ("wow, who 
> knew that relaxing the aggressiveness of speculation might actually make the 
> reaction time faster?"), but the fact that it's interesting and surprising is 
> a good indication that it is a bad name choice.
> 
> There are various ways to relax CPUs that are wrong to use for the goal of 
> the call, but would be natural for something called "relax". These include 
> deeper cstates in x86, variations of MWAIT with short timeouts on various 
> CPUs, and even instructions named "pause" on some platforms that consistently 
> hurt performance but help save power. These make it clear that if we used 
> "relax" as a name in this spin wait loop performance context, we actually 
> mean "relaxInA2015x86PauseInstructionSense()"...

And what is probably a good summary of the whole back and forth on naming this 
thing:

From Gil Tene, on Tue, Dec 1, 2015 at 4:38 PM:
> On Dec 1, 2015, at 8:29 AM, Vitaly Davidovich <vita...@gmail.com> wrote:
> 
>> I suggested relax because it's a commonly used name for this effect.  With 
>> no prior art in this area, I'd agree that relax can be misinterpreted.  But 
>> I'm just as happy with your original spinLoopHint on the Thread class, to be 
>> honest.
> 
> I liked it too. But was willing to give up on it given the strong arguments 
> and opinions against it, and in the interest of getting something acceptable 
> done.
> 
>> I just don't like onSpinWait() on the Runtime class.
> 
> But can you live with it? Trust me, it grows on you... ;-). Especially when 
> you end up defending it in an e-mail thread.




> On Dec 7, 2015, at 9:34 AM, mark.reinh...@oracle.com wrote:
> 
> 2015/11/30 6:58 -0800, g...@azul.com:
>> Update: After some significant back-and-forth between Doug and I on
>> naming and JavaDoc'ing, and with Martin (Thompson) stepping in to
>> help, we have what we think is a good spec and name selection for this
>> thing. We're proposing to add a new static method to the Runtime
>> class:
>> 
>> class Runtime { /...
>>    /**
>>      * Method signifying that the caller is momentarily unable to
>>      * progress until the occurrence of one or more actions of one or
>>      * more other activities.  When invoked within each iteration, this
>>      * method typically improves performance of spin wait loop
>>      * constructions.
>>      */
>>     public static void onSpinWait() {};
>> }
> 
> I'm glad to see some agreement here, but I'm puzzled by the proposal
> to to place this in the Runtime class.  What's the reasoning for that?
> Wouldn't this more naturally be placed in java.lang.Thread?
> 
> Also, I don't think this single method needs a JEP, but you're welcome
> to do it that way if you really want to.
> 
> - Mark

Reply via email to