Parcourir la source

Add magic number to data, to check against multiple unregistrations

Samuel Thibault il y a 9 ans
Parent
commit
02508a3ed7
2 fichiers modifiés avec 7 ajouts et 0 suppressions
  1. 1 0
      src/datawizard/coherency.h
  2. 6 0
      src/datawizard/interfaces/data_interface.c

+ 1 - 0
src/datawizard/coherency.h

@@ -115,6 +115,7 @@ typedef void (*_starpu_data_handle_unregister_hook)(starpu_data_handle_t);
 
 struct _starpu_data_state
 {
+	int magic;
 	struct _starpu_data_requester_list req_list;
 	/* the number of requests currently in the scheduling engine (not in
 	 * the req_list anymore), i.e. the number of holders of the

+ 6 - 0
src/datawizard/interfaces/data_interface.c

@@ -421,6 +421,7 @@ int _starpu_data_handle_init(starpu_data_handle_t handle, struct starpu_data_int
 	 * starpu_data_unregister is actually safe */
 	STARPU_HG_DISABLE_CHECKING(handle->busy_count);
 
+	handle->magic = 42;
 	handle->ops = interface_ops;
 	handle->mf_node = mf_node;
 	handle->mpi_data = NULL;
@@ -671,6 +672,8 @@ static void _starpu_data_unregister_fetch_data_callback(void *_arg)
 static void _starpu_data_unregister(starpu_data_handle_t handle, unsigned coherent, unsigned nowait)
 {
 	STARPU_ASSERT(handle);
+	/* Prevent any further unregistration */
+	handle->magic = 0;
 	STARPU_ASSERT_MSG(handle->nchildren == 0, "data %p needs to be unpartitioned before unregistration", handle);
 	STARPU_ASSERT_MSG(handle->nplans == 0, "data %p needs its partition plans to be cleaned before unregistration", handle);
 	STARPU_ASSERT_MSG(handle->partitioned == 0, "data %p needs its partitioned plans to be unpartitioned before unregistration", handle);
@@ -870,6 +873,7 @@ retry_busy:
 
 void starpu_data_unregister(starpu_data_handle_t handle)
 {
+	STARPU_ASSERT_MSG(handle->magic == 42, "data %p is invalid (was it already registered?)", handle);
 	STARPU_ASSERT_MSG(!handle->lazy_unregister, "data %p can not be unregistered twice", handle);
 
 	if (handle->unregister_hook)
@@ -882,6 +886,7 @@ void starpu_data_unregister(starpu_data_handle_t handle)
 
 void starpu_data_unregister_no_coherency(starpu_data_handle_t handle)
 {
+	STARPU_ASSERT_MSG(handle->magic == 42, "data %p is invalid (was it already registered?)", handle);
 	if (handle->unregister_hook)
 	{
 		handle->unregister_hook(handle);
@@ -907,6 +912,7 @@ static void _starpu_data_unregister_submit_cb(void *arg)
 
 void starpu_data_unregister_submit(starpu_data_handle_t handle)
 {
+	STARPU_ASSERT_MSG(handle->magic == 42, "data %p is invalid (was it already registered?)", handle);
 	STARPU_ASSERT_MSG(!handle->lazy_unregister, "data %p can not be unregistered twice", handle);
 
 	if (handle->unregister_hook)