Переглянути джерело

core: add starpu_tag_get_task()

This function allows to get the task associated to a given tag ID. This is
an idea from the StarPU's todolist. To make sure the function works as
expected, I added a little test in tag_example.c.
Samuel Pitoiset 9 роки тому
батько
коміт
ddddab6a50

+ 2 - 0
examples/tag_example/tag_example.c

@@ -154,6 +154,8 @@ static int create_task_grid(unsigned piter)
 		ret = starpu_task_submit(task);
 		if (ret == -ENODEV) return 77;
 		STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
+
+		assert(starpu_tag_get_task(task->tag_id) == task);
 	}
 	return 0;
 }

+ 2 - 0
include/starpu_task.h

@@ -276,6 +276,8 @@ void starpu_tag_restart(starpu_tag_t id);
 
 void starpu_tag_remove(starpu_tag_t id);
 
+struct starpu_task *starpu_tag_get_task(starpu_tag_t id);
+
 void starpu_task_init(struct starpu_task *task);
 void starpu_task_clean(struct starpu_task *task);
 

+ 20 - 0
src/core/dependencies/tags.c

@@ -491,3 +491,23 @@ int starpu_tag_wait(starpu_tag_t id)
 {
 	return starpu_tag_wait_array(1, &id);
 }
+
+struct starpu_task *starpu_tag_get_task(starpu_tag_t id)
+{
+	struct _starpu_tag_table *entry;
+	struct _starpu_tag *tag;
+
+	STARPU_PTHREAD_RWLOCK_WRLOCK(&tag_global_rwlock);
+	HASH_FIND_UINT64_T(tag_htbl, &id, entry);
+	STARPU_PTHREAD_RWLOCK_UNLOCK(&tag_global_rwlock);
+
+	if (!entry)
+		return NULL;
+	tag = entry->tag;
+
+	if (!tag->job)
+		return NULL;
+
+	return tag->job->task;
+}
+