/*
    PIP - Platform Independent Primitives
    Introspection module - implementation of threads
    Ivan Pelipenko peri4ko@yandex.ru

    This program 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 3 of the License, or
    (at your option) any later version.

    This program 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 for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "piintrospection_threads_p.h"


PIIntrospectionThreads::ThreadInfo::ThreadInfo() {
	id = delay = 0;
	state      = sStopped;
	priority   = 0;
	run_us = run_count = 0U;
}


PIIntrospectionThreads::PIIntrospectionThreads() {}


void PIIntrospectionThreads::threadNew(PIThread * t) {
	PIMutexLocker _ml(mutex);
	threads.insert(t, ThreadInfo());
}


void PIIntrospectionThreads::threadDelete(PIThread * t) {
	PIMutexLocker _ml(mutex);
	threads.remove(t);
}


void PIIntrospectionThreads::threadStart(PIThread * t) {
	PIMutexLocker _ml(mutex);
	ThreadInfo & ti(threads[t]);
	ti.id       = t->tid();
	ti.priority = t->priority();
	ti.delay    = t->delay_.toMilliseconds();
	ti.state    = sStarting;
}


void PIIntrospectionThreads::threadRun(PIThread * t) {
	PIMutexLocker _ml(mutex);
	ThreadInfo & ti(threads[t]);
	ti.state = sRunning;
	ti.run_count++;
}


void PIIntrospectionThreads::threadWait(PIThread * t) {
	PIMutexLocker _ml(mutex);
	threads[t].state = sWaiting;
}


void PIIntrospectionThreads::threadStop(PIThread * t) {
	PIMutexLocker _ml(mutex);
	threads[t].state = sStopped;
}


void PIIntrospectionThreads::threadRunDone(PIThread * t, ullong us) {
	PIMutexLocker _ml(mutex);
	ThreadInfo & ti(threads[t]);
	ti.run_us = (ti.run_us * 0.8) + (us * 0.2); /// WARNING
}
