mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-11 20:03:28 +00:00
Initial support for .par grades with MinGW64.
The pthreads-win32 has worked with 64-bit compilers since version 2.9. This diff adds the initial support for the .par grades with MinGW64 and pthreads-win32. configure.ac: Set C compiler and linker flags for x86_64-w64-mingw32. (This is provisional; on my system the library appears to have a different name, but I'm not sure how normal this is.) runtime/mercury_thread.h: Adjust the definition of the MR_SELF_THREAD_ID macro so that the integer it expands to is at least as big as a pointer. (Needed for pthreads-win32 since thread ids are pointer values, not integers with that.) runtime/mercury_thread.c: Avoid warnings in some debugging code.
This commit is contained in:
10
configure.ac
10
configure.ac
@@ -2977,10 +2977,6 @@ case "$host" in
|
||||
esac
|
||||
;;
|
||||
|
||||
# NOTE: do *not* attempt to use pthreads if we are cross compiling
|
||||
# with the x86_64-w64-mingw32 GCC.
|
||||
# XXX we we will need to do something different here when we support
|
||||
# threads on 64-bit Windows.
|
||||
i*86-pc-mingw*)
|
||||
THREAD_LIBS=""
|
||||
case "$mercury_cv_cc_type" in
|
||||
@@ -2999,6 +2995,12 @@ case "$host" in
|
||||
esac
|
||||
;;
|
||||
|
||||
x86_64*w64*mingw32)
|
||||
THREAD_LIBS=""
|
||||
CFLAGS_FOR_THREADS="$WIN32_GC_THREADLIB"
|
||||
THREAD_LIBS="-lpthread"
|
||||
;;
|
||||
|
||||
*apple*darwin*)
|
||||
CFLAGS_FOR_THREADS="-DGC_DARWIN_THREADS"
|
||||
THREAD_LIBS=""
|
||||
|
||||
@@ -264,11 +264,13 @@ MR_mutex_lock(MercuryLock *lock, const char *from)
|
||||
{
|
||||
int err;
|
||||
|
||||
fprintf(stderr, "%ld locking on %p (%s)\n",
|
||||
fprintf(stderr,
|
||||
"%" MR_INTEGER_LENGTH_MODIFIER "d locking on %p (%s)\n",
|
||||
MR_SELF_THREAD_ID, lock, from);
|
||||
fflush(stderr);
|
||||
err = pthread_mutex_lock(lock);
|
||||
fprintf(stderr, "%ld lock returned %d\n",
|
||||
fprintf(stderr,
|
||||
"%" MR_INTEGER_LENGTH_MODIFIER "d lock returned %d\n",
|
||||
MR_SELF_THREAD_ID, err);
|
||||
fflush(stderr);
|
||||
assert(err == 0);
|
||||
@@ -280,11 +282,13 @@ MR_mutex_unlock(MercuryLock *lock, const char *from)
|
||||
{
|
||||
int err;
|
||||
|
||||
fprintf(stderr, "%ld unlocking on %p (%s)\n",
|
||||
fprintf(stderr,
|
||||
"%" MR_INTEGER_LENGTH_MODIFIER "d unlocking on %p (%s)\n",
|
||||
MR_SELF_THREAD_ID, lock, from);
|
||||
fflush(stderr);
|
||||
err = pthread_mutex_unlock(lock);
|
||||
fprintf(stderr, "%ld unlock returned %d\n",
|
||||
fprintf(stderr,
|
||||
"%" MR_INTEGER_LENGTH_MODIFIER "d unlock returned %d\n",
|
||||
MR_SELF_THREAD_ID, err);
|
||||
fflush(stderr);
|
||||
assert(err == 0);
|
||||
@@ -296,11 +300,13 @@ MR_cond_signal(MercuryCond *cond, const char *from)
|
||||
{
|
||||
int err;
|
||||
|
||||
fprintf(stderr, "%ld signaling %p (%s)\n",
|
||||
fprintf(stderr,
|
||||
"%" MR_INTEGER_LENGTH_MODIFIER "d signaling %p (%s)\n",
|
||||
MR_SELF_THREAD_ID, cond, from);
|
||||
fflush(stderr);
|
||||
err = pthread_cond_signal(cond);
|
||||
fprintf(stderr, "%ld signal returned %d\n",
|
||||
fprintf(stderr,
|
||||
"%" MR_INTEGER_LENGTH_MODIFIER "d signal returned %d\n",
|
||||
MR_SELF_THREAD_ID, err);
|
||||
fflush(stderr);
|
||||
assert(err == 0);
|
||||
@@ -312,11 +318,13 @@ MR_cond_broadcast(MercuryCond *cond, const char *from)
|
||||
{
|
||||
int err;
|
||||
|
||||
fprintf(stderr, "%ld broadcasting %p (%s)\n",
|
||||
fprintf(stderr,
|
||||
"%" MR_INTEGER_LENGTH_MODIFIER "d broadcasting %p (%s)\n",
|
||||
MR_SELF_THREAD_ID, cond, from);
|
||||
fflush(stderr);
|
||||
err = pthread_cond_broadcast(cond);
|
||||
fprintf(stderr, "%ld broadcast returned %d\n",
|
||||
fprintf(stderr,
|
||||
"%" MR_INTEGER_LENGTH_MODIFIER "d broadcast returned %d\n",
|
||||
MR_SELF_THREAD_ID, err);
|
||||
fflush(stderr);
|
||||
assert(err == 0);
|
||||
@@ -328,11 +336,13 @@ MR_cond_wait(MercuryCond *cond, MercuryLock *lock, const char *from)
|
||||
{
|
||||
int err;
|
||||
|
||||
fprintf(stderr, "%ld waiting on cond: %p lock: %p (%s)\n",
|
||||
fprintf(stderr,
|
||||
"%" MR_INTEGER_LENGTH_MODIFIER "d waiting on cond: %p lock: %p (%s)\n",
|
||||
MR_SELF_THREAD_ID, cond, lock, from);
|
||||
fflush(stderr);
|
||||
err = pthread_cond_wait(cond, lock);
|
||||
fprintf(stderr, "%ld wait returned %d\n",
|
||||
fprintf(stderr,
|
||||
"%" MR_INTEGER_LENGTH_MODIFIER "d wait returned %d\n",
|
||||
MR_SELF_THREAD_ID, err);
|
||||
fflush(stderr);
|
||||
assert(err == 0);
|
||||
@@ -345,11 +355,13 @@ MR_cond_timed_wait(MercuryCond *cond, MercuryLock *lock,
|
||||
{
|
||||
int err;
|
||||
|
||||
fprintf(stderr, "%ld timed-waiting on cond: %p lock: %p (%s)\n",
|
||||
fprintf(stderr,
|
||||
"%" MR_INTEGER_LENGTH_MODIFIER "d timed-waiting on cond: %p lock: %p (%s)\n",
|
||||
MR_SELF_THREAD_ID, cond, lock, from);
|
||||
fflush(stderr);
|
||||
err = pthread_cond_timedwait(cond, lock, abstime);
|
||||
fprintf(stderr, "%ld timed-wait returned %d\n",
|
||||
fprintf(stderr,
|
||||
"%" MR_INTEGER_LENGTH_MODIFIER "d timed-wait returned %d\n",
|
||||
MR_SELF_THREAD_ID, err);
|
||||
fflush(stderr);
|
||||
return err;
|
||||
@@ -360,11 +372,13 @@ MR_sem_wait(MercurySem *sem, const char *from)
|
||||
{
|
||||
int err;
|
||||
|
||||
fprintf(stderr, "%ld waiting on sem: %p (%s)\n",
|
||||
fprintf(stderr,
|
||||
"%" MR_INTEGER_LENGTH_MODIFIER "d waiting on sem: %p (%s)\n",
|
||||
MR_SELF_THREAD_ID, sem, from);
|
||||
fflush(stderr);
|
||||
err = sem_wait(sem);
|
||||
fprintf(stderr, "%ld wait returned %d\n",
|
||||
fprintf(stderr,
|
||||
"%" MR_INTEGER_LENGTH_MODIFIER "d wait returned %d\n",
|
||||
MR_SELF_THREAD_ID, err);
|
||||
fflush(stderr);
|
||||
|
||||
@@ -376,11 +390,13 @@ MR_sem_post(MercurySem *sem, const char *from)
|
||||
{
|
||||
int err;
|
||||
|
||||
fprintf(stderr, "%ld posting to sem: %p (%s)\n",
|
||||
fprintf(stderr,
|
||||
"%" MR_INTEGER_LENGTH_MODIFIER "d posting to sem: %p (%s)\n",
|
||||
MR_SELF_THREAD_ID, sem, from);
|
||||
fflush(stderr);
|
||||
err = sem_post(sem);
|
||||
fprintf(stderr, "%ld post returned %d\n",
|
||||
fprintf(stderr,
|
||||
"%" MR_INTEGER_LENGTH_MODIFIER "d post returned %d\n",
|
||||
MR_SELF_THREAD_ID, err);
|
||||
fflush(stderr);
|
||||
|
||||
|
||||
@@ -63,9 +63,9 @@ MR_null_thread(void);
|
||||
#define MR_thread_equal(a, b) pthread_equal((a), (b))
|
||||
|
||||
#if defined(MR_PTHREADS_WIN32)
|
||||
#define MR_SELF_THREAD_ID ((long) pthread_self().p)
|
||||
#define MR_SELF_THREAD_ID ((MR_Integer) pthread_self().p)
|
||||
#else
|
||||
#define MR_SELF_THREAD_ID ((long) pthread_self())
|
||||
#define MR_SELF_THREAD_ID ((MR_Integer) pthread_self())
|
||||
#endif
|
||||
|
||||
extern MR_bool MR_debug_threads;
|
||||
|
||||
Reference in New Issue
Block a user