[GHC] #9684: Broken build on OS X (incompatible pthread_setname_np API)
GHC
ghc-devs at haskell.org
Sun Oct 12 22:01:47 UTC 2014
#9684: Broken build on OS X (incompatible pthread_setname_np API)
-------------------------------------+-------------------------------------
Reporter: mlen | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.9
Keywords: | Operating System: MacOS X
pthread_setname_np | Type of failure: Building
Architecture: Unknown/Multiple | GHC failed
Difficulty: Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Revisions:
| 674c631ea111233daa929ef63500d75ba0db8858
-------------------------------------+-------------------------------------
Build is broken on OS X because it is only possible to set thread name for
the current thread and `pthread_setname_np` accepts a single argument.
This function appeared in 10.6. If that OS version needs to be supported,
the best thing that can be done is conditional compilation. A short
summary of inconsistencies between different *nix systems can be found
here: http://stackoverflow.com/questions/2369738/can-i-set-the-name-of-a
-thread-in-pthreads-linux/7989973#7989973
The error log:
{{{
rts/posix/OSThreads.c:138:30:
error: too many arguments to function call, expected 1, have 2
pthread_setname_np(*pId, name);
~~~~~~~~~~~~~~~~~~ ^~~~
/usr/include/pthread.h:471:1:
note: 'pthread_setname_np' declared here
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2)
^
/usr/include/Availability.h:159:50:
note: expanded from macro '__OSX_AVAILABLE_STARTING'
#define __OSX_AVAILABLE_STARTING(_osx, _ios)
__AVAILABILITY_INTERNAL##_osx
^
<scratch space>:65:1: note: expanded from here
__AVAILABILITY_INTERNAL__MAC_10_6
^
/usr/include/AvailabilityInternal.h:3912:72:
note: expanded from macro '__AVAILABILITY_INTERNAL__MAC_10_6'
#define __AVAILABILITY_INTERNAL__MAC_10_6
__attribute__((availability(macosx,introduced=10.6)))
^
1 error generated.
}}}
I can see two possible solutions for OS X:
1. disable setting thread name by conditional compilation.
2. write some trampoline code to work around the fact that it is only
possible to set thread name for the current thread.
The latter would look like this:
{{{
struct wrapper {
char *name;
void *param;
void *(*cont)(void *);
};
void *trampoline(void *ctx) {
struct wrapper *params = (struct wrapper *)ctx;
void *param = params->param;
void *(*cont)(void *) = params->cont;
#ifdef MACOSX
pthread_setname_np(params->name);
#elif
pthread_setname_np(pthread_self(), params->name);
#endif
free(params);
return cont(param);
}
int
createOSThread (OSThreadId* pId, char *name,
OSThreadProc *startProc, void *param)
{
struct wrapper *ctx = malloc(sizeof(struct wrapper));
ctx->name = name;
ctx->cont = startProc;
ctx->param = param;
int result = pthread_create(pId, NULL, (void *(*)(void *))trampoline,
&ctx);
if (!result) {
pthread_detach(*pId);
} else {
free(ctx);
}
return result;
}
}}}
It looks very hackish and I think it'd be better to go with (1), since the
original change was made for debugging purposes.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9684>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list