diff --git a/src/acconfig.h b/src/acconfig.h
index 4be7110f6bafe1f7ff2f8a8468b0f05431fb3673..b8973355a7a2b13ef1d2502b38d48a4c0b470768 100644
--- a/src/acconfig.h
+++ b/src/acconfig.h
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: acconfig.h,v 1.109 2002/11/24 22:37:50 mast Exp $
+|| $Id: acconfig.h,v 1.110 2003/01/05 14:29:54 grubba Exp $
 */
 
 #ifndef MACHINE_H
@@ -397,6 +397,9 @@
 /* Define this if you have Windows NT threads */
 #undef NT_THREADS
 
+/* Define this if your THREAD_T type is a pointer type. */
+#undef PIKE_THREAD_T_IS_POINTER
+
 /* Define this if your pthreads have pthread_condattr_default */
 #undef HAVE_PTHREAD_CONDATTR_DEFAULT
 
diff --git a/src/configure.in b/src/configure.in
index 4aca2160a5f5312044daf6781af1facd4085cd74..39bd4b01bdd668f9ba520f28773fa8154922a1aa 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -1,4 +1,4 @@
-AC_REVISION("$Id: configure.in,v 1.671 2003/01/04 15:04:36 kiwi Exp $")
+AC_REVISION("$Id: configure.in,v 1.672 2003/01/05 14:29:54 grubba Exp $")
 AC_INIT(interpret.c)
 AC_CONFIG_HEADER(machine.h)
 
@@ -2556,6 +2556,8 @@ if test "x$pike_cv_sys_os" = "xWindows_NT" ; then
   AC_DEFINE(PIKE_THREADS)
   using_threads="yes (nt)"
 
+  pike_cv_thread_t_type=integer
+
 else
 
   # Test for POSIX threads
@@ -2918,6 +2920,23 @@ pthread_t gazonk;
       AC_DEFINE(HAVE_BROKEN_LINUX_THREAD_EUID)
     else :; fi
 
+    AC_MSG_CHECKING([behaviour of the pthread_t type])
+    AC_CACHE_VAL(pike_cv_thread_t_type, [
+      AC_TRY_COMPILE([
+#include <sys/types.h>
+#ifdef STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+#include <pthread.h>
+extern pthread_t bar;
+      ], [
+	void *foo = (void *)(ptrdiff_t)bar;
+	return 0;
+      ], [ pike_cv_thread_t_type=integer ], [ pike_cv_thread_t_type=pointer ])
+    ])
+    AC_MSG_RESULT($pike_cv_thread_t_type)
+
   else
     AC_MSG_RESULT(no)
     LIBS="$OLDLIBS"
@@ -2998,13 +3017,20 @@ int main()
       #   :
       # fi
     fi # UNIX threads
+
+    pike_cv_thread_t_type=integer
   fi # POSIX threads
 fi  # NT
 else
   # Without threads
+  pike_cv_thread_t_type=integer
   :
 fi
 
+if test "x$pike_cv_thread_t_type" = "xpointer"; then
+  AC_DEFINE(PIKE_THREAD_T_IS_POINTER)
+fi
+
 ########################################################################
 
 # NOTE: The following test is hardcoded to fail when crosscompiling
diff --git a/src/cyclic.h b/src/cyclic.h
index 166534db6871462c3a4cfd0d84364c9c433c3f10..58542b8f6a5266114b6beab00f61cb87b8ff429f 100644
--- a/src/cyclic.h
+++ b/src/cyclic.h
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: cyclic.h,v 1.8 2002/12/01 17:36:03 mast Exp $
+|| $Id: cyclic.h,v 1.9 2003/01/05 14:29:54 grubba Exp $
 */
 
 #ifndef CYCLIC_H
@@ -31,7 +31,7 @@ typedef struct CYCLIC
   CYCLIC cyclic_struct__
 #define BEGIN_CYCLIC(A,B) \
    begin_cyclic(&cyclic_struct__, cyclic_identifier__, \
-                (void *)(ptrdiff_t)th_self(), (void *)(A), (void *)(B))
+                THREAD_T_TO_PTR(th_self()), (void *)(A), (void *)(B))
 
 #else  /* CYCLIC_DEBUG */
 
@@ -40,7 +40,7 @@ typedef struct CYCLIC
   CYCLIC cyclic_struct__
 #define BEGIN_CYCLIC(A,B) \
    begin_cyclic(&cyclic_struct__, &cyclic_identifier__, \
-                (void *)(ptrdiff_t)th_self(), (void *)(A), (void *)(B))
+                THREAD_T_TO_PTR(th_self()), (void *)(A), (void *)(B))
 
 #endif	/* !CYCLIC_DEBUG */
 
diff --git a/src/pike_threadlib.h b/src/pike_threadlib.h
index 792da5baadab2ccfe552229db2436c899179887f..89e615d2f19b416c628a6b05a46b56ea437a0ded 100644
--- a/src/pike_threadlib.h
+++ b/src/pike_threadlib.h
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: pike_threadlib.h,v 1.23 2002/12/22 17:18:55 mast Exp $
+|| $Id: pike_threadlib.h,v 1.24 2003/01/05 14:29:54 grubba Exp $
 */
 
 #ifndef PIKE_THREADLIB_H
@@ -755,5 +755,12 @@ PMOD_EXPORT HANDLE CheckValidHandle(HANDLE h);
 #define STATIC_COND_INIT
 #endif
 
+#ifndef THREAD_T_TO_PTR
+#ifdef PIKE_THREAD_T_IS_POINTER
+#define THREAD_T_TO_PTR(X)	((void *)(X))
+#else /* !PIKE_THREAD_T_IS_POINTER */
+#define THREAD_T_TO_PTR(X)	((void *)(ptrdiff_t)(X))
+#endif /* PIKE_THREAD_T_IS_POINTER */
+#endif /* !THREAD_T_TO_PTR */
 
 #endif /* PIKE_THREADLIB_H */