diff runtime/func.h @ 116:60906f8803ef

Improved profiling
author Mike Pavone <pavone@retrodev.com>
date Wed, 13 Oct 2010 02:51:56 -0400
parents 43cc42df26cc
children 5eedee9063dc
line wrap: on
line diff
--- a/runtime/func.h	Wed Oct 13 01:18:53 2010 +0000
+++ b/runtime/func.h	Wed Oct 13 02:51:56 2010 -0400
@@ -45,57 +45,42 @@
 		my_cdata->self_accum += ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - my_cdata->self_start;
 		
 #define AND_TOTAL \
+		*(my_cdata->myactivationlevel)--;\
 		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 AND_RESUME_TOTAL \
+		*(my_cdata->myactivationlevel)++;\
+		my_cdata->start = my_cdata->self_start;
 		
 #define EndFunc(name)	\
 		free_stack(ct, lv_ ## name);\
 		func = cdata->func;\
+		profile_activationlevel[FUNC_ ## name]--;\
 		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;\
+		if(profile_activationlevel[FUNC_ ## name])\
+		{\
+			profile_nestedcounts[FUNC_ ## name]++;\
+		} else {\
+			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:\
+		profile_activationlevel[FUNC_ ## name]++;\
+		cdata->myactivationlevel = &profile_activationlevel[FUNC_ ## name];\
 		START_PROFILE\
 		lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));\
 		my_cdata = cdata;
 
-
-#define FuncNoLocals(name,numparams) \
-f_ ## name:\
-		for(idx = numparams; idx < cdata->num_params; ++idx)\
-			release_ref(cdata->params[idx]); cdata->num_params = numparams;\
-sf_ ## name:\
-		my_cdata = cdata;		
-
 #define MethodImpl(name,type_name,mytype_id,numparams) \
 f_ ## name ## AT_ ## type_name:\
 sf_ ## name ## AT_ ## type_name:\
@@ -111,11 +96,66 @@
 			exit(1);\
 		}\
 m_ ## name ## AT_ ## type_name:\
+		profile_activationlevel[FUNC_ ## name ## AT_ ## type_name]++;\
+		cdata->myactivationlevel = &profile_activationlevel[FUNC_ ## 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));\
 		my_cdata = cdata;
+
+#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;
+		
+#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:\
+		lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));\
+		my_cdata = cdata;
+
+#define MethodImpl(name,type_name,mytype_id,numparams) \
+f_ ## name ## AT_ ## type_name:\
+sf_ ## name ## AT_ ## type_name:\
+		if (cdata->num_params < 1)\
+		{\
+			cdata = alloc_cdata(ct, cdata, 0);\
+			cdata->func = FUNC_ ## name ## AT_ ## type_name;\
+			goto _exception;\
+		}\
+		if(get_blueprint(cdata->params[0])->type_id != mytype_id)\
+		{\
+			puts("uh oh, need conversion and that's not implemented yet!");\
+			exit(1);\
+		}\
+m_ ## name ## AT_ ## type_name:\
+		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));\
+		my_cdata = cdata;
+
+#endif
+
+#define EndFuncNoLocals	\
+		func = cdata->func;
+
+
+#define FuncNoLocals(name,numparams) \
+f_ ## name:\
+		for(idx = numparams; idx < cdata->num_params; ++idx)\
+			release_ref(cdata->params[idx]); cdata->num_params = numparams;\
+sf_ ## name:\
+		my_cdata = cdata;
 			
 				
 #define MethodImplNoLocals(name,type_name,mytype_id,numparams) \