Browse Source

Liberate the memory allocated by the scheduling policies.

Cédric Augonnet 15 years ago
parent
commit
8fdf158814

+ 20 - 0
src/core/mechanisms/deque_queues.c

@@ -36,6 +36,14 @@ void _starpu_init_deque_queues_mechanisms(void)
 	sched_mutex = &sched->sched_activity_mutex;
 }
 
+void _starpu_deinit_deque_queues_mechanisms(void)
+{
+	struct starpu_sched_policy_s *sched = _starpu_get_sched_policy();
+
+	pthread_mutex_destroy(&sched->sched_activity_mutex);
+	pthread_cond_destroy(&sched->sched_activity_cond);
+}
+
 struct starpu_jobq_s *_starpu_create_deque(void)
 {
 	struct starpu_jobq_s *jobq;
@@ -61,6 +69,18 @@ struct starpu_jobq_s *_starpu_create_deque(void)
 	return jobq;
 }
 
+void _starpu_destroy_deque(struct starpu_jobq_s *jobq)
+{
+	struct starpu_deque_jobq_s *deque;
+
+	deque = jobq->queue;
+
+	starpu_job_list_delete(deque->jobq);
+	free(deque);
+
+	free(jobq);
+}
+
 unsigned _starpu_get_total_njobs_deques(void)
 {
 	return total_number_of_jobs;

+ 2 - 0
src/core/mechanisms/deque_queues.h

@@ -36,6 +36,7 @@ struct starpu_deque_jobq_s {
 };
 
 struct starpu_jobq_s *_starpu_create_deque(void);
+void _starpu_destroy_deque(struct starpu_jobq_s *jobq);
 
 int _starpu_deque_push_task(struct starpu_jobq_s *q, starpu_job_t task);
 int _starpu_deque_push_prio_task(struct starpu_jobq_s *q, starpu_job_t task);
@@ -43,6 +44,7 @@ int _starpu_deque_push_prio_task(struct starpu_jobq_s *q, starpu_job_t task);
 starpu_job_t _starpu_deque_pop_task(struct starpu_jobq_s *q);
 
 void _starpu_init_deque_queues_mechanisms(void);
+void _starpu_deinit_deque_queues_mechanisms(void);
 
 unsigned _starpu_get_total_njobs_deques(void);
 

+ 4 - 4
src/core/mechanisms/fifo_queues.c

@@ -36,6 +36,10 @@ void _starpu_init_fifo_queues_mechanisms(void)
 	sched_mutex = &sched->sched_activity_mutex;
 }
 
+void _starpu_deinit_fifo_queues_mechanisms(void)
+{
+}
+
 struct starpu_jobq_s *_starpu_create_fifo(void)
 {
 	struct starpu_jobq_s *jobq;
@@ -71,10 +75,6 @@ void _starpu_destroy_fifo(struct starpu_jobq_s *jobq)
 	starpu_job_list_delete(fifo->jobq);
 	free(fifo);
 
-	/* Then we liberate the generic resources associated to a jobq */
-	pthread_mutex_destroy(&jobq->activity_mutex);
-	pthread_cond_destroy(&jobq->activity_cond);
-
 	free(jobq);
 }
 

+ 1 - 0
src/core/mechanisms/fifo_queues.h

@@ -45,5 +45,6 @@ starpu_job_t _starpu_fifo_pop_task(struct starpu_jobq_s *q);
 struct starpu_job_list_s * _starpu_fifo_pop_every_task(struct starpu_jobq_s *q, uint32_t where);
 
 void _starpu_init_fifo_queues_mechanisms(void);
+void _starpu_deinit_fifo_queues_mechanisms(void);
 
 #endif // __FIFO_QUEUES_H__

+ 19 - 0
src/core/mechanisms/priority_queues.c

@@ -37,6 +37,10 @@ void _starpu_init_priority_queues_mechanisms(void)
 	sched_mutex = &sched->sched_activity_mutex;
 }
 
+void _starpu_deinit_priority_queues_mechanisms(void)
+{
+}
+
 struct starpu_jobq_s *_starpu_create_priority_jobq(void)
 {
 	struct starpu_jobq_s *q;
@@ -63,6 +67,21 @@ struct starpu_jobq_s *_starpu_create_priority_jobq(void)
 	return q;
 }
 
