> On Feb 25, 2019, at 9:09 AM, Dmitry Chuyko <dmitry.chu...@bell-sw.com> wrote:
> 
> On 2/22/19 9:55 PM, Roger Riggs wrote:
>> Hi,
>> 
>> After a closer look, I'd take the route of the 01 webrev.
>> It is more localized and does not force the function signature needed
>> by pthread_create to be propagated elsewhere.
>> 
>> The code can be a lot more comprehensible by renaming the CallIntFunc
>> function to be specific to ContinueInNewThread0. It looks like a trampoline 
>> to me.
>> The data structure being passed is on the stack of the caller of 
>> pthread_create.
>> It seems safe to refer to it here because the caller will wait in 
>> pthread_join.
> 
> After some hesitation it looks like ContinueInNewThread0 may know about 
> JavaMain just like ContinueInNewThread, no need to work with abstract 
> continuation. Even that abstract continuation is limited to int return type. 
> In webrev.02 continuation gets platform specific signature. But then we have 
> to cast the result where the call is direct. Another approach in that 
> direction could be to add result field in JavaMainArgs, but it will again 
> force ContinueInNewThread0 to know about continuation's parameters structure 
> as there may be a direct call of continuation.
> 
> If we let ContinueInNewThread0 call only JavaMain, it all can work without 
> extra trampoline structures (just need a wrapper):
> 
> http://cr.openjdk.java.net/~dchuyko/8215009/webrev.03/ 
> <http://cr.openjdk.java.net/~dchuyko/8215009/webrev.03/>

I like it! Since ContinueInNewThread0 is now always calling JavaMain I guess it 
could be renamed to CallJavaMainInNewThread (or something to that same effect).

Minor nit: some consistency in where the ‘*’ is placed in the various “void *” 
places would be nice.

Cheers,
Mikael

