projects
/
mono.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
2007-10-19 Marek Habersack <mhabersack@novell.com>
[mono.git]
/
libgc
/
pthread_support.c
diff --git
a/libgc/pthread_support.c
b/libgc/pthread_support.c
index ecb07ffd4e2d92f16c4fd62f936993c9f39fc6ee..6306f2cd0ceb244d445e0701e0d8ca2ef01bf71b 100644
(file)
--- a/
libgc/pthread_support.c
+++ b/
libgc/pthread_support.c
@@
-67,8
+67,8
@@
# endif
# if (defined(GC_DGUX386_THREADS) || defined(GC_OSF1_THREADS) || \
# endif
# if (defined(GC_DGUX386_THREADS) || defined(GC_OSF1_THREADS) || \
- defined(GC_DARWIN_THREADS) || defined(GC_AIX_THREADS)) \
- && !defined(USE_PTHREAD_SPECIFIC)
+ defined(GC_DARWIN_THREADS) || defined(GC_AIX_THREADS))
||
\
+
defined(GC_NETBSD_THREADS)
&& !defined(USE_PTHREAD_SPECIFIC)
# define USE_PTHREAD_SPECIFIC
# endif
# define USE_PTHREAD_SPECIFIC
# endif
@@
-126,6
+126,11
@@
# include <sys/sysctl.h>
#endif /* GC_DARWIN_THREADS */
# include <sys/sysctl.h>
#endif /* GC_DARWIN_THREADS */
+#if defined(GC_NETBSD_THREADS)
+# include <sys/param.h>
+# include <sys/sysctl.h>
+#endif
+
#if defined(GC_DGUX386_THREADS)
#if defined(GC_DGUX386_THREADS)
@@
-186,7
+191,14
@@
static
GC_key_t GC_thread_key;
#ifdef USE_COMPILER_TLS
GC_key_t GC_thread_key;
#ifdef USE_COMPILER_TLS
-static __thread MONO_TLS_FAST void* GC_thread_tls;
+/*
+ * gcc errors out with /tmp/ccdPMFuq.s:2994: Error: symbol `.LTLS4' is already defined
+ * if the static is removed on ppc.
+ */
+#if defined(__ppc__) || defined(__powerpc__)
+static
+#endif
+__thread MONO_TLS_FAST void* GC_thread_tls;
#endif
static GC_bool keys_initialized;
#endif
static GC_bool keys_initialized;
@@
-667,7
+679,8
@@
GC_thread GC_new_thread(pthread_t id)
result = &first_thread;
first_thread_used = TRUE;
} else {
result = &first_thread;
first_thread_used = TRUE;
} else {
- result = calloc (1, sizeof (struct GC_Thread_Rep));
+ result = (struct GC_Thread_Rep *)
+ GC_INTERNAL_MALLOC(sizeof(struct GC_Thread_Rep), NORMAL);
}
if (result == 0) return(0);
result -> id = id;
}
if (result == 0) return(0);
result -> id = id;
@@
-699,7
+712,12
@@
void GC_delete_thread(pthread_t id)
if (gc_thread_vtable && gc_thread_vtable->thread_exited)
gc_thread_vtable->thread_exited (id, &p->stop_info.stack_ptr);
#endif
if (gc_thread_vtable && gc_thread_vtable->thread_exited)
gc_thread_vtable->thread_exited (id, &p->stop_info.stack_ptr);
#endif
- free(p);
+
+#ifdef GC_DARWIN_THREADS
+ mach_port_deallocate(mach_task_self(), p->stop_info.mach_thread);
+#endif
+
+ GC_INTERNAL_FREE(p);
}
/* If a thread has been joined, but we have not yet */
}
/* If a thread has been joined, but we have not yet */
@@
-721,7
+739,12
@@
void GC_delete_gc_thread(pthread_t id, GC_thread gc_id)
} else {
prev -> next = p -> next;
}
} else {
prev -> next = p -> next;
}
- free(p);
+
+#ifdef GC_DARWIN_THREADS
+ mach_port_deallocate(mach_task_self(), p->stop_info.mach_thread);
+#endif
+
+ GC_INTERNAL_FREE(p);
}
/* Return a GC_thread corresponding to a given pthread_t. */
}
/* Return a GC_thread corresponding to a given pthread_t. */
@@
-774,11
+797,12
@@
void GC_remove_all_threads_but_me(void)
GC_destroy_thread_local(p);
}
# endif /* THREAD_LOCAL_ALLOC */
GC_destroy_thread_local(p);
}
# endif /* THREAD_LOCAL_ALLOC */
- if (p != &first_thread)
free
(p);
+ if (p != &first_thread)
GC_INTERNAL_FREE
(p);
}
}
GC_threads[hv] = me;
}
}
}
GC_threads[hv] = me;
}
+ GC_INTERNAL_FREE(p);
}
#endif /* HANDLE_FORK */
}
#endif /* HANDLE_FORK */
@@
-1001,7
+1025,7
@@
void GC_thr_init()
GC_nprocs = sysconf(_SC_NPROC_ONLN);
if (GC_nprocs <= 0) GC_nprocs = 1;
# endif
GC_nprocs = sysconf(_SC_NPROC_ONLN);
if (GC_nprocs <= 0) GC_nprocs = 1;
# endif
-# if defined(GC_DARWIN_THREADS) || defined(GC_FREEBSD_THREADS)
+# if defined(GC_DARWIN_THREADS) || defined(GC_FREEBSD_THREADS)
|| defined(GC_NETBSD_THREADS)
int ncpus = 1;
size_t len = sizeof(ncpus);
sysctl((int[2]) {CTL_HW, HW_NCPU}, 2, &ncpus, &len, NULL, 0);
int ncpus = 1;
size_t len = sizeof(ncpus);
sysctl((int[2]) {CTL_HW, HW_NCPU}, 2, &ncpus, &len, NULL, 0);
@@
-1371,7
+1395,8
@@
WRAP_FUNC(pthread_create)(pthread_t *new_thread,
/* responsibility. */
LOCK();
/* responsibility. */
LOCK();
- si = calloc (1, sizeof (struct start_info));
+ si = (struct start_info *)GC_INTERNAL_MALLOC(sizeof(struct start_info),
+ NORMAL);
UNLOCK();
if (!parallel_initialized) GC_init_parallel();
if (0 == si) return(ENOMEM);
UNLOCK();
if (!parallel_initialized) GC_init_parallel();
if (0 == si) return(ENOMEM);
@@
-1431,7
+1456,7
@@
WRAP_FUNC(pthread_create)(pthread_t *new_thread,
}
sem_destroy(&(si -> registered));
LOCK();
}
sem_destroy(&(si -> registered));
LOCK();
-
free
(si);
+
GC_INTERNAL_FREE
(si);
UNLOCK();
return(result);
UNLOCK();
return(result);