// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010  Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

//! component="System"

#ifndef header_thread
#define header_thread

class CL_Runnable
//: Thread callback interface.
// When a thread is created, it will call run() in its attached CL_Runnable interface.
{
public:
	virtual void run()=0;
	// Called when a thread is run.
};

class CL_Thread
{
public:
	static CL_Thread *create(CL_Runnable *runnable);
	// Create a thread that uses the CL_Runnable callback interface.
	//!param: runnable - Class to call when thread is started.

	static CL_Thread *create(int (*func)(void*), void* value);
	// Create a thread that calls the function specified, with the value specified.
	//!param: func - Function that gets called at thread start.
	//!param: value - Value passed to the function at thread start.
	
	virtual ~CL_Thread () {;}
	
	virtual void start()=0;
	// Starts the thread.

	virtual void terminate()=0;
	// Terminate the thread. (use with caution under win98)

	virtual void wait()=0;
	// Wait until the thread finishes its execution.
};

#endif