[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