Archived
This forum has been archived. Please start a new discussion on GitHub.
FreeBSD compilation problem: pthread_t is not unsigned long
Hi,
I've got almost all of ICE compiled under FreeBSD-CURRENT.
I've encountered one problem though:
gmake[2]: Entering directory `/usr/home/rodrigc/ice/Ice-1.0.0/src/IceSSL'
c++ -c -I.. -I../../include -I/usr/local/include -g -ftemplate-depth-128 -fPI
C -Wall OpenSSLPluginI.cpp
OpenSSLPluginI.cpp: In function `long unsigned int IceSSL::idFunction()':
OpenSSLPluginI.cpp:151: invalid conversion from `pthread*' to `long unsigned
int'
gmake[2]: *** [OpenSSLPluginI.o] Error 1
The problem is caused by this code in OpenSSLPluginI.cpp:
unsigned long IceSSL::idFunction()
{
unsigned long threadID = 0;
#ifdef WINDOWS
threadID = GetCurrentThreadId();
#elif _POSIX_THREADS
threadID = pthread_self();
#else
#error You must define a method to return the current thread ID.
#endif
return threadID;
}
This code is taking advantage of a Linux-ism, where threads are actually
processes, and a pthread_t == pid_t. Unfortunately, pthread_t should
be treated as an opaque type, and should not be assumed to be an
an unsigned long. On FreeBSD, pthread_t is a typedef for
a pointer to struct pthread. struct pthread is a FreeBSD specific data structure.
My short term compilation fix is to do:
threadID = (unsigned long)pthread_self();
But this seems wrong....ie. this amounts to casting a pointer to a long,
which makes me shudder.
What is the intent of this code?
Thanks.
I've got almost all of ICE compiled under FreeBSD-CURRENT.
I've encountered one problem though:
gmake[2]: Entering directory `/usr/home/rodrigc/ice/Ice-1.0.0/src/IceSSL'
c++ -c -I.. -I../../include -I/usr/local/include -g -ftemplate-depth-128 -fPI
C -Wall OpenSSLPluginI.cpp
OpenSSLPluginI.cpp: In function `long unsigned int IceSSL::idFunction()':
OpenSSLPluginI.cpp:151: invalid conversion from `pthread*' to `long unsigned
int'
gmake[2]: *** [OpenSSLPluginI.o] Error 1
The problem is caused by this code in OpenSSLPluginI.cpp:
unsigned long IceSSL::idFunction()
{
unsigned long threadID = 0;
#ifdef WINDOWS
threadID = GetCurrentThreadId();
#elif _POSIX_THREADS
threadID = pthread_self();
#else
#error You must define a method to return the current thread ID.
#endif
return threadID;
}
This code is taking advantage of a Linux-ism, where threads are actually
processes, and a pthread_t == pid_t. Unfortunately, pthread_t should
be treated as an opaque type, and should not be assumed to be an
an unsigned long. On FreeBSD, pthread_t is a typedef for
a pointer to struct pthread. struct pthread is a FreeBSD specific data structure.
My short term compilation fix is to do:
threadID = (unsigned long)pthread_self();
But this seems wrong....ie. this amounts to casting a pointer to a long,
which makes me shudder.
What is the intent of this code?
Thanks.
0
Comments
-
Re: FreeBSD compilation problem: pthread_t is not unsigned longOriginally posted by rodrigc
Hi,
The problem is caused by this code in OpenSSLPluginI.cpp:
unsigned long IceSSL::idFunction()
{
unsigned long threadID = 0;
#ifdef WINDOWS
threadID = GetCurrentThreadId();
#elif _POSIX_THREADS
threadID = pthread_self();
#else
#error You must define a method to return the current thread ID.
#endif
return threadID;
}
This code is taking advantage of a Linux-ism,
It is not a Linux-ism, the actual type of a thread id is implementation-dependent. So the above happens to work on Linux and Solaris but you have found that it doesn't work on openBSD. I know that the assumption also fails on HPUX.
Regards,
Andrew M.0 -
Unfortunately, there is not much we can do about this. OpenSSL assumes that a thread id can be mapped to an unsigned long:
void CRYPTO_set_id_callback(unsigned long (*id_function)(void));
See: http://www.openssl.org/docs/crypto/threads.html0