RFR(XS): 8215009: GCC 8 compilation eror in libjli
Dmitry Chuyko
dmitry.chuyko at bell-sw.com
Tue Feb 26 20:23:25 UTC 2019
I made mentioned cleanups in changed code, just in case here is a webrev
without functional changes: function renaming, comments, indents (just a
couple), void*.
http://cr.openjdk.java.net/~dchuyko/8215009/webrev.04/
Started dev-submit for that patch.
-Dmitry
On 2/25/19 9:37 PM, Roger Riggs wrote:
> +1
>
> Much cleaner, since it does not need to be more general.
>
> I'd probably add a comment to the ThreadJavaMain method
> to say why it is needed.
>
> BTW, it looks like the indents have gotten mixed up between 2 spaces
> and 4.
> For the libjli it should be 4 spaces.
> But this change is probably not the place to fix it and it is locally
> consistent.
>
> Thanks, Roger
>
> On 02/25/2019 01:16 PM, Mikael Vidstedt wrote:
>>
>>> On Feb 25, 2019, at 9:09 AM, Dmitry Chuyko
>>> <dmitry.chuyko at 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).
> I'm fine with the rename (no additional review necessary).
>
>>
>> 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.chuyko at 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
>>>>>>>>>>>>>>
>
More information about the core-libs-dev
mailing list