RFR(XXS): 8132232: Signature mismatch between declaration and definition of PosixSemaphore::timedwait
Volker Simonis
volker.simonis at gmail.com
Thu Jul 23 16:01:45 UTC 2015
On Thu, Jul 23, 2015 at 4:39 PM, Volker Simonis
<volker.simonis at gmail.com> wrote:
> Hi,
>
> can somebody please review and sponsor this tiny change to fix the build on
> Solaris/Sparc with SS12u3:
>
> http://cr.openjdk.java.net/~simonis/webrevs/2015/8132232
> https://bugs.openjdk.java.net/browse/JDK-8132232
>
> In semaphore_posix.hpp timedwait is declared as follows:
>
> class PosixSemaphore : public CHeapObj<mtInternal> {
> private:
> bool timedwait(struct timespec ts);
> }
>
> but in os_posix.cpp it is defined as follows:
>
> bool PosixSemaphore::timedwait(const struct timespec ts) {
>
> On Solaris 10/11 on Sparc with SS12u3 (Sun C++ 5.12 SunOS_sparc 2011/11/16)
> this gives an error in the release build:
>
> Undefined first referenced
> symbol in file
> bool PosixSemaphore::timedwait(timespec) os_solaris.o
>
> This is because the caller in os_solaris.o requires:
>
> /usr/ccs/bin/nm -C hotspot/solaris_sparcv9_compiler2/product/os_solaris.o |
> grep timedwait
> [456] | 0| 0|FUNC |GLOB |0 |UNDEF |bool PosixSemaphore::timedwait(timespec)
> [__1cOPosixSemaphoreJtimedwait6MnItimespec__b_]
>
> but the implementation in os_posix.o has:
>
> /usr/ccs/bin/nm -C hotspot/solaris_sparcv9_compiler2/product/os_posix.o |
> grep timedwait
> [61] | 6928| 124|FUNC |GLOB |0 |2 |bool PosixSemaphore::timedwait(const
> timespec)
> [__1cOPosixSemaphoreJtimedwait6MknItimespec__b_]
>
> Strange enough, the error doesn't seem to happen on Solaris/AMD64 (using the
> exactly same compiler version) and I absolutely can not see how this error
> is related to the CPU architecture!
>
So this is definitely a compiler bug. The compiler should treat
functions with "Parameter declarations that differ only in the
presence or absence of const and/or volatile as equivalent" (C++03
13.1-3, see for example
http://stackoverflow.com/questions/3681188/why-does-a-function-declaration-with-a-const-argument-allow-calling-of-a-function).
Nevertheless I think we should fix this because the fix is trivial and
I still think it is good style to use the same signature for both, the
definition and the declaration of a function, no matter whether the
compiler treats them as unique or not.
> I also can not understand why nobody has seen this before? Maybe you
> (Oracle) are using a newer compiler where this is fixed? But the "Supported
> Build Platforms" wiki page [1] still mentions 12.3.
>
> Fortunately, the fix is trivial - just remove the const qualifier from the
> method definition.
>
> Regards,
> Volker
>
> [1] https://wiki.openjdk.java.net/display/Build/Supported+Build+Platforms
More information about the hotspot-dev
mailing list