#ifndef _XBT_OS_THREAD_H
#define _XBT_OS_THREAD_H
-#include "simgrid_config.h" /* Windows or Posix */
-#include "xbt/function_types.h"
+#include "xbt/base.h"
SG_BEGIN_DECL()
+#include <pthread.h>
+typedef pthread_key_t xbt_os_thread_key_t;
+
/** @addtogroup XBT_thread
* @brief Thread portability layer
*
*
* @{
*/
- /** \brief Thread data type (opaque structure) */
-typedef struct xbt_os_thread_ *xbt_os_thread_t;
-
-#ifdef _XBT_WIN32 /* defined if this is a windows system, 32bits or 64bits) */
-#include <windows.h>
-#endif
-
-#include <pthread.h>
-typedef pthread_key_t xbt_os_thread_key_t;
-/** Calls pthread_atfork() if present, and raise an exception otherwise.
- *
- * The only known user of this wrapper is mmalloc_preinit(), but it is absolutely mandatory there:
- * when used with tesh, mmalloc *must* be mutex protected and resistant to forks.
- * This functionality is the only way to get it working (by ensuring that the mutex is consistently released on forks)
- */
-XBT_PUBLIC(int) xbt_os_thread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void));
XBT_PUBLIC(int) xbt_os_get_numcores(void);
+ /** \brief Thread data type (opaque structure) */
+typedef struct xbt_os_thread_ *xbt_os_thread_t;
XBT_PUBLIC(xbt_os_thread_t) xbt_os_thread_create(const char *name, pvoid_f_pvoid_t start_routine, void *param, void *data);
-
-/** Bind the thread to the given core, if possible.
- *
- * If pthread_setaffinity_np is not usable on that (non-gnu) platform, this function does nothing.
- */
-XBT_PUBLIC(int) xbt_os_thread_bind(xbt_os_thread_t thread, int core);
-
XBT_PUBLIC(void) xbt_os_thread_exit(int *retcode);
XBT_PUBLIC(void) xbt_os_thread_detach(xbt_os_thread_t thread);
+
XBT_PUBLIC(xbt_os_thread_t) xbt_os_thread_self(void);
XBT_PUBLIC(const char *) xbt_os_thread_self_name(void);
XBT_PUBLIC(const char *) xbt_os_thread_name(xbt_os_thread_t);
XBT_PUBLIC(void) xbt_os_thread_cancel(xbt_os_thread_t thread);
XBT_PUBLIC(void) xbt_os_thread_setstacksize(int stack_size);
XBT_PUBLIC(void) xbt_os_thread_setguardsize(int guard_size);
+XBT_PUBLIC(int) xbt_os_thread_bind(xbt_os_thread_t thread, int core);
+XBT_PUBLIC(int) xbt_os_thread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void));
/** \brief Thread mutex data type (opaque structure) */
typedef struct xbt_os_mutex_ *xbt_os_mutex_t;
-
XBT_PUBLIC(xbt_os_mutex_t) xbt_os_mutex_init(void);
XBT_PUBLIC(void) xbt_os_mutex_acquire(xbt_os_mutex_t mutex);
XBT_PUBLIC(void) xbt_os_mutex_release(xbt_os_mutex_t mutex);
/** \brief Thread condition data type (opaque structure) */
typedef struct xbt_os_cond_ *xbt_os_cond_t;
-
XBT_PUBLIC(xbt_os_cond_t) xbt_os_cond_init(void);
XBT_PUBLIC(void) xbt_os_cond_wait(xbt_os_cond_t cond, xbt_os_mutex_t mutex);
-XBT_PUBLIC(void) xbt_os_cond_timedwait(xbt_os_cond_t cond, xbt_os_mutex_t mutex, double delay);
XBT_PUBLIC(void) xbt_os_cond_signal(xbt_os_cond_t cond);
XBT_PUBLIC(void) xbt_os_cond_broadcast(xbt_os_cond_t cond);
XBT_PUBLIC(void) xbt_os_cond_destroy(xbt_os_cond_t cond);
/** \brief Semaphore data type (opaque structure) */
typedef struct xbt_os_sem_ *xbt_os_sem_t;
-
XBT_PUBLIC(xbt_os_sem_t) xbt_os_sem_init(unsigned int value);
XBT_PUBLIC(void) xbt_os_sem_acquire(xbt_os_sem_t sem);
XBT_PUBLIC(void) xbt_os_sem_release(xbt_os_sem_t sem);
__xbt_ex_terminate = &__xbt_ex_terminate_default;
}
+/** Calls pthread_atfork() if present, and raise an exception otherwise.
+ *
+ * The only known user of this wrapper is mmalloc_preinit(), but it is absolutely mandatory there:
+ * when used with tesh, mmalloc *must* be mutex protected and resistant to forks.
+ * This functionality is the only way to get it working (by ensuring that the mutex is consistently released on forks)
+ */
+
/* this function is critical to tesh+mmalloc, don't mess with it */
int xbt_os_thread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void))
{
return res_thread;
}
+/** Bind the thread to the given core, if possible.
+ *
+ * If pthread_setaffinity_np is not usable on that (non-gnu) platform, this function does nothing.
+ */
int xbt_os_thread_bind(xbt_os_thread_t thread, int cpu){
int errcode = 0;
#ifdef HAVE_PTHREAD_SETAFFINITY
xbt_assert(errcode==0, "pthread_cond_wait(%p,%p) failed: %s", cond, mutex, strerror(errcode));
}
-
-void xbt_os_cond_timedwait(xbt_os_cond_t cond, xbt_os_mutex_t mutex, double delay)
-{
- int errcode;
- struct timespec ts_end;
- double end = delay + xbt_os_time();
-
- if (delay < 0) {
- xbt_os_cond_wait(cond, mutex);
- } else {
- ts_end.tv_sec = (time_t) floor(end);
- ts_end.tv_nsec = (long) ((end - ts_end.tv_sec) * 1000000000);
- XBT_DEBUG("pthread_cond_timedwait(%p,%p,%p)", &(cond->c), &(mutex->m), &ts_end);
- switch ((errcode = pthread_cond_timedwait(&(cond->c), &(mutex->m), &ts_end))) {
- case 0:
- return;
- case ETIMEDOUT:
- THROWF(timeout_error, errcode,
- "condition %p (mutex %p) wasn't signaled before timeout (%f)",
- cond, mutex, delay);
- default:
- THROWF(system_error, errcode, "pthread_cond_timedwait(%p,%p,%f) failed: %s", cond, mutex, delay, strerror(errcode));
- }
- }
-}
-
void xbt_os_cond_signal(xbt_os_cond_t cond)
{
int errcode = pthread_cond_signal(&(cond->c));