function timeManagement
% Funzione per aggiornamento di tempi di vita e servizio dei task.
% Verifica ed implementa la terminazione ed il dropping dei task.


global pool X t Ts newOccurrence;

%% controllo fine task:
for n = 1 : length(X)   % per ogni agente:
    if isstruct(X(n).tsk)   % se e' in esecuzione un task:
        index = find([pool.ID]==X(n).tsk.ID); %indice nel pool
        X(n).tsk.Tserv = X(n).tsk.Tserv - Ts; %decrementa Tserv nell'agente
        if X(n).tsk.Tserv <= 0 %se il task e' concluso:
            message('Task completed:'); message(X(n).tsk);
            pool = [pool(1:index-1) pool(index+1:end)]; %elimina dal pool
            X(n).tsk = []; %elimina dall'agente
            newOccurrence = true;
        else %task vivo
            pool(index).Tserv = X(n).tsk.Tserv; %aggiorna Tserv nel pool
        end
    end
end

%% controllo dropping:
dropList = [];   % lista dei task da eliminare dal pool
for h = 1 : length(pool) %scorre il pool.
    %  se il task non e' di patroling e non e' in esecuzione
    if ~strcmp(pool(h).type,'pat') && pool(h).a == 0 &&...
                    (t-pool(h).Tocc) > pool(h).Tdrop  %ed e' scaduto il timeout:
        message('Task dropped:'); message(pool(h)); %task dropping
        dropList(end+1) = h-length(dropList); %aggiungi alla lista dei task da rimuovere
                                %nb: bisogna tener conto che il pool si
                                %riduce eliminando i task!
    end
end
for h = dropList
    pool = [pool(1:h-1) pool(h+1:end)]; %elimina il task dal pool
end