/* SimGrid's pthread interposer. Actual implementation of the symbols (see the comment in sthread.h) */
+#include "simgrid/s4u/Barrier.hpp"
#include "smpi/smpi.h"
+#include "xbt/asserts.h"
#include "xbt/ex.h"
+#include "xbt/log.h"
#include "xbt/string.hpp"
#include <simgrid/actor.h>
#include <simgrid/s4u/Actor.hpp>
}
/* Do not intercept valgrind step 1 */
- if (not strcmp(argv[0], "/usr/bin/valgrind.bin") || not strcmp(argv[0], "/bin/sh")) {
+ if (not strcmp(argv[0], "/usr/bin/valgrind.bin") || not strcmp(argv[0], "/bin/sh")|| not strcmp(argv[0], "/bin/bash")|| not strcmp(argv[0], "gdb")) {
printf("sthread refuses to intercept the execution of %s. Running the application unmodified.\n", argv[0]);
fflush(stdout);
return raw_main(argc, argv, envp);
}
int sthread_mutexattr_settype(sthread_mutexattr_t* attr, int type)
{
- // reset
- attr->recursive = 0;
- attr->errorcheck = 0;
-
switch (type) {
case PTHREAD_MUTEX_NORMAL:
+ xbt_assert(not attr->recursive, "S4U does not allow to remove the recursivness of a mutex.");
attr->recursive = 0;
break;
case PTHREAD_MUTEX_RECURSIVE:
attr->recursive = 1;
+ attr->errorcheck = 0; // reset
break;
case PTHREAD_MUTEX_ERRORCHECK:
attr->errorcheck = 1;
int sthread_mutex_init(sthread_mutex_t* mutex, const sthread_mutexattr_t* attr)
{
- auto m = sg4::Mutex::create();
+ auto m = sg4::Mutex::create(attr != nullptr && attr->recursive);
intrusive_ptr_add_ref(m.get());
mutex->mutex = m.get();
if (mutex->mutex == nullptr)
sthread_mutex_init(mutex, nullptr);
- XBT_DEBUG("%s(%p)", __FUNCTION__, mutex);
+ XBT_DEBUG("%s(%p)", __func__, mutex);
static_cast<sg4::Mutex*>(mutex->mutex)->lock();
return 0;
}
if (mutex->mutex == nullptr)
sthread_mutex_init(mutex, nullptr);
- XBT_DEBUG("%s(%p)", __FUNCTION__, mutex);
+ XBT_DEBUG("%s(%p)", __func__, mutex);
if (static_cast<sg4::Mutex*>(mutex->mutex)->try_lock())
return 0;
return EBUSY;
if (mutex->mutex == nullptr)
sthread_mutex_init(mutex, nullptr);
- XBT_DEBUG("%s(%p)", __FUNCTION__, mutex);
+ XBT_DEBUG("%s(%p)", __func__, mutex);
static_cast<sg4::Mutex*>(mutex->mutex)->unlock();
return 0;
}
if (mutex->mutex == nullptr)
sthread_mutex_init(mutex, nullptr);
- XBT_DEBUG("%s(%p)", __FUNCTION__, mutex);
+ XBT_DEBUG("%s(%p)", __func__, mutex);
intrusive_ptr_release(static_cast<sg4::Mutex*>(mutex->mutex));
return 0;
}
+
+int sthread_barrier_init(sthread_barrier_t* barrier, const sthread_barrierattr_t* attr, unsigned count){
+ auto b = sg4::Barrier::create(count);
+ intrusive_ptr_add_ref(b.get());
+
+ barrier->barrier = b.get();
+ return 0;
+}
+int sthread_barrier_wait(sthread_barrier_t* barrier){
+ XBT_DEBUG("%s(%p)", __func__, barrier);
+ static_cast<sg4::Barrier*>(barrier->barrier)->wait();
+ return 0;
+}
+int sthread_barrier_destroy(sthread_barrier_t* barrier){
+ XBT_DEBUG("%s(%p)", __func__, barrier);
+ intrusive_ptr_release(static_cast<sg4::Barrier*>(barrier->barrier));
+ return 0;
+}
+
int sthread_sem_init(sthread_sem_t* sem, int /*pshared*/, unsigned int value)
{
auto s = sg4::Semaphore::create(value);
return 0;
}
-void sthread_sleep(double seconds)
+unsigned int sthread_sleep(double seconds)
{
+ XBT_DEBUG("sleep(%lf)", seconds);
simgrid::s4u::this_actor::sleep_for(seconds);
+ return 0;
+}
+int sthread_usleep(double seconds)
+{
+ XBT_DEBUG("sleep(%lf)", seconds);
+ simgrid::s4u::this_actor::sleep_for(seconds);
+ return 0;
}
#if 0