[Python-Dev] pthreads question: typedef ??? pthread_t and hacky return statements
Mark Favas
m.favas@per.dem.csiro.au
Thu, 17 Aug 2000 12:27:20 +0800
[Trent}
-------------- snipped from current thread_pthread.h ---------------
long
PyThread_get_thread_ident(void)
{
volatile pthread_t threadid;
if (!initialized)
PyThread_init_thread();
/* Jump through some hoops for Alpha OSF/1 */
threadid = pthread_self();
return (long) *(long *) &threadid;
}
-------------------------------------------------------------------
WHAT IS UP WITH THAT return STATEMENT?
return (long) *(long *) &threadid;
My *guess* is that this is an attempt to just cast 'threadid' (a
pthread_t)
to a long and go through hoops to avoid compiler warnings. I dont' know
what
else it could be. Is that what the "Alpha OSF/1" comment is about?
Anybody
have an Alpha OSF/1 hanging around. The problem is that when
sizeof(pthread_t) != sizeof(long) this line is just broken.
Could this be changed to
return threadid;
safely?
This is a DEC-threads thing... (and I'm not a DEC-threads savant).
Making the suggested change gives the compiler warning:
cc -O -Olimit 1500 -I./../Include -I.. -DHAVE_CONFIG_H -c thread.c -o
thread.o
cc: Warning: thread_pthread.h, line 182: In this statement, "threadid"
of type "
pointer to struct __pthread_t", is being converted to "long".
(cvtdiftypes)
return threadid;
---------------^
The threads test still passes with this change.
From the pthread.h file,
typedef struct __pthreadTeb_t {
__pthreadLongAddr_p _Pfield(reserved1); /* Reserved to
DECthreads */
__pthreadLongAddr_p _Pfield(reserved2); /* Reserved to
DECthreads */
unsigned short _Pfield(size); /* V1: Size of TEB */
unsigned char _Pfield(version); /* TEB version */
unsigned char _Pfield(reserved3); /* Reserved to
DECthreads */
unsigned char _Pfield(external); /* V1: PTHREAD_TEB_EFLG_
flgs */
unsigned char _Pfield(reserved4)[2]; /* RESERVED */
unsigned char _Pfield(creator); /* V1:
PTHREAD_TEB_CREATOR_* */
__pthreadLongUint_t _Pfield(sequence); /* V0: Thread sequence
*/
__pthreadLongUint_t _Pfield(reserved5)[2]; /* Reserved to
DECthreads */
__pthreadLongAddr_t _Pfield(per_kt_area); /* V0: Reserved */
__pthreadLongAddr_t _Pfield(stack_base); /* V0: Initial SP */
__pthreadLongAddr_t _Pfield(stack_reserve); /* V0: reserved stack */
__pthreadLongAddr_t _Pfield(stack_yellow); /* V0: yellow zone */
__pthreadLongAddr_t _Pfield(stack_guard); /* V0: guard (red) zone
*/
__pthreadLongUint_t _Pfield(stack_size); /* V0: total stack size
*/
__pthreadTsd_t _Pfield(tsd_values); /* V0: TSD array (void
*) */
unsigned long _Pfield(tsd_count); /* V0: TSD array size */
unsigned int _Pfield(reserved6); /* Reserved to
DECthreads */
unsigned int _Pfield(reserved7); /* Reserved to
DECthreads */
unsigned int _Pfield(thread_flags); /* Reserved to
DECthreads */
int _Pfield(thd_errno); /* V1: thread's errno */
__pthreadLongAddr_t _Pfield(stack_hiwater); /* V1: lowest known SP
*/
} pthreadTeb_t, *pthreadTeb_p;
# if defined (_PTHREAD_ALLOW_MIXED_PROTOS_) && defined
(__INITIAL_POINTER_SIZE)
typedef pthreadTeb_p pthread_t; /* Long pointer if possible */
# pragma __required_pointer_size __restore
# elif defined (_PTHREAD_ENV_ALPHA) && defined (_PTHREAD_ENV_VMS)
typedef unsigned __int64 pthread_t; /* Force 64 bits anyway
*/
# else
typedef pthreadTeb_p pthread_t; /* Pointers is pointers
*/
# endif
#endif
--
Mark