/*
    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/>.
*/

#ifndef PIINTROSPECTION_THREADS_P_H
#define PIINTROSPECTION_THREADS_P_H

#include "pimap.h"
#include "pithread.h"


class PIP_EXPORT PIIntrospectionThreads {
public:
	PIIntrospectionThreads();

	enum ThreadState {
		sStopped = 1,
		sStarting,
		sRunning,
		sWaiting,
	};

	struct PIP_EXPORT ThreadInfo {
		ThreadInfo();
		PIString classname, name;
		int id, delay;
		ThreadState state;
		short priority;
		ullong run_us, run_count;
	};

	// clang-format off
	void threadNew    (PIThread * t);
	void threadDelete (PIThread * t);
	void threadStart  (PIThread * t);
	void threadRun    (PIThread * t);
	void threadWait   (PIThread * t);
	void threadStop   (PIThread * t);
	void threadRunDone(PIThread * t, ullong us);
	// clang-format on

	PIMap<PIThread *, ThreadInfo> threads;
	PIMutex mutex;
};


BINARY_STREAM_WRITE(PIIntrospectionThreads::ThreadInfo) {
	s << v.classname << v.name << v.id << v.state << v.priority << v.delay << v.run_us << v.run_count;
	return s;
}
BINARY_STREAM_READ(PIIntrospectionThreads::ThreadInfo) {
	s >> v.classname >> v.name >> v.id >> v.state >> v.priority >> v.delay >> v.run_us >> v.run_count;
	return s;
}

#endif // PIINTROSPECTION_THREADS_P_H
