int xbt_os_thread_atfork(void (*prepare)(void),
void (*parent)(void), void (*child)(void))
{
+#ifdef WIN32
+ THROW_UNIMPLEMENTED; //pthread_atfork is not implemented in pthread.h on windows
+#else
return pthread_atfork(prepare, parent, child);
+#endif
}
static void *wrapper_start_routine(void *s)
THROWF(system_error, errcode,
"pthread_setspecific failed for xbt_self_thread_key");
- void *res = (*(t->start_routine)) (t->param);
+ void *res = t->start_routine(t->param);
if (t->detached)
xbt_os_thread_free_thread_data(t);
return res;
#endif
/* the default size of the stack of the threads (in bytes)*/
-#define XBT_DEFAULT_THREAD_STACK_SIZE 4096
+#define XBT_DEFAULT_THREAD_STACK_SIZE 4096
/* key to the TLS containing the xbt_os_thread_t structure */
static unsigned long xbt_self_thread_key;
CloseHandle(thread->handle);
- if (thread->name)
- free(thread->name);
+ free(thread->name);
free(thread);
}
#endif
+
+/** @brief Returns the amount of cores on the current host */
+int xbt_os_get_numcores(void) {
+#ifdef WIN32
+ SYSTEM_INFO sysinfo;
+ GetSystemInfo(&sysinfo);
+ return sysinfo.dwNumberOfProcessors;
+#elif MACOS
+ int nm[2];
+ size_t len = 4;
+ uint32_t count;
+
+ nm[0] = CTL_HW; nm[1] = HW_AVAILCPU;
+ sysctl(nm, 2, &count, &len, NULL, 0);
+
+ if(count < 1) {
+ nm[1] = HW_NCPU;
+ sysctl(nm, 2, &count, &len, NULL, 0);
+ if(count < 1) { count = 1; }
+ }
+ return count;
+#else
+ return sysconf(_SC_NPROCESSORS_ONLN);
+#endif
+}
+
+
/***** reentrant mutexes *****/
typedef struct xbt_os_rmutex_ {
xbt_os_mutex_t mutex;