| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- /* StarPU --- Runtime system for heterogeneous multicore architectures.
- *
- * Copyright (C) 2010-2013 INRIA
- *
- * StarPU is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or (at
- * your option) any later version.
- *
- * StarPU is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * See the GNU Lesser General Public License in COPYING.LGPL for more details.
- */
- #include "sc_hypervisor_policy.h"
- void sc_hypervisor_policy_add_task_to_pool(struct starpu_codelet *cl, unsigned sched_ctx, uint32_t footprint, struct sc_hypervisor_policy_task_pool **task_pools, size_t data_size)
- {
- struct sc_hypervisor_policy_task_pool *tp = NULL;
- for (tp = *task_pools; tp; tp = tp->next)
- {
- if (tp && tp->cl == cl && tp->footprint == footprint && tp->sched_ctx_id == sched_ctx)
- break;
- }
- if (!tp)
- {
- tp = (struct sc_hypervisor_policy_task_pool *) malloc(sizeof(struct sc_hypervisor_policy_task_pool));
- tp->cl = cl;
- tp->footprint = footprint;
- tp->sched_ctx_id = sched_ctx;
- tp->n = 0;
- tp->next = *task_pools;
- tp->data_size = data_size;
- *task_pools = tp;
- }
- /* One more task of this kind */
- tp->n++;
- }
- void sc_hypervisor_policy_remove_task_from_pool(struct starpu_task *task, uint32_t footprint, struct sc_hypervisor_policy_task_pool **task_pools)
- {
- /* count the tasks of the same type */
- struct sc_hypervisor_policy_task_pool *tp = NULL;
- for (tp = *task_pools; tp; tp = tp->next)
- {
- if (tp && tp->cl == task->cl && tp->footprint == footprint && tp->sched_ctx_id == task->sched_ctx)
- break;
- }
- if (tp)
- {
- if(tp->n > 1)
- tp->n--;
- else
- {
- if(tp == *task_pools)
- {
- struct sc_hypervisor_policy_task_pool *next_tp = NULL;
- if((*task_pools)->next)
- next_tp = (*task_pools)->next;
- free(tp);
- tp = NULL;
-
- *task_pools = next_tp;
-
- }
- else
- {
- struct sc_hypervisor_policy_task_pool *prev_tp = NULL;
- for (prev_tp = *task_pools; prev_tp; prev_tp = prev_tp->next)
- {
- if (prev_tp->next == tp)
- prev_tp->next = tp->next;
- }
-
- free(tp);
- tp = NULL;
- }
- }
- }
- }
- struct sc_hypervisor_policy_task_pool* sc_hypervisor_policy_clone_task_pool(struct sc_hypervisor_policy_task_pool *tp)
- {
- if(tp == NULL) return NULL;
- struct sc_hypervisor_policy_task_pool *tmp_tp = (struct sc_hypervisor_policy_task_pool*)malloc(sizeof(struct sc_hypervisor_policy_task_pool));
- memcpy(tmp_tp, tp, sizeof(struct sc_hypervisor_policy_task_pool));
- tmp_tp->next = sc_hypervisor_policy_clone_task_pool(tp->next);
- return tmp_tp;
- }
|