pthread_create(&thread1, NULL, thread1_fun, NULL);
fprintf(stderr, "here\n");
pthread_create(&thread2, NULL, thread2_fun, NULL);
- // pthread_join(thread1, NULL);
- // pthread_join(thread2, NULL);
+ fprintf(stderr, "there\n");
+ pthread_join(thread1, NULL);
+ pthread_join(thread2, NULL);
fprintf(stderr, "User main is done\n");
return 0;
#include "src/internal_config.h"
#include "src/kernel/EngineImpl.hpp"
#include "src/kernel/actor/ActorImpl.hpp"
+#include "src/sthread/sthread.h" // sthread_inside_simgrid
#include "xbt/parmap.hpp"
#include "src/kernel/context/ContextSwapped.hpp"
__sanitizer_finish_switch_fiber(nullptr, &context->asan_ctx_->asan_stack_, &context->asan_ctx_->asan_stack_size_);
#endif
try {
+ sthread_inside_simgrid = 0;
(*context)();
+ sthread_inside_simgrid = 1;
context->stop();
} catch (simgrid::ForcefulKillException const&) {
+ sthread_inside_simgrid = 1;
XBT_DEBUG("Caught a ForcefulKillException");
} catch (simgrid::Exception const& e) {
+ sthread_inside_simgrid = 1;
XBT_INFO("Actor killed by an uncaught exception %s", boost::core::demangle(typeid(e).name()).c_str());
throw;
}
#include <semaphore.h>
#include <stdio.h>
-int sthread_inside_simgrid = 1; // whether sthread should leave pthread operations, or intercept them.
-
/* We don't want to intercept pthread within simgrid. Instead we should provide the real implem to simgrid */
static int (*raw_pthread_create)(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*);
+static int (*raw_pthread_join)(pthread_t, void**);
static int (*raw_mutex_init)(pthread_mutex_t*, const pthread_mutexattr_t*) = NULL;
static int (*raw_mutex_lock)(pthread_mutex_t*) = NULL;
static int (*raw_mutex_trylock)(pthread_mutex_t*) = NULL;
static int (*raw_sem_post)(sem_t*) = NULL;
static void intercepter_init()
{
- raw_pthread_create =
- (int (*)(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*))dlsym(RTLD_NEXT, "pthread_create");
+ raw_pthread_create = (typeof(raw_pthread_create))dlsym(RTLD_NEXT, "pthread_create");
+ raw_pthread_join = (typeof(raw_pthread_join))dlsym(RTLD_NEXT, "pthread_join");
raw_mutex_init = (int (*)(pthread_mutex_t*, const pthread_mutexattr_t*))dlsym(RTLD_NEXT, "pthread_mutex_init");
raw_mutex_lock = (int (*)(pthread_mutex_t*))dlsym(RTLD_NEXT, "pthread_mutex_lock");
raw_mutex_trylock = (int (*)(pthread_mutex_t*))dlsym(RTLD_NEXT, "pthread_mutex_trylock");
sthread_inside_simgrid = 0;
return res;
}
+int pthread_join(pthread_t thread, void** retval)
+{
+ if (raw_pthread_join == NULL)
+ intercepter_init();
+
+ if (sthread_inside_simgrid)
+ return raw_pthread_join(thread, retval);
+
+ sthread_inside_simgrid = 1;
+ int res = sthread_join(thread, retval);
+ sthread_inside_simgrid = 0;
+ return res;
+}
int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* attr)
{
typedef unsigned long int sthread_t;
int sthread_create(sthread_t* thread, const /*pthread_attr_t*/ void* attr, void* (*start_routine)(void*), void* arg);
+int sthread_join(sthread_t thread, void** retval);
typedef struct {
void* mutex;
*thread = reinterpret_cast<unsigned long>(actor.get());
return 0;
}
+int sthread_join(sthread_t thread, void** retval)
+{
+ sg4::ActorPtr actor(reinterpret_cast<sg4::Actor*>(thread));
+ actor->join();
+ intrusive_ptr_release(actor.get());
+
+ return 0;
+}
int sthread_mutex_init(sthread_mutex_t* mutex, const /*pthread_mutexattr_t*/ void* attr)
{
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-#include "src/sthread/sthread.h" // sthread_inside_simgrid
#include "src/xbt/log_private.hpp"
#include "xbt/string.hpp"
#include "xbt/sysdep.h"
std::vector<std::string> cmdline; /* all we got in argv */
} // namespace simgrid::xbt
+int sthread_inside_simgrid = 1; // whether sthread should leave pthread operations or intercept them.
+
int xbt_initialized = 0;
simgrid::config::Flag<bool> cfg_dbg_clean_atexit{
"debug/clean-atexit",