A
lgorithmique
N
umérique
D
istribuée
Public GIT Repository
projects
/
simgrid.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge pull request #228 from Takishipp/actor-execute
[simgrid.git]
/
src
/
kernel
/
context
/
ContextUnix.cpp
diff --git
a/src/kernel/context/ContextUnix.cpp
b/src/kernel/context/ContextUnix.cpp
index
ec26e43
..
26d629d
100644
(file)
--- a/
src/kernel/context/ContextUnix.cpp
+++ b/
src/kernel/context/ContextUnix.cpp
@@
-10,7
+10,7
@@
#include "mc/mc.h"
#include "src/mc/mc_ignore.h"
#include "src/simix/ActorImpl.hpp"
#include "mc/mc.h"
#include "src/mc/mc_ignore.h"
#include "src/simix/ActorImpl.hpp"
-#include "src/simix/smx_private.h"
+#include "src/simix/smx_private.h
pp
"
#include "xbt/parmap.hpp"
/** Many integers are needed to store a pointer
#include "xbt/parmap.hpp"
/** Many integers are needed to store a pointer
@@
-81,6
+81,7
@@
public:
UContext(std::function<void()> code,
void_pfn_smxprocess_t cleanup_func, smx_actor_t process);
~UContext() override;
UContext(std::function<void()> code,
void_pfn_smxprocess_t cleanup_func, smx_actor_t process);
~UContext() override;
+ void stop() override;
};
class SerialUContext : public UContext {
};
class SerialUContext : public UContext {
@@
-89,7
+90,6
@@
public:
void_pfn_smxprocess_t cleanup_func, smx_actor_t process)
: UContext(std::move(code), cleanup_func, process)
{}
void_pfn_smxprocess_t cleanup_func, smx_actor_t process)
: UContext(std::move(code), cleanup_func, process)
{}
- void stop() override;
void suspend() override;
void resume();
};
void suspend() override;
void resume();
};
@@
-100,7
+100,6
@@
public:
void_pfn_smxprocess_t cleanup_func, smx_actor_t process)
: UContext(std::move(code), cleanup_func, process)
{}
void_pfn_smxprocess_t cleanup_func, smx_actor_t process)
: UContext(std::move(code), cleanup_func, process)
{}
- void stop() override;
void suspend() override;
void resume();
};
void suspend() override;
void resume();
};
@@
-131,7
+130,7
@@
UContextFactory::UContextFactory() : ContextFactory("UContextFactory")
#if HAVE_THREAD_CONTEXTS /* To use parallel ucontexts a thread pool is needed */
int nthreads = SIMIX_context_get_nthreads();
sysv_parmap = nullptr;
#if HAVE_THREAD_CONTEXTS /* To use parallel ucontexts a thread pool is needed */
int nthreads = SIMIX_context_get_nthreads();
sysv_parmap = nullptr;
- sysv_workers_context =
xbt_new(ParallelUContext*, nthreads)
;
+ sysv_workers_context =
new ParallelUContext*[nthreads]
;
sysv_maestro_context = nullptr;
xbt_os_thread_key_create(&sysv_worker_id_key);
#else
sysv_maestro_context = nullptr;
xbt_os_thread_key_create(&sysv_worker_id_key);
#else
@@
-146,7
+145,7
@@
UContextFactory::~UContextFactory()
{
#if HAVE_THREAD_CONTEXTS
delete sysv_parmap;
{
#if HAVE_THREAD_CONTEXTS
delete sysv_parmap;
-
xbt_free(sysv_workers_context)
;
+
delete[] sysv_workers_context
;
#endif
}
#endif
}
@@
-230,6
+229,11
@@
UContext::~UContext()
SIMIX_context_stack_delete(this->stack_);
}
SIMIX_context_stack_delete(this->stack_);
}
+void UContext::stop()
+{
+ Context::stop();
+ throw StopRequest();
+}
}}} // namespace simgrid::kernel::context
static void smx_ctx_sysv_wrapper(int first, ...)
}}} // namespace simgrid::kernel::context
static void smx_ctx_sysv_wrapper(int first, ...)
@@
-247,20
+251,19
@@
static void smx_ctx_sysv_wrapper(int first, ...)
}
memcpy(&context, ctx_addr, sizeof(simgrid::kernel::context::UContext*));
}
memcpy(&context, ctx_addr, sizeof(simgrid::kernel::context::UContext*));
- (*context)();
- context->stop();
+ try {
+ (*context)();
+ context->Context::stop();
+ } catch (simgrid::kernel::context::Context::StopRequest const&) {
+ XBT_DEBUG("Caught a StopRequest");
+ }
+ context->suspend();
}
namespace simgrid {
namespace kernel {
namespace context {
}
namespace simgrid {
namespace kernel {
namespace context {
-void SerialUContext::stop()
-{
- Context::stop();
- this->suspend();
-}
-
void SerialUContext::suspend()
{
/* determine the next context */
void SerialUContext::suspend()
{
/* determine the next context */
@@
-288,12
+291,6
@@
void SerialUContext::resume()
swapcontext(&static_cast<SerialUContext*>(sysv_maestro_context)->uc_, &this->uc_);
}
swapcontext(&static_cast<SerialUContext*>(sysv_maestro_context)->uc_, &this->uc_);
}
-void ParallelUContext::stop()
-{
- UContext::stop();
- this->suspend();
-}
-
/** Run one particular simulated process on the current thread. */
void ParallelUContext::resume()
{
/** Run one particular simulated process on the current thread. */
void ParallelUContext::resume()
{