> 
> -Dmitry
> 
>> 
>> Also important is to document that the return type is specific to the OS
>> and is needed to cast the return value expected by the start_pthread_create
>> start_routine.  That may still be in question because pthread_create
>> expects void*.
>> 
>> $.02, Roger
>> 
>> 
>> On 02/22/2019 10:32 AM, Roger Riggs wrote:
>>> Hi,
>>> 
>>> If the warning can be addressed with an extra in-line cast then that's
>>> cleaner and easier to understand than replicating that structure in 3 files.
>>> And of course, add a comment.
>>> To make the source more readable, the cast could be factored
>>> into a macro in the same file with the comment about why it is needed.
>>> 
>>> Roger
>>> 
>>> 
>>> On 02/21/2019 11:07 PM, David Holmes wrote:
>>>> On 22/02/2019 4:55 am, Mikael Vidstedt wrote:
>>>>> 
>>>>> The wrapper based solution looks much cleaner to me as well. webrev.01 
>>>>> looks good.
>>>> 
>>>> Sorry I really don't like it. The wrappers obfuscate and make complicated 
>>>> something that is not at all complicated. I have to re-read the new code 3 
>>>> times to figure out what it is even doing!
>>>> 
>>>> All that complexity to handle the fact one platform wants to return int 
>>>> instead of void* ??
>> The complexity is due to the function being called in some other thread
>> context and there is a necessary cast/type conversion on the return value
>> from the start_routine that has to come back through pthread to pthread_join.
>> 
>> 
>>>> 
>>>> David
>>>> -----
>>>> 
>>>>> (not a Reviewer)
>>>>> 
>>>>> Cheers,
>>>>> Mikael
>>>>> 
>>>>>> On Feb 21, 2019, at 9:55 AM, Dmitry Chuyko <dmitry.chu...@bell-sw.com> 
>>>>>> wrote:
>>>>>> 
>>>>>> To me thread function wrappers look preferable to platform specific 
>>>>>> JavaMain signature. Consider this webrev with wrappers:
>>>>>> 
>>>>>> http://cr.openjdk.java.net/~dchuyko/8215009/webrev.01/
>>>>>> 
>>>>>> In some cases JavaMain is called in the same thread and its result is 
>>>>>> returned from JLI_Launch. ContinueInNewThread is in shared code. And 
>>>>>> JavaMain uses macro controlled returns.
>>>>>> So when JavaMain returns THREAD_FUNC_RETURN changes may contain some 
>>>>>> quite artificial macro parts in java.c:
>>>>>> 
>>>>>> http://cr.openjdk.java.net/~dchuyko/8215009/webrev.02/
>>>>>> 
>>>>>> -Dmitry
>>>>>> 
>>>>>> On 12/19/18 9:27 AM, David Holmes wrote:
>>>>>>> On 19/12/2018 1:56 am, Dmitry Chuyko wrote:
>>>>>>>> On 12/18/18 3:39 AM, David Holmes wrote:
>>>>>>>>> On 11/12/2018 9:30 pm, Dmitry Chuyko wrote:
>>>>>>>>>> On 12/11/18 4:03 AM, David Holmes wrote:
>>>>>>>>>>> Hi Dmitry,
>>>>>>>>>>> 
>>>>>>>>>>> On 11/12/2018 12:16 am, Dmitry Chuyko wrote:
>>>>>>>>>>>> Hello,
>>>>>>>>>>>> 
>>>>>>>>>>>> Please review a small fix in java_md_solinux.c: continuation is 
>>>>>>>>>>>> not truly compatible with pthread_create start_routine's signature 
>>>>>>>>>>>> but we control what actually happens. So it makes sense to add 
>>>>>>>>>>>> intermediate void* cast to silence the error.
>>>>>>>>>>> 
>>>>>>>>>>> I'd be tempted to fix the signature and get rid of all the casts.
>>>>>>>>>> 
>>>>>>>>>> David, the signature is a signature of
>>>>>>>>>> 
>>>>>>>>>> int JNICALL JavaMain(void * _args)
>>>>>>>>>> 
>>>>>>>>>> It would be fun to change it. But still on Windows it is correctly 
>>>>>>>>>> passed to _beginthreadex() and then return code is extracted with 
>>>>>>>>>> GetExitCodeThread(). In case we want it to return void* the cast 
>>>>>>>>>> will move there.
>>>>>>>>> 
>>>>>>>>> I think the current double cast is truly ugly and an ifdef for 
>>>>>>>>> windows, or a cast for Windows only would be an improvement.
>>>>>>>> 
>>>>>>>> I agree. Maybe making a wrapper function is not so ugly. If there are 
>>>>>>>> no objections to changing beginning of the call stack it is quite easy 
>>>>>>>> to implement. For consistency it may be done for all 3 points (posix 
>>>>>>>> unix, posix mac, windows) or just for posix ones.
>>>>>>>> 
>>>>>>>> It looks like ifdef should be better as long as there are already 
>>>>>>>> OS-specific parts in libjli. Again, if there are no objections to have 
>>>>>>>> different JavaMain signatures on different platforms. In this case 
>>>>>>>> there won't be a signature cast for Windows.
>>>>>>> 
>>>>>>> How about setting
>>>>>>> 
>>>>>>> #define THREAD_FUNC_RETURN int
>>>>>>> 
>>>>>>> in windows/java_md.h.
>>>>>>> 
>>>>>>> Then:
>>>>>>> 
>>>>>>> #ifndef THREAD_FUNC_RETURN
>>>>>>>    #define THREAD_FUNC_RETURN void*
>>>>>>> #endif
>>>>>>> 
>>>>>>> in java.h (after the other includes).
>>>>>>> 
>>>>>>> Then:
>>>>>>> 
>>>>>>> THREAD_FUNC_RETURN JNICALL
>>>>>>> JavaMain(void * _args)
>>>>>>> 
>>>>>>> in java.c.
>>>>>>> 
>>>>>>> ?
>>>>>>> 
>>>>>>> Cheers,
>>>>>>> David
>>>>>>> 
>>>>>>> 
>>>>>>>> 
>>>>>>>> -Dmitry
>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> But I won't impose that on you just to silence gcc 8.
>>>>>>>>> 
>>>>>>>>> Cheers,
>>>>>>>>> David
>>>>>>>>> 
>>>>>>>>>> -Dmitry
>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> Cheers,
>>>>>>>>>>> David
>>>>>>>>>>> 
>>>>>>>>>>>> bug: https://bugs.openjdk.java.net/browse/JDK-8215009
>>>>>>>>>>>> webrev: http://cr.openjdk.java.net/~dchuyko/8215009/webrev.00/
>>>>>>>>>>>> testing: submit repo 
>>>>>>>>>>>> (mach5-one-dchuyko-JDK-8215009-20181207-1625-13615: PASSED)
>>>>>>>>>>>> 
>>>>>>>>>>>> -Dmitry
>>>>>>>>>>>> 
>>>>> 
>>> 
>> 

Reply via email to