+void _starpu_destroy_priority_jobq(struct starpu_jobq_s *jobq)
+{
+	struct starpu_priority_jobq_s *central_queue;
+
+	central_queue = jobq->queue;
+
+	unsigned prio;
+	for (prio = 0; prio < NPRIO_LEVELS; prio++)
+		starpu_job_list_delete(central_queue->jobq[prio]);
+
+	free(central_queue);
+
+	free(jobq);
+}
+
 int _starpu_priority_push_task(struct starpu_jobq_s *q, starpu_job_t j)
 {
 	STARPU_ASSERT(q);

+ 3 - 0
src/core/mechanisms/priority_queues.h

@@ -33,7 +33,10 @@ struct starpu_priority_jobq_s {
 };
 
 struct starpu_jobq_s *_starpu_create_priority_jobq(void);
+void _starpu_destroy_priority_jobq(struct starpu_jobq_s *jobq);
+
 void _starpu_init_priority_queues_mechanisms(void);
+void _starpu_deinit_priority_queues_mechanisms(void);
 
 int _starpu_priority_push_task(struct starpu_jobq_s *q, starpu_job_t task);
 

+ 9 - 1
src/core/policies/deque-modeling-policy-data-aware.c

@@ -227,6 +227,14 @@ static void initialize_dmda_policy(struct starpu_machine_config_s *config,
 	_starpu_setup_queues(_starpu_init_fifo_queues_mechanisms, init_dmda_fifo, config);
 }
 
+static void deinitialize_dmda_policy(struct starpu_machine_config_s *config, 
+	 __attribute__ ((unused)) struct starpu_sched_policy_s *_policy) 
+{
+	_starpu_deinit_queues(NULL, _starpu_destroy_fifo, config);
+}
+
+
+
 static struct starpu_jobq_s *get_local_queue_dmda(struct starpu_sched_policy_s *policy __attribute__ ((unused)))
 {
 	struct starpu_jobq_s *queue;
@@ -243,7 +251,7 @@ static struct starpu_jobq_s *get_local_queue_dmda(struct starpu_sched_policy_s *
 
 struct starpu_sched_policy_s sched_dmda_policy = {
 	.init_sched = initialize_dmda_policy,
-	.deinit_sched = NULL,
+	.deinit_sched = deinitialize_dmda_policy,
 	._starpu_get_local_queue = get_local_queue_dmda,
 	.policy_name = "dmda",
 	.policy_description = "data-aware performance model"

+ 7 - 1
src/core/policies/deque-modeling-policy.c

@@ -185,6 +185,12 @@ static void initialize_dm_policy(struct starpu_machine_config_s *config,
 	_starpu_setup_queues(_starpu_init_fifo_queues_mechanisms, init_dm_fifo, config);
 }
 
+static void deinitialize_dm_policy(struct starpu_machine_config_s *config, 
+	 __attribute__ ((unused)) struct starpu_sched_policy_s *_policy) 
+{
+	_starpu_deinit_queues(NULL, _starpu_destroy_fifo, config);
+}
+
 static struct starpu_jobq_s *get_local_queue_dm(struct starpu_sched_policy_s *policy __attribute__ ((unused)))
 {
 	struct starpu_jobq_s *queue;
@@ -201,7 +207,7 @@ static struct starpu_jobq_s *get_local_queue_dm(struct starpu_sched_policy_s *po
 
 struct starpu_sched_policy_s sched_dm_policy = {
 	.init_sched = initialize_dm_policy,
-	.deinit_sched = NULL,
+	.deinit_sched = deinitialize_dm_policy,
 	._starpu_get_local_queue = get_local_queue_dm,
 	.policy_name = "dm",
 	.policy_description = "performance model"

+ 1 - 0
src/core/policies/deque-modeling-policy.h

@@ -20,6 +20,7 @@
 #include <core/workers.h>
 #include <core/mechanisms/queues.h>
 #include <core/mechanisms/fifo_queues.h>
+#include <core/mechanisms/deque_queues.h>
 
 extern struct starpu_sched_policy_s sched_dm_policy;
 

+ 1 - 0
src/core/policies/eager-central-policy.c

@@ -41,6 +41,7 @@ static void init_central_queue_design(void)
 static void deinit_central_queue_design(void)
 {
 	/* TODO check that there is no task left in the queue */
+	_starpu_deinit_fifo_queues_mechanisms();
 
 	/* deallocate the job queue */
 	_starpu_destroy_fifo(jobq);

+ 16 - 1
src/core/policies/eager-central-priority-policy.c

@@ -32,6 +32,15 @@ static void init_priority_queue_design(void)
 	jobq->_starpu_pop_task = _starpu_priority_pop_task;
 }
 
+static void deinit_priority_queue_design(void)
+{
+	/* TODO check that there is no task left in the queue */
+	_starpu_deinit_priority_queues_mechanisms();
+
+	/* deallocate the job queue */
+	_starpu_destroy_priority_jobq(jobq);
+}
+
 static struct starpu_jobq_s *func_init_priority_queue(void)
 {
 	return jobq;
@@ -43,6 +52,12 @@ static void initialize_eager_center_priority_policy(struct starpu_machine_config
 	_starpu_setup_queues(init_priority_queue_design, func_init_priority_queue, config);
 }
 
+static void deinitialize_eager_center_priority_policy(struct starpu_machine_config_s *config, 
+		   __attribute__ ((unused)) struct starpu_sched_policy_s *_policy) 
+{
+	_starpu_deinit_queues(deinit_priority_queue_design, NULL, config);
+}
+
 static struct starpu_jobq_s *get_local_queue_eager_priority(struct starpu_sched_policy_s *policy __attribute__ ((unused)))
 {
 	/* this is trivial for that strategy */
@@ -51,7 +66,7 @@ static struct starpu_jobq_s *get_local_queue_eager_priority(struct starpu_sched_
 
 struct starpu_sched_policy_s sched_prio_policy = {
 	.init_sched = initialize_eager_center_priority_policy,
-	.deinit_sched = NULL,
+	.deinit_sched = deinitialize_eager_center_priority_policy,
 	._starpu_get_local_queue = get_local_queue_eager_priority,
 	.policy_name = "prio",
 	.policy_description = "eager (with priorities)"