X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5954f11308de69ea37c6f6fdd993925f90749984..ad9d9459261f6f55f69edc333689ad86f2a9f229:/src/simix/simcalls.py diff --git a/src/simix/simcalls.py b/src/simix/simcalls.py index 3bf49a5464..c78d970296 100755 --- a/src/simix/simcalls.py +++ b/src/simix/simcalls.py @@ -9,13 +9,31 @@ import re import glob -types = [( - 'TCHAR', 'char', 'c'), ('TSTRING', 'const char*', 'cc'), ('TINT', 'int', 'i'), ('TLONG', 'long', 'l'), ('TUCHAR', 'unsigned char', 'uc'), ('TUSHORT', 'unsigned short', 'us'), ('TUINT', 'unsigned int', 'ui'), ('TULONG', 'unsigned long', 'ul'), ('TFLOAT', 'float', 'f'), - ('TDOUBLE', 'double', 'd'), ('TDPTR', 'void*', 'dp'), ('TFPTR', 'FPtr', 'fp'), ('TCPTR', 'const void*', 'cp'), ('TSIZE', 'size_t', 'sz'), ('TSGSIZE', 'sg_size_t', 'sgsz'), ('TSGOFF', 'sg_offset_t', 'sgoff'), ('TVOID', 'void', ''), ('TDSPEC', 'void*', 'dp'), ('TFSPEC', 'FPtr', 'fp')] +types = [ + ('char', 'c'), + ('const char*', 'cc'), + ('int', 'i'), + ('long', 'l'), + ('unsigned char', 'uc'), + ('unsigned short', 'us'), + ('unsigned int', 'ui'), + ('unsigned long', 'ul'), + ('float', 'f'), + ('double', 'd'), + ('void*', 'dp'), + ('FPtr', 'fp'), + ('const void*', 'cp'), + ('size_t', 'sz'), + ('sg_size_t', 'sgsz'), + ('sg_offset_t', 'sgoff'), + ('void', ''), + ('void*', 'dp'), + ('FPtr', 'fp'), + ] class Arg(object): - simcall_types = {k: v for _, k, v in types} + simcall_types = {k: v for k, v in types} def __init__(self, name, type, casted=None): self.name = name @@ -100,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) @@ -145,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,') - 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) @@ -278,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") @@ -323,7 +320,7 @@ if __name__ == '__main__': fd.write('};\n\n') - fd.write('/**\n') + fd.write('/** @private\n') fd.write( ' * @brief (in kernel mode) unpack the simcall and activate the handler\n') fd.write(' * \n') @@ -365,5 +362,23 @@ if __name__ == '__main__': fd.write('#include "src/mc/mc_forward.hpp"\n') 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()