Mercurial > repos > rhope
diff runtime/func.h @ 110:336da6ce8174
Merge
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 06 Oct 2010 23:48:32 +0000 |
parents | 43cc42df26cc |
children | e5627038b7e7 60906f8803ef |
line wrap: on
line diff
--- a/runtime/func.h Wed Oct 06 23:47:26 2010 +0000 +++ b/runtime/func.h Wed Oct 06 23:48:32 2010 +0000 @@ -33,12 +33,58 @@ #define MethodName(name,type) f_ ## name ## AT_ ## type +#ifdef ENABLE_PROFILING + +#define START_PROFILE \ + gettimeofday(&time, NULL);\ + cdata->accum = cdata->self_accum = 0;\ + cdata->self_start = cdata->start = ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec); + +#define PAUSE_SELF \ + gettimeofday(&time, NULL);\ + my_cdata->self_accum += ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - my_cdata->self_start; + +#define AND_TOTAL \ + my_cdata->accum += ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - my_cdata->start; + +#define RESUME_SELF \ + gettimeofday(&time, NULL);\ + my_cdata->self_start = ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec); + +#define AND_RESUME_TOTAL my_cdata->start = my_cdata->self_start; + +#define EndFunc(name) \ + free_stack(ct, lv_ ## name);\ + func = cdata->func;\ + gettimeofday(&time, NULL);\ + profile_counts[FUNC_ ## name]++;\ + profile_totals[FUNC_ ## name] += ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - cdata->start + cdata->accum;\ + profile_selftotals[FUNC_ ## name] += ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - cdata->self_start + cdata->self_accum; + +#else + +#define START_PROFILE +#define PAUSE_SELF +#define RESUME_SELF +#define AND_TOTAL +#define AND_RESUME_TOTAL + +#define EndFunc(name) \ + free_stack(ct, lv_ ## name);\ + func = cdata->func; + + +#endif + +#define EndFuncNoLocals \ + func = cdata->func; #define Func(name,numparams) \ f_ ## name:\ for(idx = numparams; idx < cdata->num_params; ++idx)\ release_ref(cdata->params[idx]); cdata->num_params = numparams;\ sf_ ## name:\ + START_PROFILE\ lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));\ my_cdata = cdata; @@ -50,32 +96,6 @@ sf_ ## name:\ my_cdata = cdata; -#define EndFunc(name) \ - free_stack(ct, lv_ ## name);\ - func = cdata->func; - -#define EndFuncNoLocals \ - func = cdata->func; - -#define Method(name) \ -f_ ## name:\ -sf_ ## name:\ - switch(get_blueprint(cdata->params[0])->type_id)\ - { - -#define EndMethod(name) \ - default:\ - printf("Type %d does not implement method %s\n", get_blueprint(cdata->params[0])->type_id, #name);\ - cdata = alloc_cdata(ct, cdata, 0);\ - cdata->func = FUNC_ ## name;\ - goto _exception;\ - } - - -#define MethodDispatch(type_id,name,type_name) \ - case type_id:\ - goto m_ ## name ## AT_ ## type_name; - #define MethodImpl(name,type_name,mytype_id,numparams) \ f_ ## name ## AT_ ## type_name:\ sf_ ## name ## AT_ ## type_name:\ @@ -91,6 +111,7 @@ exit(1);\ }\ m_ ## name ## AT_ ## type_name:\ + START_PROFILE\ for(idx = numparams; idx < cdata->num_params; ++idx)\ release_ref(cdata->params[idx]); cdata->num_params = numparams;\ lv_ ## name ## AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## AT_ ## type_name));\ @@ -113,6 +134,26 @@ for(idx = numparams; idx < cdata->num_params; ++idx)\ release_ref(cdata->params[idx]); cdata->num_params = numparams;\ my_cdata = cdata; + + +#define Method(name) \ +f_ ## name:\ +sf_ ## name:\ + switch(get_blueprint(cdata->params[0])->type_id)\ + { + +#define EndMethod(name) \ + default:\ + printf("Type %d does not implement method %s\n", get_blueprint(cdata->params[0])->type_id, #name);\ + cdata = alloc_cdata(ct, cdata, 0);\ + cdata->func = FUNC_ ## name;\ + goto _exception;\ + } + + +#define MethodDispatch(type_id,name,type_name) \ + case type_id:\ + goto m_ ## name ## AT_ ## type_name; #define NumParams #define CallSpace @@ -175,11 +216,13 @@ cdata->func = RES_ ## resumeto ## _ ## myname;\ cdata->num_params = numparams + ((t_Worker *)tocall)->payload.Count;\ cdata->vars = lv_ ## myname;\ - func = ((t_Worker *)tocall)->payload.Index; + func = ((t_Worker *)tocall)->payload.Index;\ + PAUSE_SELF #define ValCallPostlude(resumeto,myname)\ r ## resumeto ## _ ## myname:\ my_cdata = cdata->lastframe;\ + RESUME_SELF\ lv_ ## myname = cdata->vars; @@ -187,9 +230,21 @@ cdata->func = RES_ ## resumeto ## _ ## myname;\ cdata->num_params = numparams;\ cdata->vars = lv_ ## myname;\ + if(FUNC_ ## tocall == FUNC_ ## myname) {\ + PAUSE_SELF\ + AND_TOTAL\ + } else if (FUNC_ ## tocall != FUNC_PL_ && FUNC_ ## tocall != FUNC_MN_ && FUNC_ ## tocall != FUNC_TM_ && FUNC_ ## tocall != FUNC_DV_ && FUNC_ ## tocall != FUNC_If) {\ + PAUSE_SELF\ + }\ goto sf_ ## tocall;\ r ## resumeto ## _ ## myname:\ my_cdata = cdata->lastframe;\ + if(FUNC_ ## tocall == FUNC_ ## myname) {\ + RESUME_SELF\ + AND_RESUME_TOTAL\ + } else if (FUNC_ ## tocall != FUNC_PL_ && FUNC_ ## tocall != FUNC_MN_ && FUNC_ ## tocall != FUNC_TM_ && FUNC_ ## tocall != FUNC_DV_ && FUNC_ ## tocall != FUNC_If) {\ + RESUME_SELF\ + }\ lv_ ## myname = cdata->vars;