X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/6de03ecc4e630732984a0673512a5d15fd75e270..ff7eafd19936822d22334fbf345c0b2ac9d56dc5:/src/simix/simcalls.py diff --git a/src/simix/simcalls.py b/src/simix/simcalls.py index 27d6504986..89de0a4d7e 100755 --- a/src/simix/simcalls.py +++ b/src/simix/simcalls.py @@ -24,6 +24,7 @@ types = [('TCHAR', 'char', 'c') ,('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')] @@ -152,6 +153,11 @@ class Simcall(object): def body(self): return ''' inline static %s simcall_BODY_%s(%s) { smx_process_t self = SIMIX_process_self(); + + /* Go to that function to follow the code flow through the simcall barrier */ + if (0) SIMIX_pre_%s(%s); + /* end of the guide intended to the poor programmer wanting to go from MSG to Surf */ + self->simcall.call = SIMCALL_%s; memset(&self->simcall.result, 0, sizeof(self->simcall.result)); memset(self->simcall.args, 0, sizeof(self->simcall.args)); @@ -168,6 +174,8 @@ class Simcall(object): ,self.name ,', '.join('%s %s'%(arg.ret(), arg.name) for arg in self.args) + ,self.name + ,', '.join(["&self->simcall"]+ [arg.name for arg in self.args]) ,self.name.upper() ,'\n'.join(' self->simcall.args[%d].%s = (%s) %s;'%(i, arg.field(), arg.type, arg.name) for i, arg in enumerate(self.args)) @@ -196,7 +204,7 @@ def parse(fn): resdi.append(sim) return res, resd -def write(fn, func, scs, scd): +def write(fn, func, scs, scd,pre="",post=""): f = open(fn, 'w') f.write('/*********************************************\n') f.write(' * File Generated by src/simix/simcalls.py *\n') @@ -204,9 +212,11 @@ def write(fn, func, scs, scd): f.write(' * Do not modify this file, add new simcalls *\n') f.write(' * in src/simix/simcalls.in *\n') f.write(' *********************************************/\n\n') + f.write(pre) f.write('\n'.join(func(sc) for sc in scs)) for k, v in scd.items(): f.write('\n#ifdef %s\n%s\n#endif\n'%(k, '\n'.join(func(sc) for sc in v))) + f.write(post) f.close() if __name__=='__main__': @@ -220,9 +230,57 @@ if __name__=='__main__': #if not ok: # sys.exit(1) - write('simcalls_generated_enum.h', Simcall.enum, simcalls, simcalls_dict) + write('simcalls_generated_enum.h', Simcall.enum, simcalls, simcalls_dict,""" +/** + * @brief All possible simcalls. + */ +typedef enum { +SIMCALL_NONE, + """,""" +SIMCALL_NEW_API_INIT, +NUM_SIMCALLS +} e_smx_simcall_t; + """) + write('simcalls_generated_string.c', Simcall.string, simcalls, simcalls_dict) write('simcalls_generated_res_getter_setter.h', Simcall.result_getter_setter, simcalls, simcalls_dict) write('simcalls_generated_args_getter_setter.h', Simcall.args_getter_setter, simcalls, simcalls_dict) - write('simcalls_generated_case.c', Simcall.case, simcalls, simcalls_dict) + + + write('simcalls_generated_case.c', Simcall.case, simcalls, simcalls_dict,""" +#include "smx_private.h" +#ifdef HAVE_MC +#include "mc/mc_private.h" +#endif + +XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_smurf); + +void SIMIX_simcall_pre(smx_simcall_t simcall, int value) +{ + XBT_DEBUG("Handling simcall %p: %s", simcall, SIMIX_simcall_name(simcall->call)); + SIMCALL_SET_MC_VALUE(simcall, value); + if (simcall->issuer->context->iwannadie && simcall->call != SIMCALL_PROCESS_CLEANUP) + return; + switch (simcall->call) { + """,""" + case NUM_SIMCALLS: + break; + case SIMCALL_NONE: + THROWF(arg_error,0,"Asked to do the noop syscall on %s@%s", + SIMIX_process_get_name(simcall->issuer), + SIMIX_host_get_name(SIMIX_process_get_host(simcall->issuer)) + ); + break; + + /* ****************************************************************************************** */ + /* TUTORIAL: New API */ + /* ****************************************************************************************** */ + case SIMCALL_NEW_API_INIT: + SIMIX_pre_new_api_fct(simcall); + break; + } +} + """) + + write('simcalls_generated_body.c', Simcall.body, simcalls, simcalls_dict)