import re
import glob
+import sys
class Arg(object):
def rettype(self):
return self.type
+
class Simcall(object):
simcalls_body = None
simcalls_pre = None
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)))
+ join('%s %s' % (arg.rettype(), arg.name) for arg in self.args)))
print ('{')
print (' return simcall_BODY_%s(%s);' % (self.name, "..."))
print ('}')
# smx_host_t h)
if self.simcalls_pre is None:
self.simcalls_pre = set()
- for fn in glob.glob('smx_*') + glob.glob('ActorImpl*') + glob.glob('../mc/*cpp') + glob.glob('../kernel/activity/*cpp'):
+ for fn in glob.glob('smx_*') + glob.glob('../kernel/actor/ActorImpl*') + \
+ glob.glob('../mc/*cpp') + glob.glob('../kernel/activity/*cpp'):
f = open(fn)
self.simcalls_pre |= set(re.findall(r'simcall_HANDLER_(.*?)\(', f.read()))
f.close()
print ('# ERROR: No function called simcall_HANDLER_%s' % self.name)
print ('# Add something like this to the relevant C file (like smx_io.c if it\'s an IO call):')
print ('%s simcall_HANDLER_%s(smx_simcall_t simcall%s)' % (self.res.rettype(), self.name, ''.
- join(', %s %s' % (arg.rettype(), arg.name)for arg in self.args)))
+ join(', %s %s' % (arg.rettype(), arg.name)for arg in self.args)))
print ('{')
print (' // Your code handling the simcall')
print ('}')
return False
else:
if self.name in self.simcalls_pre:
- print ('# ERROR: You have a function called simcall_HANDLER_%s, but that simcall is not using any handler' % self.name)
+ print (
+ '# ERROR: You have a function called simcall_HANDLER_%s, but that simcall is not using any handler' %
+ self.name)
print ('# Either change your simcall definition, or kill that function')
return False
return True
def accessors(self):
res = []
res.append('')
- regex = re.compile(r"^boost::intrusive_ptr<(.*?)>(.*)$") # to compute the raw type
+ regex = re.compile(r"^boost::intrusive_ptr<(.*?)>(.*)$") # to compute the raw type
# Arguments getter/setters
for i in range(len(self.args)):
arg = self.args[i]
def case(self):
res = []
- args = [ "simgrid::simix::unmarshal<%s>(simcall->args[%d])" % (arg.rettype(), i)
- for i, arg in enumerate(self.args) ]
+ args = ["simgrid::simix::unmarshal<%s>(simcall->args[%d])" % (arg.rettype(), i)
+ for i, arg in enumerate(self.args)]
res.append('case SIMCALL_%s:' % (self.name.upper()))
if self.need_handler:
call = "simcall_HANDLER_%s(simcall%s%s)" % (self.name,
- ", " if len(args) > 0 else "",
- ', '.join(args))
+ ", " if len(args) > 0 else "",
+ ', '.join(args))
else:
call = "SIMIX_%s(%s)" % (self.name, ', '.join(args))
if self.call_kind == 'Func':
res.append(" simgrid::simix::marshal<%s>(simcall->result, %s);" % (self.res.rettype(), call))
else:
- res.append(" " + call + ";");
+ res.append(" " + call + ";")
if self.call_kind != 'Blck':
res.append(' SIMIX_simcall_answer(simcall);')
res.append(' break;')
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)))
+ self.name,
+ ', '.join('%s %s' % (arg.rettype(), arg.name) for arg in self.args)))
res.append('{')
res.append(' if (0) /* Go to that function to follow the code flow through the simcall barrier */')
if self.need_handler:
', '.join(["&SIMIX_process_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)))
+ ', '.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) ]),
+ "".join([", " + arg.rettype() for i, arg in enumerate(self.args)]),
self.name.upper(),
- "".join([ ", " + arg.name for i, arg in enumerate(self.args) ])
- ));
+ "".join([", " + arg.name for i, arg in enumerate(self.args)])
+ ))
res.append('}')
return '\n'.join(res)
fd.write('\n'.join(func(simcall) for simcall in ll))
fd.write('\n#endif\n')
+
if __name__ == '__main__':
simcalls, simcalls_dict = parse('simcalls.in')
ok &= all(map(Simcall.check, simcalls))
for k, v in simcalls_dict.items():
ok &= all(map(Simcall.check, v))
- # FIXME: we should not hide it
- # if not ok:
- # print ("Some checks fail!")
- # sys.exit(1)
+ if not ok:
+ print ("Some checks fail!")
+ sys.exit(1)
#
# popping_accessors.hpp
#
fd = header('popping_accessors.hpp')
- fd.write('#include "src/simix/popping_private.hpp"');
+ fd.write('#include "src/simix/popping_private.hpp"')
handle(fd, Simcall.accessors, simcalls, simcalls_dict)
fd.write(
"\n\n/* The prototype of all simcall handlers, automatically generated for you */\n\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/simix/smx_host_private.hpp"\n')
- fd.write('#include "src/simix/smx_synchro_private.hpp"\n')
fd.write('\n')
fd.write('XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_popping);\n\n')
fd.write(' break;\n')
fd.write(' case SIMCALL_NONE:\n')
fd.write(' THROWF(arg_error, 0, "Asked to do the noop syscall on %s@%s", simcall->issuer->get_cname(),\n')
- fd.write(' sg_host_get_name(simcall->issuer->host_));\n')
- fd.write(' break;\n')
+ fd.write(' sg_host_get_name(simcall->issuer->get_host()));\n')
fd.write(' default:\n')
fd.write(' THROW_IMPOSSIBLE;\n')
fd.write(' }\n')
fd = header('popping_bodies.cpp')
fd.write('#include "smx_private.hpp"\n')
fd.write('#include "src/mc/mc_forward.hpp"\n')
- fd.write('#include "src/simix/smx_synchro_private.hpp"\n')
fd.write('#include "xbt/ex.h"\n')
fd.write('#include <functional>\n')
fd.write('#include <simgrid/simix.hpp>\n')
if (self != simix_global->maestro_process) {
XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->get_cname(), SIMIX_simcall_name(self->simcall.call),
(int)self->simcall.call);
- SIMIX_process_yield(self);
+ self->yield();
} else {
SIMIX_simcall_handle(&self->simcall, 0);
}
}
''')
handle(fd, Simcall.body, simcalls, simcalls_dict)
- fd.write(" /** @endcond */\n");
+ fd.write(" /** @endcond */\n")
fd.close()