Browse Source

Add _list_member and _list_ismember helpers, and use them

Samuel Thibault 10 years ago
parent
commit
0e92653f70
3 changed files with 25 additions and 42 deletions
  1. 13 4
      src/common/list.h
  2. 9 26
      src/datawizard/data_request.c
  3. 3 12
      src/util/openmp_runtime_support_omp_api.c

+ 13 - 4
src/common/list.h

@@ -64,14 +64,19 @@
  *   struct FOO*	FOO_list_front(struct FOO_list*);
  *     * vérifie si la liste chainée est cohérente
  *   int		FOO_list_check(struct FOO_list*);
- *     *
+ *     * teste si la list est correctement chaînée
  *   struct FOO*	FOO_list_begin(struct FOO_list*);
- *     *
+ *     * retourne le premier élément de la liste
  *   struct FOO*	FOO_list_end(struct FOO_list*);
- *     *
+ *     * retourne la valeur à tester en fin de liste
  *   struct FOO*	FOO_list_next(struct FOO*)
- *     *
+ *     * retourne l'élément suivant de la liste
  *   int		FOO_list_size(struct FOO_list*)
+ *     * retourne la taille de la liste
+ *   int		FOO_list_member(struct FOO_list*, struct FOO*)
+ *     * retourne la position de l'élément dans la liste (indexé à partir de 0)
+ *   int		FOO_list_ismember(struct FOO_list*, struct FOO*)
+ *     * teste si l'élément est dans la liste
  * *********************************************************
  * Exemples d'utilisation :
  *  - au départ, on a :
@@ -178,6 +183,10 @@
     { return NULL; } \
   /** @internal */static inline struct ENAME *ENAME##_list_next(struct ENAME *i) \
     { return i->_next; } \
+  /** @internal */static inline int ENAME##_list_ismember(struct ENAME##_list *l, struct ENAME *e) \
+    { struct ENAME *i=l->_head; while(i!=NULL){ if (i == e) return 1; i=i->_next; } return 0; } \
+  /** @internal */static inline int ENAME##_list_member(struct ENAME##_list *l, struct ENAME *e) \
+    { struct ENAME *i=l->_head; int k=0; while(i!=NULL){if (i == e) return k; k++; i=i->_next; } return -1; } \
   /** @internal */static inline int ENAME##_list_size(struct ENAME##_list *l) \
     { struct ENAME *i=l->_head; int k=0; while(i!=NULL){k++;i=i->_next;} return k; } \
   /** @internal */static inline int ENAME##_list_check(struct ENAME##_list *l) \

+ 9 - 26
src/datawizard/data_request.c

@@ -807,38 +807,21 @@ void _starpu_update_prefetch_status(struct _starpu_data_request *r, unsigned pre
 
 	/* The request can be in a different list (handling request or the temp list)
 	 * we have to check that it is really in the prefetch list. */
-	struct _starpu_data_request *r_iter;
-	for (r_iter = _starpu_data_request_list_begin(&prefetch_requests[r->handling_node]);
-	     r_iter != _starpu_data_request_list_end(&prefetch_requests[r->handling_node]);
-	     r_iter = _starpu_data_request_list_next(r_iter))
+	if (_starpu_data_request_list_ismember(&prefetch_requests[r->handling_node], r))
 	{
-
-		if (r==r_iter)
-		{
-			_starpu_data_request_list_erase(&prefetch_requests[r->handling_node],r);
-			_starpu_data_request_list_push_front(&data_requests[r->handling_node],r);
-			goto found;
-		}
+		_starpu_data_request_list_erase(&prefetch_requests[r->handling_node],r);
+		_starpu_data_request_list_push_front(&data_requests[r->handling_node],r);
 	}
-
 	/* The request can be in a different list (handling request or the temp list)
 	 * we have to check that it is really in the idle list. */
-	for (r_iter = _starpu_data_request_list_begin(&idle_requests[r->handling_node]);
-	     r_iter != _starpu_data_request_list_end(&idle_requests[r->handling_node]);
-	     r_iter = _starpu_data_request_list_next(r_iter))
+	else if (_starpu_data_request_list_ismember(&idle_requests[r->handling_node], r))
 	{
-
-		if (r==r_iter)
-		{
-			_starpu_data_request_list_erase(&idle_requests[r->handling_node],r);
-			if (prefetch == 1)
-				_starpu_data_request_list_push_front(&prefetch_requests[r->handling_node],r);
-			else
-				_starpu_data_request_list_push_front(&data_requests[r->handling_node],r);
-			goto found;
-		}
+		_starpu_data_request_list_erase(&idle_requests[r->handling_node],r);
+		if (prefetch == 1)
+			_starpu_data_request_list_push_front(&prefetch_requests[r->handling_node],r);
+		else
+			_starpu_data_request_list_push_front(&data_requests[r->handling_node],r);
 	}
-found:
 	STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[r->handling_node]);
 
 #ifndef STARPU_NON_BLOCKING_DRIVERS

+ 3 - 12
src/util/openmp_runtime_support_omp_api.c

@@ -48,18 +48,9 @@ static int _starpu_omp_get_region_thread_num(const struct starpu_omp_region * co
 	STARPU_ASSERT(thread != NULL);
 	if (thread == region->master_thread)
 		return 0;
-	struct starpu_omp_thread * region_thread;
-	int tid = 1;
-	for (region_thread  = starpu_omp_thread_list_begin(&region->thread_list);
-			region_thread != starpu_omp_thread_list_end(&region->thread_list);
-			region_thread  = starpu_omp_thread_list_next(region_thread))
-	{
-		if (thread == region_thread)
-		{
-			return tid;
-		}
-		tid++;
-	}
+	int tid = starpu_omp_thread_list_member(&region->thread_list, thread);
+	if (tid >= 0)
+		return tid+1;
 	_STARPU_ERROR("unrecognized omp thread\n");
 }