浏览代码

regiseter callback for the context, to be executed when the last task finished executing

Andra Hugo 11 年之前
父节点
当前提交
f31697b342
共有 3 个文件被更改,包括 19 次插入2 次删除
  1. 2 0
      include/starpu_sched_ctx.h
  2. 13 2
      src/core/sched_ctx.c
  3. 4 0
      src/core/sched_ctx.h

+ 2 - 0
include/starpu_sched_ctx.h

@@ -32,6 +32,8 @@ unsigned starpu_sched_ctx_create_with_custom_policy(struct starpu_sched_policy *
 
 unsigned starpu_sched_ctx_create_inside_interval(const char *policy_name, const char *sched_name, int min_ncpus, int max_ncpus, int min_ngpus, int max_ngpus, unsigned allow_overlap);
 
+void starpu_sched_ctx_register_close_callback(unsigned sched_ctx_id, void (*close_callback)(unsigned sched_ctx_id, void* args), void *args);
+
 void starpu_sched_ctx_add_workers(int *workerids_ctx, int nworkers_ctx, unsigned sched_ctx_id);
 
 void starpu_sched_ctx_remove_workers(int *workerids_ctx, int nworkers_ctx, unsigned sched_ctx_id);

+ 13 - 2
src/core/sched_ctx.c

@@ -506,6 +506,14 @@ unsigned starpu_sched_ctx_create_with_custom_policy(struct starpu_sched_policy *
 	return sched_ctx->id;
 }
 
+void starpu_sched_ctx_register_close_callback(unsigned sched_ctx_id, void (*close_callback)(unsigned sched_ctx_id, void* args), void *args)
+{
+	struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id);
+	sched_ctx->close_callback = close_callback;
+	sched_ctx->close_args = args;
+	return;
+}
+
 #ifdef STARPU_USE_SC_HYPERVISOR
 void starpu_sched_ctx_set_perf_counters(unsigned sched_ctx_id, void* perf_counters)
 {
@@ -747,8 +755,8 @@ void _starpu_decrement_nsubmitted_tasks_of_sched_ctx(unsigned sched_ctx_id)
 {
 	struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id);
 	int finished = _starpu_barrier_counter_decrement_until_empty_counter(&sched_ctx->tasks_barrier);
-/*when finished decrementing the tasks if the user signaled he will not submit tasks anymore
-  we can move all its workers to the inheritor context */
+        /* when finished decrementing the tasks if the user signaled he will not submit tasks anymore
+           we can move all its workers to the inheritor context */
 	if(finished && sched_ctx->inheritor != STARPU_NMAX_SCHED_CTXS)
 	{
 		STARPU_PTHREAD_MUTEX_LOCK(&finished_submit_mutex);
@@ -760,6 +768,9 @@ void _starpu_decrement_nsubmitted_tasks_of_sched_ctx(unsigned sched_ctx_id)
 			STARPU_PTHREAD_MUTEX_LOCK(&changing_ctx_mutex[sched_ctx_id]);
 			if(sched_ctx->id != STARPU_NMAX_SCHED_CTXS)
 			{
+				if(sched_ctx->close_callback)
+					sched_ctx->close_callback(sched_ctx->id, sched_ctx->close_args);
+
 				int *workerids = NULL;
 				unsigned nworkers = starpu_sched_ctx_get_workers_list(sched_ctx->id, &workerids);
 				

+ 4 - 0
src/core/sched_ctx.h

@@ -112,6 +112,10 @@ struct _starpu_sched_ctx
 	/* a structure containing a series of performance counters determining the resize procedure */
 	struct starpu_sched_ctx_performance_counters *perf_counters;
 #endif //STARPU_USE_SC_HYPERVISOR
+
+	void (*close_callback)(unsigned sched_ctx_id, void* args);
+
+	void *close_args;
 };
 
 struct _starpu_machine_config;