X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/46b28944a694e89266f79d5209ec546160259e49..ad9d9459261f6f55f69edc333689ad86f2a9f229:/src/simix/simcalls.py diff --git a/src/simix/simcalls.py b/src/simix/simcalls.py index 531cf7034d..c78d970296 100755 --- a/src/simix/simcalls.py +++ b/src/simix/simcalls.py @@ -118,41 +118,40 @@ class Simcall(object): res.append('static inline %s simcall_%s__get__%s(smx_simcall_t simcall) {' % ( arg.rettype(), self.name, arg.name)) res.append( - ' return %s simcall->args[%i].%s;' % (arg.cast(), i, arg.field())) + ' return simgrid::simix::unmarshal<%s>(simcall->args[%i]);' % (arg.rettype(), i)) res.append('}') res.append('static inline void simcall_%s__set__%s(smx_simcall_t simcall, %s arg) {' % ( - self.name, arg.name, arg.type)) - res.append(' simcall->args[%i].%s = arg;' % (i, arg.field())) + self.name, arg.name, arg.rettype())) + res.append(' simgrid::simix::marshal<%s>(simcall->args[%i], arg);' % (arg.rettype(), i)) res.append('}') # Return value getter/setters if self.res.type != 'void': res.append( 'static inline %s simcall_%s__get__result(smx_simcall_t simcall){' % (self.res.rettype(), self.name)) - res.append(' return %s simcall->result.%s;' % - (self.res.cast(), self.res.field())) + res.append(' return simgrid::simix::unmarshal<%s>(simcall->result);' % self.res.rettype()) res.append('}') res.append( - 'static inline void simcall_%s__set__result(smx_simcall_t simcall, %s result){' % (self.name, self.res.type,)) - res.append(' simcall->result.%s = result;' % (self.res.field())) + 'static inline void simcall_%s__set__result(smx_simcall_t simcall, %s result){' % (self.name, self.res.rettype())) + res.append(' simgrid::simix::marshal<%s>(simcall->result, result);' % (self.res.rettype())) res.append('}') return '\n'.join(res) def case(self): res = [] + 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: - res.append( - ' %ssimcall_HANDLER_%s(simcall %s);' % ('simcall->result.%s = ' % self.res.field() if self.call_kind == 'Func' else ' ', - self.name, - ''.join(', %s simcall->args[%d].%s' % (arg.cast(), i, arg.field()) - for i, arg in enumerate(self.args)))) + call = "simcall_HANDLER_%s(simcall%s%s)" % (self.name, + ", " if len(args) > 0 else "", + ', '.join(args)) else: - res.append( - ' %sSIMIX_%s(%s);' % ('simcall->result.%s = ' % self.res.field() if self.call_kind == 'Func' else ' ', - self.name, - ','.join('%s simcall->args[%d].%s' % (arg.cast(), i, arg.field()) - for i, arg in enumerate(self.args)))) + 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(' %sbreak; \n' % ('SIMIX_simcall_answer(simcall);\n ' if self.call_kind != 'Blck' else ' ')) return '\n'.join(res) @@ -163,41 +162,20 @@ class Simcall(object): '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(' smx_process_t self = SIMIX_process_self();') - res.append('') res.append( ' /* Go to that function to follow the code flow through the simcall barrier */') if self.need_handler: res.append(' if (0) simcall_HANDLER_%s(%s);' % (self.name, - ', '.join(["&self->simcall"] + [arg.name for arg in self.args]))) + ', '.join(["&SIMIX_process_self()->simcall"] + [arg.name for arg in self.args]))) else: res.append(' if (0) SIMIX_%s(%s);' % (self.name, ', '.join(arg.name for arg in self.args))) - res.append( - ' /* end of the guide intended to the poor programmer wanting to go from MSG to Surf */') - res.append('') - res.append(' self->simcall.call = SIMCALL_%s;' % - (self.name.upper())) - res.append( - ' memset(&self->simcall.result, 0, sizeof(self->simcall.result));') - res.append( - ' memset(self->simcall.args, 0, sizeof(self->simcall.args));') - res.append('\n'.join(' self->simcall.args[%d].%s = (%s) %s;' % (i, arg.field(), arg.type, arg.name) - for i, arg in enumerate(self.args))) - res.append(' if (self != simix_global->maestro_process) {') - res.append( - ' XBT_DEBUG("Yield process \'%s\' on simcall %s (%d)", self->name.c_str(),') - res.append( - ' SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);') - res.append(' SIMIX_process_yield(self);') - res.append(' } else {') - res.append(' SIMIX_simcall_handle(&self->simcall, 0);') - res.append(' } ') - if self.res.type != 'void': - res.append(' return (%s) self->simcall.result.%s;' % - (self.res.rettype(), self.res.field())) - else: - res.append(' ') + 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) @@ -296,6 +274,7 @@ if __name__ == '__main__': # smx_popping_accessors.c # fd = header('popping_accessors.h') + fd.write('#include "src/simix/popping_private.h"'); handle(fd, Simcall.accessors, simcalls, simcalls_dict) fd.write( "\n\n/* The prototype of all simcall handlers, automatically generated for you */\n\n") @@ -384,6 +363,22 @@ if __name__ == '__main__': fd.write('#include "xbt/ex.h"\n') fd.write('#include \n') fd.write("/** @cond */ // Please Doxygen, don't look at this\n") + fd.write(''' +template +inline static R simcall(e_smx_simcall_t call, T const&... t) +{ + smx_process_t self = SIMIX_process_self(); + simgrid::simix::marshal(&self->simcall, call, t...); + if (self != simix_global->maestro_process) { + XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name.c_str(), + SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call); + SIMIX_process_yield(self); + } else { + SIMIX_simcall_handle(&self->simcall, 0); + } + return simgrid::simix::unmarshal(self->simcall.result); +} +''') handle(fd, Simcall.body, simcalls, simcalls_dict) fd.write("/** @endcond */\n"); fd.close()