浏览代码

generalize the job list structure

Samuel Thibault 9 年之前
父节点
当前提交
55a3d108a1
共有 3 个文件被更改,包括 76 次插入30 次删除
  1. 3 25
      src/core/jobs.c
  2. 70 2
      src/core/jobs.h
  3. 3 3
      tools/gdbinit

+ 3 - 25
src/core/jobs.c

@@ -35,7 +35,7 @@ static unsigned long job_cnt = 0;
 
 #ifdef STARPU_DEBUG
 /* List of all jobs, for debugging */
-static struct _starpu_job *all_jobs_list;
+static struct _starpu_job_list all_jobs_list;
 static starpu_pthread_mutex_t all_jobs_list_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER;
 #endif
 
@@ -229,13 +229,7 @@ void _starpu_handle_job_submission(struct _starpu_job *j)
 
 #ifdef STARPU_DEBUG
 	STARPU_PTHREAD_MUTEX_LOCK(&all_jobs_list_mutex);
-	STARPU_ASSERT(!j->next_all);
-	STARPU_ASSERT(!j->prev_all && all_jobs_list != j);
-	if (all_jobs_list)
-		all_jobs_list->prev_all = j;
-	j->next_all = all_jobs_list;
-	j->prev_all = NULL;
-	all_jobs_list = j;
+	_starpu_job_list_push_back(&all_jobs_list, j, all_submitted);
 	STARPU_PTHREAD_MUTEX_UNLOCK(&all_jobs_list_mutex);
 #endif
 }
@@ -255,23 +249,7 @@ void _starpu_handle_job_termination(struct _starpu_job *j)
 
 #ifdef STARPU_DEBUG
 	STARPU_PTHREAD_MUTEX_LOCK(&all_jobs_list_mutex);
-	if (j->next_all)
-	{
-		STARPU_ASSERT(j->next_all->prev_all == j);
-		j->next_all->prev_all = j->prev_all;
-	}
-	if (j->prev_all)
-	{
-		STARPU_ASSERT(j->prev_all->next_all == j);
-		j->prev_all->next_all = j->next_all;
-	}
-	else
-	{
-		STARPU_ASSERT(all_jobs_list == j);
-		all_jobs_list = j->next_all;
-	}
-	j->next_all = NULL;
-	j->prev_all = NULL;
+	_starpu_job_list_erase(&all_jobs_list, j, all_submitted);
 	STARPU_PTHREAD_MUTEX_UNLOCK(&all_jobs_list_mutex);
 #endif
 

+ 70 - 2
src/core/jobs.h

@@ -63,6 +63,75 @@ struct _starpu_data_descr
 	int node;
 };
 
+struct _starpu_job_list {
+	struct _starpu_job *next;
+	struct _starpu_job *prev;
+};
+
+#ifdef STARPU_DEBUG
+#define STARPU_ASSERT_JOB_LIST(expr) STARPU_ASSERT(expr)
+#else
+#define STARPU_ASSERT_JOB_LIST(expr) ((void) 0)
+#endif
+
+#define _starpu_job_list_push_front(head, j, member) do { \
+	struct _starpu_job *_j = (j); \
+	struct _starpu_job_list *_head = (head); \
+	STARPU_ASSERT_JOB_LIST(_j->member.prev == NULL); \
+	STARPU_ASSERT_JOB_LIST(_j->member.next == NULL); \
+	if (_head->next) { \
+		_j->member.next = _head->next; \
+		_head->next->member.prev = _j; \
+	} else { \
+		_head->prev = _j; \
+	} \
+	_head->next = _j; \
+} while (0)
+
+#define _starpu_job_list_push_back(head, j, member) do { \
+	struct _starpu_job *_j = (j); \
+	struct _starpu_job_list *_head = (head); \
+	STARPU_ASSERT_JOB_LIST(_j->member.prev == NULL); \
+	STARPU_ASSERT_JOB_LIST(_j->member.next == NULL); \
+	if (_head->prev) { \
+		_j->member.prev = _head->prev; \
+		_head->prev->member.next = _j; \
+	} else { \
+		_head->next = _j; \
+	} \
+	_head->prev = _j; \
+} while (0)
+
+#define _starpu_job_list_erase(head, j, member) do { \
+	struct _starpu_job *_j = (j); \
+	struct _starpu_job_list *_head = (head); \
+	if (_j->member.next) { \
+		STARPU_ASSERT_JOB_LIST(_j->member.next->member.prev == _j); \
+		_j->member.next->member.prev = _j->member.prev; \
+	} else { \
+		STARPU_ASSERT_JOB_LIST(_head->prev == _j); \
+		_head->prev = _j->member.prev; \
+	} \
+	if (_j->member.prev) { \
+		STARPU_ASSERT_JOB_LIST(_j->member.prev->member.next == _j); \
+		_j->member.prev->member.next = _j->member.next; \
+	} else { \
+		STARPU_ASSERT_JOB_LIST(_head->next == _j); \
+		_head->next = _j->member.next; \
+	} \
+	_j->member.next = NULL; \
+	_j->member.prev = NULL; \
+} while (0)
+
+#define _starpu_job_list_empty(head) \
+	((head)->next != NULL)
+#define _starpu_job_list_begin(head, member) \
+	((head)->next)
+#define _starpu_job_list_next(head, j, member) \
+	((j)->next)
+#define _starpu_job_list_end(head, j, member) \
+	(NULL)
+
 /* A job is the internal representation of a task. */
 struct _starpu_job {
 
@@ -189,8 +258,7 @@ struct _starpu_job {
 
 #ifdef STARPU_DEBUG
 	/* Linked-list of all jobs, for debugging */
-	struct _starpu_job *prev_all;
-	struct _starpu_job *next_all;
+	struct _starpu_job_list all_submitted;
 #endif
 };
 

+ 3 - 3
tools/gdbinit

@@ -1,7 +1,7 @@
 
 # StarPU --- Runtime system for heterogeneous multicore architectures.
 #
-# Copyright (C) 2010-2015  Université de Bordeaux
+# Copyright (C) 2010-2016  Université de Bordeaux
 # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015  CNRS
 #
 # StarPU is free software; you can redistribute it and/or modify
@@ -229,10 +229,10 @@ end
 
 define starpu-all-tasks
   set language c
-  set $j = all_jobs_list
+  set $j = all_jobs_list->next
   while $j != 0
     printf "task %p\n", $j->task
-    set $j = $j->next_all
+    set $j = $j->all_submitted->next
   end
 end