return 0;
}
+/* Helper to convert pthread_t to PyThread_ident_t. POSIX allows pthread_t to be
+ non-arithmetic, e.g., musl typedefs it as a pointer. */
+static PyThread_ident_t
+_pthread_t_to_ident(pthread_t value) {
+// Cast through an integer type of the same size to avoid sign-extension.
+#if SIZEOF_PTHREAD_T == SIZEOF_VOID_P
+ return (uintptr_t) value;
+#elif SIZEOF_PTHREAD_T == SIZEOF_LONG
+ return (unsigned long) value;
+#elif SIZEOF_PTHREAD_T == SIZEOF_INT
+ return (unsigned int) value;
+#elif SIZEOF_PTHREAD_T == SIZEOF_LONG_LONG
+ return (unsigned long long) value;
+#else
+#error "Unsupported SIZEOF_PTHREAD_T value"
+#endif
+}
+
int
PyThread_start_joinable_thread(void (*func)(void *), void *arg,
PyThread_ident_t* ident, PyThread_handle_t* handle) {
if (do_start_joinable_thread(func, arg, &th)) {
return -1;
}
- *ident = (PyThread_ident_t) th;
+ *ident = _pthread_t_to_ident(th);
*handle = (PyThread_handle_t) th;
- assert(th == (pthread_t) *ident);
assert(th == (pthread_t) *handle);
return 0;
}
return PYTHREAD_INVALID_THREAD_ID;
}
pthread_detach(th);
-#if SIZEOF_PTHREAD_T <= SIZEOF_LONG
- return (unsigned long) th;
-#else
- return (unsigned long) *(unsigned long *) &th;
-#endif
+ return (unsigned long) _pthread_t_to_ident(th);;
}
int
if (!initialized)
PyThread_init_thread();
threadid = pthread_self();
- assert(threadid == (pthread_t) (PyThread_ident_t) threadid);
- return (PyThread_ident_t) threadid;
+ return _pthread_t_to_ident(threadid);
}
unsigned long