mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-12 05:48:51 -04:00
Fix bugs in posix thread-id calculation when sizeof(pthread_t) != sizeof(long)
When pthread_t was smaller, our calculated thread IDs would include uninitialized RAM, and so our unit tests would fail because thread_ids would never match one another. When pthread_t was larger and alignment was big-endian, our calculated thread IDs would only have the most significant bytes of the pthread_t, when in practice all the entropy is in the low-order bytes. Found with help from Dagobert Michelsen.
This commit is contained in:
parent
ac1931ac3d
commit
fbaf0770a7
@ -529,6 +529,10 @@ if test x$bwin32 != xtrue && test "$enable_thread_support" != "no"; then
|
|||||||
[Define if we have pthreads on this system])
|
[Define if we have pthreads on this system])
|
||||||
have_pthreads=yes])
|
have_pthreads=yes])
|
||||||
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||||
|
AC_CHECK_SIZEOF(pthread_t, ,
|
||||||
|
[AC_INCLUDES_DEFAULT()
|
||||||
|
#include <pthread.h> ]
|
||||||
|
)
|
||||||
fi
|
fi
|
||||||
AM_CONDITIONAL(PTHREADS, [test "$have_pthreads" != "no" && test "$enable_thread_support" != "no"])
|
AM_CONDITIONAL(PTHREADS, [test "$have_pthreads" != "no" && test "$enable_thread_support" != "no"])
|
||||||
|
|
||||||
|
@ -33,6 +33,7 @@ struct event_base;
|
|||||||
#include <event2/thread.h>
|
#include <event2/thread.h>
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
#include "mm-internal.h"
|
#include "mm-internal.h"
|
||||||
#include "evthread-internal.h"
|
#include "evthread-internal.h"
|
||||||
|
|
||||||
@ -84,10 +85,17 @@ evthread_posix_get_id(void)
|
|||||||
{
|
{
|
||||||
union {
|
union {
|
||||||
pthread_t thr;
|
pthread_t thr;
|
||||||
|
#if _EVENT_SIZEOF_PTHREAD_T > _EVENT_SIZEOF_LONG
|
||||||
|
ev_uint64_t id;
|
||||||
|
#else
|
||||||
unsigned long id;
|
unsigned long id;
|
||||||
|
#endif
|
||||||
} r;
|
} r;
|
||||||
|
#if _EVENT_SIZEOF_PTHREAD_T < _EVENT_SIZEOF_LONG
|
||||||
|
memset(&r, 0, sizeof(r));
|
||||||
|
#endif
|
||||||
r.thr = pthread_self();
|
r.thr = pthread_self();
|
||||||
return r.id;
|
return (unsigned long)r.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
|
Loading…
x
Reference in New Issue
Block a user