Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
migrate wake_all_waiting_actors from simix::Global to kernel::EngineImpl
[simgrid.git] / src / simix / simcalls.py
index 457de47..2ed634d 100755 (executable)
@@ -1,7 +1,7 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 
-# Copyright (c) 2014-2020. The SimGrid Team. All rights reserved.
+# Copyright (c) 2014-2021. The SimGrid Team. All rights reserved.
 
 # 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.
@@ -229,30 +229,19 @@ def parse(fn):
 
 def header(name):
     fd = open(name, 'w')
-    fd.write(
-        '/**********************************************************************/\n')
-    fd.write(
-        '/* File generated by src/simix/simcalls.py from src/simix/simcalls.in */\n')
-    fd.write(
-        '/*                                                                    */\n')
-    fd.write(
-        '/*                    DO NOT EVER CHANGE THIS FILE                    */\n')
-    fd.write(
-        '/*                                                                    */\n')
-    fd.write(
-        '/* change simcalls specification in src/simix/simcalls.in             */\n')
-    fd.write(
-        '/* Copyright (c) 2014-2020. The SimGrid Team. All rights reserved.    */\n')
-    fd.write(
-        '/**********************************************************************/\n\n')
+    fd.write('/**********************************************************************/\n')
+    fd.write('/* File generated by src/simix/simcalls.py from src/simix/simcalls.in */\n')
+    fd.write('/*                                                                    */\n')
+    fd.write('/*                    DO NOT EVER CHANGE THIS FILE                    */\n')
+    fd.write('/*                                                                    */\n')
+    fd.write('/* change simcalls specification in src/simix/simcalls.in             */\n')
+    fd.write('/* Copyright (c) 2014-2021. The SimGrid Team. All rights reserved.    */\n')
+    fd.write('/**********************************************************************/\n\n')
     fd.write('/*\n')
-    fd.write(
-        ' * Note that the name comes from http://en.wikipedia.org/wiki/Popping\n')
-    fd.write(
-        ' * Indeed, the control flow is doing a strange dance in there.\n')
+    fd.write(' * Note that the name comes from http://en.wikipedia.org/wiki/Popping\n')
+    fd.write(' * Indeed, the control flow is doing a strange dance in there.\n')
     fd.write(' *\n')
-    fd.write(
-        ' * That\'s not about http://en.wikipedia.org/wiki/Poop, despite the odor :)\n')
+    fd.write(' * That\'s not about http://en.wikipedia.org/wiki/Poop, despite the odor :)\n')
     fd.write(' */\n\n')
     return fd
 
@@ -325,14 +314,14 @@ if __name__ == '__main__':
     fd.write('#include "src/mc/mc_forward.hpp"\n')
     fd.write('#endif\n')
     fd.write('#include "src/kernel/activity/ConditionVariableImpl.hpp"\n')
+    fd.write('#include "src/kernel/actor/SimcallObserver.hpp"\n')
 
     fd.write('\n')
     fd.write('XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_popping);\n\n')
 
     fd.write('using simgrid::simix::Simcall;')
     fd.write('\n')
-    fd.write(
-        '/** @brief Simcalls\' names (generated from src/simix/simcalls.in) */\n')
+    fd.write('/** @brief Simcalls\' names (generated from src/simix/simcalls.in) */\n')
     fd.write('constexpr std::array<const char*, simgrid::simix::NUM_SIMCALLS> simcall_names{{\n')
 
     fd.write('    "Simcall::NONE",\n')
@@ -341,18 +330,18 @@ if __name__ == '__main__':
     fd.write('}};\n\n')
 
     fd.write('/** @private\n')
-    fd.write(
-        ' * @brief (in kernel mode) unpack the simcall and activate the handler\n')
+    fd.write(' * @brief (in kernel mode) unpack the simcall and activate the handler\n')
     fd.write(' *\n')
     fd.write(' * This function is generated from src/simix/simcalls.in\n')
     fd.write(' */\n')
-    fd.write(
-        'void simgrid::kernel::actor::ActorImpl::simcall_handle(int value) {\n')
-    fd.write(
-        '  XBT_DEBUG("Handling simcall %p: %s", &simcall_, SIMIX_simcall_name(simcall_.call_));\n')
-    fd.write('  SIMCALL_SET_MC_VALUE(simcall_, value);\n')
-    fd.write(
-        '  if (context_->wannadie())\n')
+    fd.write('void simgrid::kernel::actor::ActorImpl::simcall_handle(int times_considered)\n')
+    fd.write('{\n')
+    fd.write('  XBT_DEBUG("Handling simcall %p: %s", &simcall_, SIMIX_simcall_name(simcall_));\n')
+    fd.write('  simcall_.mc_value_ = times_considered;\n')
+    fd.write('  if (simcall_.observer_ != nullptr)\n')
+    fd.write('    simcall_.observer_->prepare(times_considered);\n')
+
+    fd.write('  if (context_->wannadie())\n')
     fd.write('    return;\n')
     fd.write('  switch (simcall_.call_) {\n')
 
@@ -392,8 +381,7 @@ inline static R simcall(Simcall call, T const&... t)
   smx_actor_t self = SIMIX_process_self();
   simgrid::simix::marshal(&self->simcall_, call, t...);
   if (self != simix_global->maestro_) {
-    XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->get_cname(), SIMIX_simcall_name(self->simcall_.call_),
-              (int)self->simcall_.call_);
+    XBT_DEBUG("Yield process '%s' on simcall %s", self->get_cname(), SIMIX_simcall_name(self->simcall_));
     self->yield();
   } else {
     self->simcall_handle(0);