On Mon, 27 Aug 2001 14:50:39 -0400, you wrote:
unsigned long SSL_pthreads_thread_id(void) {
unsigned long ret;
ret=(unsigned long)pthread_self();
return(ret);
}
The return type of pthread_self(), pthread_t, is not necessary a type
castable to unsigned long, which makes this piece somewhat non-portable.
Unfortunately, the function signature requires it:
void CRYPTO_set_id_callback(unsigned long (*id_function)(void));
Yes, this is a pain. On those places where pthread_t is a scalar type,
it will work; on places where it's a struct, it will probably fail to
compile. You can work around that by doing
pthread_t me = pthread_self()
unsigned long ret;
memcpy(ret, me, sizeof ret)
return ret
But that's probably getting valid, but wrong and buggy :), code.
Very, very buggy ;-) - nobody says that first sizeof ret bytes of me
aren't anything but some flags that are pretty much the same for all
pthread_t values.
The attached code compiles, and should work portably. Something like it
should be used as a replacement for pthreads_thread_id that is currently
in crypto/threads/th-lock.c and for the code snippet above.
Another variant could be
unsigned long SSL_pthreads_thread_id(void)
{
/*** if (tid == 0) this check was a bad idea, for further
discussion of weak memory models and
aggressive optimization techniques you are
welcome to comp.programming.threads ***/
/*** anyway, pthread_once is not too good either - something
like a C++ constructor on a global static variable would be
much better ***/
pthread_once(tid_once, init_openssl_tid);
/* this is not 100% kosher, but still ... */
return (unsigned long) pthread_getspecific(tid_key);
}
This all is sort of anal retentive, but hey - that's what the craft is
all about :-)
/r$
Dima
__
OpenSSL Project http://www.openssl.org
User Support Mailing List[EMAIL PROTECTED]
Automated List Manager [EMAIL PROTECTED]