X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/826366cbffbdff8141ac74dae93880b21d6b7d69..a14791b7288177a49b6e8b06677d59faac0a175e:/src/simix/simcalls.py diff --git a/src/simix/simcalls.py b/src/simix/simcalls.py index 78e2c94929..5d47f0fad4 100755 --- a/src/simix/simcalls.py +++ b/src/simix/simcalls.py @@ -25,7 +25,6 @@ class Arg: class Simcall: - simcalls_body = None simcalls_pre = None def __init__(self, name, handler, res, args, call_kind): @@ -36,21 +35,6 @@ class Simcall: self.call_kind = call_kind def check(self): - # libsmx.c simcall_BODY_ - if self.simcalls_body is None: - f = open('libsmx.cpp') - self.simcalls_body = set(re.findall(r'simcall_BODY_(.*?)\(', f.read())) - f.close() - if self.name not in self.simcalls_body: - print('# ERROR: No function calling simcall_BODY_%s' % self.name) - print('# Add something like this to libsmx.c:') - print('%s simcall_%s(%s)' % (self.res.rettype(), self.name, ', '. - join('%s %s' % (arg.rettype(), arg.name) for arg in self.args))) - print('{') - print(' return simcall_BODY_%s(%s);' % (self.name, "...")) - print('}') - return False - # smx_*.c void simcall_HANDLER_host_on(smx_simcall_t simcall, # smx_host_t h) if self.simcalls_pre is None: @@ -79,9 +63,6 @@ class Simcall: return False return True - def enum(self): - return ' %s,' % (self.name.upper()) - def string(self): return ' "Simcall::%s",' % self.name.upper() @@ -130,8 +111,7 @@ class Simcall: def case(self): res = [] indent = ' ' - args = ["simgrid::simix::unmarshal<%s>(simcall_.args_[%d])" % (arg.rettype(), i) - for i, arg in enumerate(self.args)] + args = ["simcall_.code_"] res.append(indent + 'case Simcall::%s:' % (self.name.upper())) if self.need_handler: call = "simcall_HANDLER_%s(&simcall_%s%s)" % (self.name, @@ -139,43 +119,16 @@ class Simcall: ', '.join(args)) else: call = "SIMIX_%s(%s)" % (self.name, ', '.join(args)) - if self.call_kind == 'Func': - res.append(indent + " simgrid::simix::marshal<%s>(simcall_.result_, %s);" % (self.res.rettype(), call)) - else: - res.append(indent + " " + call + ";") + res.append(indent + " " + call + ";") if self.call_kind != 'Blck': res.append(indent + ' simcall_answer();') res.append(indent + ' break;') res.append('') return '\n'.join(res) - def body(self): - res = [''] - res.append( - 'inline static %s simcall_BODY_%s(%s)' % (self.res.rettype(), - self.name, - ', '.join('%s %s' % (arg.rettype(), arg.name) for arg in self.args))) - res.append('{') - res.append(' if (false) /* Go to that function to follow the code flow through the simcall barrier */') - if self.need_handler: - res.append(' simcall_HANDLER_%s(%s);' % (self.name, - ', '.join(["&simgrid::kernel::actor::ActorImpl::self()->simcall_"] + [arg.name for arg in self.args]))) - else: - res.append(' SIMIX_%s(%s);' % (self.name, - ', '.join(arg.name for arg in self.args))) - res.append(' return simcall<%s%s>(Simcall::%s%s);' % ( - self.res.rettype(), - "".join([", " + arg.rettype() for i, arg in enumerate(self.args)]), - self.name.upper(), - "".join([", " + arg.name for i, arg in enumerate(self.args)]) - )) - res.append('}') - return '\n'.join(res) - def handler_prototype(self): if self.need_handler: - return "XBT_PRIVATE %s simcall_HANDLER_%s(smx_simcall_t simcall%s);" % (self.res.rettype() if self.call_kind == 'Func' else 'void', - self.name, + return "XBT_PRIVATE void simcall_HANDLER_%s(smx_simcall_t simcall%s);" % (self.name, ''.join(', %s %s' % (arg.rettype(), arg.name) for i, arg in enumerate(self.args))) return "" @@ -205,10 +158,9 @@ def parse(fn): t = t.strip() n = n.strip() sargs.append(Arg(n, t)) - if ret == "void": - ans = "Proc" - else: - ans = "Func" + if ret != "void": + raise Exception ("Func simcalls (ie, returning a value) not supported anymore") + ans = 'Proc' handler = True if attrs: attrs = attrs[2:-2] @@ -269,130 +221,6 @@ def main(): print("Some checks fail!") sys.exit(1) - # - # popping_accessors.hpp - # - fd = header('popping_accessors.hpp') - fd.write('#include "src/simix/popping_private.hpp"') - handle(fd, Simcall.accessors, simcalls, simcalls_dict) - fd.write( - "\n/* The prototype of all simcall handlers, automatically generated for you */\n\n") - handle(fd, Simcall.handler_prototype, simcalls, simcalls_dict) - fd.close() - - # - # popping_enum.hpp - # - fd = header("popping_enum.hpp") - fd.write('namespace simgrid {\n') - fd.write('namespace simix {\n') - fd.write('/**\n') - fd.write(' * @brief All possible simcalls.\n') - fd.write(' */\n') - fd.write('enum class Simcall {\n') - fd.write(' NONE,\n') - - handle(fd, Simcall.enum, simcalls, simcalls_dict) - - fd.write('};\n') - fd.write('\n') - fd.write('constexpr int NUM_SIMCALLS = ' + str(1 + len(simcalls)) + ';\n') - fd.write('} // namespace simix\n') - fd.write('} // namespace simgrid\n') - fd.close() - - # - # popping_generated.cpp - # - - fd = header("popping_generated.cpp") - - fd.write('#include \n') - fd.write('#include \n') - fd.write('#include \n') - fd.write('#if SIMGRID_HAVE_MC\n') - 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('#include "src/kernel/context/Context.hpp"\n') - - fd.write('\n') - fd.write('XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix);\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('constexpr std::array simcall_names{{\n') - - fd.write(' "Simcall::NONE",\n') - handle(fd, Simcall.string, simcalls, simcalls_dict) - - fd.write('}};\n\n') - - fd.write('/** @private\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 times_considered)\n') - fd.write('{\n') - fd.write(' XBT_DEBUG("Handling simcall %p: %s", &simcall_, SIMIX_simcall_name(simcall_));\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') - - handle(fd, Simcall.case, simcalls, simcalls_dict) - - fd.write(' case Simcall::NONE:\n') - fd.write(' throw std::invalid_argument(simgrid::xbt::string_printf("Asked to do the noop syscall on %s@%s",\n') - fd.write(' get_cname(),\n') - fd.write(' sg_host_get_name(get_host())));\n') - fd.write(' default:\n') - fd.write(' THROW_IMPOSSIBLE;\n') - fd.write(' }\n') - fd.write('}\n') - - fd.close() - - # - # popping_bodies.cpp - # - fd = header('popping_bodies.cpp') - fd.write('#include "src/kernel/EngineImpl.hpp"\n') - fd.write('#include "src/kernel/actor/ActorImpl.hpp"\n') - fd.write('#include "src/mc/mc_forward.hpp"\n') - fd.write('#include "xbt/ex.h"\n') - fd.write('#include \n') - fd.write('#include \n') - fd.write('#include \n') - - fd.write("/** @cond */ // Please Doxygen, don't look at this\n") - fd.write(''' -XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix); - -using simgrid::simix::Simcall; - -template -inline static R simcall(Simcall call, T const&... t) -{ - auto self = simgrid::kernel::actor::ActorImpl::self(); - simgrid::simix::marshal(&self->simcall_, call, t...); - if (not simgrid::kernel::EngineImpl::get_instance()->is_maestro(self)) { - XBT_DEBUG("Yield process '%s' on simcall %s", self->get_cname(), SIMIX_simcall_name(self->simcall_)); - self->yield(); - } else { - self->simcall_handle(0); - } - return simgrid::simix::unmarshal(self->simcall_.result_); -} -''') - handle(fd, Simcall.body, simcalls, simcalls_dict) - fd.write("/** @endcond */\n") - fd.close() if __name__ == '__main__': main()