#include <isc/uv.h>
#include "os_p.h"
+#include "thread_p.h"
static unsigned int isc__os_ncpus = 0;
static unsigned long isc__os_cacheline = ISC_OS_CACHELINE_SIZE;
isc__os_cacheline = s;
}
#endif
+
+ pthread_attr_init(&isc__thread_attr);
+
+ size_t stacksize = isc_thread_getstacksize();
+ if (stacksize != 0 && stacksize < THREAD_MINSTACKSIZE) {
+ isc_thread_setstacksize(THREAD_MINSTACKSIZE);
+ }
}
void
isc__os_shutdown(void) {
- /* empty, but defined for completeness */;
+ pthread_attr_destroy(&isc__thread_attr);
}
#include "thread_p.h"
-#ifndef THREAD_MINSTACKSIZE
-#define THREAD_MINSTACKSIZE (1024U * 1024)
-#endif /* ifndef THREAD_MINSTACKSIZE */
-
static struct call_rcu_data *isc__thread_call_rcu_data = NULL;
+pthread_attr_t isc__thread_attr;
+
/*
* We can't use isc_mem API here, because it's called too early and the
* memory debugging flags can be changed later causing mismatch between flags
void
isc_thread_create(isc_threadfunc_t func, void *arg, isc_thread_t *thread) {
- int ret;
- pthread_attr_t attr;
-
- pthread_attr_init(&attr);
-
-#if defined(HAVE_PTHREAD_ATTR_GETSTACKSIZE) && \
- defined(HAVE_PTHREAD_ATTR_SETSTACKSIZE)
- size_t stacksize;
- ret = pthread_attr_getstacksize(&attr, &stacksize);
- PTHREADS_RUNTIME_CHECK(pthread_attr_getstacksize, ret);
-
- if (stacksize < THREAD_MINSTACKSIZE) {
- ret = pthread_attr_setstacksize(&attr, THREAD_MINSTACKSIZE);
- PTHREADS_RUNTIME_CHECK(pthread_attr_setstacksize, ret);
- }
-#endif /* if defined(HAVE_PTHREAD_ATTR_GETSTACKSIZE) && \
- * defined(HAVE_PTHREAD_ATTR_SETSTACKSIZE) */
-
- ret = pthread_create(thread, &attr, thread_run, thread_wrap(func, arg));
+ int ret = pthread_create(thread, &isc__thread_attr, thread_run,
+ thread_wrap(func, arg));
PTHREADS_RUNTIME_CHECK(pthread_create, ret);
-
- pthread_attr_destroy(&attr);
}
void
#endif /* if defined(HAVE_SCHED_YIELD) */
}
+size_t
+isc_thread_getstacksize(void) {
+ size_t stacksize = 0;
+
+#if HAVE_PTHREAD_ATTR_GETSTACKSIZE
+ int ret = pthread_attr_getstacksize(&isc__thread_attr, &stacksize);
+ PTHREADS_RUNTIME_CHECK(pthread_attr_getstacksize, ret);
+#endif /* HAVE_PTHREAD_ATTR_GETSTACKSIZE */
+
+ return stacksize;
+}
+
+void
+isc_thread_setstacksize(size_t stacksize ISC_ATTR_UNUSED) {
+#if HAVE_PTHREAD_ATTR_SETSTACKSIZE
+ int ret = pthread_attr_setstacksize(&isc__thread_attr, stacksize);
+ PTHREADS_RUNTIME_CHECK(pthread_attr_setstacksize, ret);
+#endif /* HAVE_PTHREAD_ATTR_SETSTACKSIZE */
+}
+
void
isc__thread_initialize(void) {
isc__thread_call_rcu_data = create_call_rcu_data(0, -1);