typedef pthread_key_t xbt_os_thread_key_t;
#endif
-/* Calls pthread_atfork() if present, and else does nothing.
- * The only known user of this wrapper is mmalloc_preinit(); This function may disapear in the near future.
+/** 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 *addr = (void*)(((unsigned long)sbrk(0) + HEAP_OFFSET) & mask);
__mmalloc_default_mdp = xbt_mheap_new(-1, addr);
/* Fixme? only the default mdp in protected against forks */
- res = xbt_os_thread_atfork(mmalloc_fork_prepare, //FIXME: KILLME when things settle a bit
+ // This is mandated to protect the mmalloced areas through forks. Think of tesh.
+ // Nah, removing the mutex isn't a good idea either for tesh
+ res = xbt_os_thread_atfork(mmalloc_fork_prepare,
mmalloc_fork_parent, mmalloc_fork_child);
if (res != 0)
THROWF(system_error,0,"xbt_os_thread_atfork() failed: return value %d",res);
__xbt_ex_terminate = &__xbt_ex_terminate_default;
}
+/* 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))
{