소스 검색

Remove all tags on starpu_shutdown

Samuel Thibault 13 년 전
부모
커밋
1475f155a4
6개의 변경된 파일51개의 추가작업 그리고 12개의 파일을 삭제
  1. 18 1
      src/core/dependencies/htable.c
  2. 1 0
      src/core/dependencies/htable.h
  3. 26 11
      src/core/dependencies/tags.c
  4. 2 0
      src/core/dependencies/tags.h
  5. 3 0
      src/core/workers.c
  6. 1 0
      tests/core/static_restartable_tag.c

+ 18 - 1
src/core/dependencies/htable.c

@@ -170,7 +170,7 @@ void *_starpu_htbl_remove_tag(struct _starpu_htbl_node **htbl, starpu_tag_t tag)
 				break;
 
 			/* we remove this node */
-			free(path[level]);
+			//free(path[level]);
 			*(path_parent[level]) = NULL;
 		}
 	}
@@ -178,3 +178,20 @@ void *_starpu_htbl_remove_tag(struct _starpu_htbl_node **htbl, starpu_tag_t tag)
 	/* we return the entry if there was one */
 	return old_entry;
 }
+
+void _starpu_htbl_clear_tags(struct _starpu_htbl_node **htbl, unsigned level, void (*free_entry)(void *))
+{
+	unsigned i;
+	struct _starpu_htbl_node *tbl = *htbl;
+
+	if (!tbl)
+		return;
+
+	if (level * _STARPU_HTBL_NODE_SIZE < _STARPU_TAG_SIZE) {
+		for (i = 0; i < 1<<_STARPU_HTBL_NODE_SIZE; i++)
+			_starpu_htbl_clear_tags(&tbl->children[i], level + 1, free_entry);
+		free(tbl);
+	} else
+		free_entry(tbl);
+	*htbl = NULL;
+}

+ 1 - 0
src/core/dependencies/htable.h

@@ -39,6 +39,7 @@ struct _starpu_htbl_node
 void *_starpu_htbl_search_tag(struct _starpu_htbl_node *htbl, starpu_tag_t tag);
 void *_starpu_htbl_insert_tag(struct _starpu_htbl_node **htbl, starpu_tag_t tag, void *entry);
 void *_starpu_htbl_remove_tag(struct _starpu_htbl_node **htbl, starpu_tag_t tag);
+void _starpu_htbl_clear_tags(struct _starpu_htbl_node **htbl, unsigned level, void (*free_entry)(void*));
 
 
 #endif

+ 26 - 11
src/core/dependencies/tags.c

@@ -79,18 +79,11 @@ static struct _starpu_tag *_starpu_tag_init(starpu_tag_t id)
 	return tag;
 }
 
-void starpu_tag_remove(starpu_tag_t id)
+static void _starpu_tag_free(void *_tag)
 {
-	struct _starpu_tag *tag;
-
-	_STARPU_PTHREAD_RWLOCK_WRLOCK(&tag_global_rwlock);
-
-	tag = (struct _starpu_tag *) _starpu_htbl_remove_tag(&tag_htbl, id);
-
-	_STARPU_PTHREAD_RWLOCK_UNLOCK(&tag_global_rwlock);
+	struct _starpu_tag *tag = (struct _starpu_tag *) _tag;
 
-	if (tag)
-	{
+	if (tag) {
 		_starpu_spin_lock(&tag->lock);
 
 		unsigned nsuccs = tag->tag_successors.nsuccs;
@@ -113,9 +106,31 @@ void starpu_tag_remove(starpu_tag_t id)
 #endif
 
 		_starpu_spin_unlock(&tag->lock);
+
+		free(tag);
 	}
+}
+
+void starpu_tag_remove(starpu_tag_t id)
+{
+	struct _starpu_tag *tag;
+
+	_STARPU_PTHREAD_RWLOCK_WRLOCK(&tag_global_rwlock);
+
+	tag = (struct _starpu_tag *) _starpu_htbl_remove_tag(&tag_htbl, id);
+
+	_STARPU_PTHREAD_RWLOCK_UNLOCK(&tag_global_rwlock);
 
-	free(tag);
+	_starpu_tag_free(tag);
+}
+
+void _starpu_tag_clear(void)
+{
+	_STARPU_PTHREAD_RWLOCK_WRLOCK(&tag_global_rwlock);
+
+	_starpu_htbl_clear_tags(&tag_htbl, 0, _starpu_tag_free);
+
+	_STARPU_PTHREAD_RWLOCK_UNLOCK(&tag_global_rwlock);
 }
 
 static struct _starpu_tag *gettag_struct(starpu_tag_t id)

+ 2 - 0
src/core/dependencies/tags.h

@@ -69,4 +69,6 @@ void _starpu_tag_set_ready(struct _starpu_tag *tag);
 
 unsigned _starpu_submit_job_enforce_task_deps(struct _starpu_job *j);
 
+void _starpu_tag_clear(void);
+
 #endif // __TAGS_H__

+ 3 - 0
src/core/workers.c

@@ -609,6 +609,9 @@ void starpu_shutdown(void)
 
 	_starpu_data_interface_shutdown();
 
+	/* Drop all remaining tags */
+	_starpu_tag_clear();
+
 	_starpu_close_debug_logfile();
 
 	_STARPU_PTHREAD_MUTEX_LOCK(&init_mutex);

+ 1 - 0
tests/core/static_restartable_tag.c

@@ -88,6 +88,7 @@ int main(int argc, char **argv)
 
 		ret = starpu_tag_wait(tag);
 		STARPU_CHECK_RETURN_VALUE(ret, "starpu_tag_wait");
+		starpu_task_deinit(&task);
 	}
 
 	gettimeofday(&end, NULL);