2010-08-14 Ivan Maidanski <ivmai@mail.ru>
+
+ * dyn_load.c (GC_register_dynlib_callback): Adjust "start" pointer
+ for 64-bit targets.
+ * pthread_support.c (start_mark_threads): Expand PTHREAD_CREATE
+ macro.
+ * pthread_support.c (start_mark_threads): Call INIT_REAL_SYMS()
+ since REAL(pthread_create) is used.
+ * pthread_support.c (PTHREAD_CREATE): Remove unused.
+
+2010-08-14 Ivan Maidanski <ivmai@mail.ru>
+
* extra/threadlibs.c (main): Remove --wrap for "read" (since not
wrapped anymore).
* doc/README.linux (GC_USE_LD_WRAP): Ditto.
break;
# ifdef PT_GNU_RELRO
if (n_load_segs >= MAX_LOAD_SEGS) ABORT("Too many PT_LOAD segs");
+# if CPP_WORDSZ == 64
+ /* start pointer value may require aligning */
+ start = (ptr_t)((word)start & ~(sizeof(word) - 1));
+# endif
load_segs[n_load_segs].start = start;
load_segs[n_load_segs].end = end;
load_segs[n_load_segs].start2 = 0;
STATIC pthread_t GC_mark_threads[MAX_MARKERS];
-#define PTHREAD_CREATE REAL_FUNC(pthread_create)
-
static void start_mark_threads(void)
{
unsigned i;
pthread_attr_t attr;
+ GC_ASSERT(I_DONT_HOLD_LOCK());
+ INIT_REAL_SYMS(); /* for pthread_create */
+
if (0 != pthread_attr_init(&attr)) ABORT("pthread_attr_init failed");
if (0 != pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED))
}
# endif /* HPUX || GC_DGUX386_THREADS */
for (i = 0; i < GC_markers - 1; ++i) {
- if (0 != PTHREAD_CREATE(GC_mark_threads + i, &attr,
+ if (0 != REAL_FUNC(pthread_create)(GC_mark_threads + i, &attr,
GC_mark_thread, (void *)(word)i)) {
WARN("Marker thread creation failed, errno = %" GC_PRIdPTR "\n",
errno);