ceval.c: dict of local mapping is now a tuple
compile.c: lists and dictionary in code objects become tuples
import.c: bump MAGIC
thread*.[ch]: added thread_ident() function
version.c: added '++' to version number and bumped date
diff --git a/Python/thread_cthread.h b/Python/thread_cthread.h
index c56bf0d..bf9a024 100644
--- a/Python/thread_cthread.h
+++ b/Python/thread_cthread.h
@@ -48,6 +48,12 @@
 	return success < 0 ? 0 : 1;
 }
 
+long get_thread_ident _P0()
+{
+	if (!initialized)
+		init_thread();
+}
+
 static void do_exit_thread _P1(no_cleanup, int no_cleanup)
 {
 	dprintf(("exit_thread called\n"));
diff --git a/Python/thread_foobar.h b/Python/thread_foobar.h
index 492096a..4b767b1 100644
--- a/Python/thread_foobar.h
+++ b/Python/thread_foobar.h
@@ -43,6 +43,12 @@
 	return success < 0 ? 0 : 1;
 }
 
+long get_thread_ident _P0()
+{
+	if (!initialized)
+		init_thread();
+}
+
 static void do_exit_thread _P1(no_cleanup, int no_cleanup)
 {
 	dprintf(("exit_thread called\n"));
diff --git a/Python/thread_lwp.h b/Python/thread_lwp.h
index b28e602..ab59ccd 100644
--- a/Python/thread_lwp.h
+++ b/Python/thread_lwp.h
@@ -52,9 +52,7 @@
 int start_new_thread _P2(func, void (*func) _P((void *)), arg, void *arg)
 {
 	thread_t tid;
-	int success = 0;	/* init not needed when SOLARIS_THREADS and */
-				/* C_THREADS implemented properly */
-
+	int success;
 	dprintf(("start_new_thread called\n"));
 	if (!initialized)
 		init_thread();
@@ -62,6 +60,16 @@
 	return success < 0 ? 0 : 1;
 }
 
+long get_thread_ident _P0()
+{
+	thread_t tid;
+	if (!initialized)
+		init_thread();
+	if (lwp_self(&tid) < 0)
+		return -1;
+	return tid.thread_id;
+}
+
 static void do_exit_thread _P1(no_cleanup, int no_cleanup)
 {
 	dprintf(("exit_thread called\n"));
diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h
index 1d539ee..c5d7be4 100644
--- a/Python/thread_pthread.h
+++ b/Python/thread_pthread.h
@@ -83,9 +83,7 @@
 	static int local_initialized = 0;
 #endif /* SGI_THREADS and USE_DL */
 	pthread_t th;
-	int success = 0;	/* init not needed when SOLARIS_THREADS and */
-				/* C_THREADS implemented properly */
-
+	int success;
 	dprintf(("start_new_thread called\n"));
 	if (!initialized)
 		init_thread();
@@ -93,6 +91,13 @@
 	return success < 0 ? 0 : 1;
 }
 
+long get_thread_ident _P0()
+{
+	if (!initialized)
+		init_thread();
+	return (long) pthread_self();
+}
+
 static void do_exit_thread _P1(no_cleanup, int no_cleanup)
 {
 	dprintf(("exit_thread called\n"));
diff --git a/Python/thread_sgi.h b/Python/thread_sgi.h
index 6f6334e..40f28a0 100644
--- a/Python/thread_sgi.h
+++ b/Python/thread_sgi.h
@@ -229,6 +229,11 @@
 	return success < 0 ? 0 : 1;
 }
 
+long get_thread_ident _P0()
+{
+	return getpid();
+}
+
 static void do_exit_thread _P1(no_cleanup, int no_cleanup)
 {
 	dprintf(("exit_thread called\n"));
diff --git a/Python/thread_solaris.h b/Python/thread_solaris.h
index 08cf6dd..8bbbeb0 100644
--- a/Python/thread_solaris.h
+++ b/Python/thread_solaris.h
@@ -76,6 +76,13 @@
 	return success < 0 ? 0 : 1;
 }
 
+long get_thread_ident _P0()
+{
+	if (!initialized)
+		init_thread();
+	return thr_self();
+}
+
 static void do_exit_thread _P1(no_cleanup, int no_cleanup)
 {
 	dprintf(("exit_thread called\n"));