Toshihiro Shimizu 890ddd
#include "igs_resource_thread.h"
Toshihiro Shimizu 890ddd
#include "igs_resource_multithread.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#if defined _WIN32 // vc compile_type
Toshihiro Shimizu 890ddd
unsigned __stdcall
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
void *
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	function_(void *param)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	igs::resource::thread_execute_interface *pp =
Toshihiro Shimizu 890ddd
		static_cast<
Toshihiro Shimizu 890ddd
			igs::resource::thread_execute_interface *>(param);
Toshihiro Shimizu 890ddd
	pp->run();
Toshihiro Shimizu 890ddd
	return 0;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void igs::resource::multithread::add(void *thread_execute_instance)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	this->thre_exec_.push_back(thread_execute_instance);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void igs::resource::multithread::run(void)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (1 == this->thre_exec_.size()) {
Toshihiro Shimizu 890ddd
		/* 指定が一個の場合はスレッド実行せず、ただ実行 */
Toshihiro Shimizu 890ddd
		igs::resource::thread_execute_interface *pp =
Toshihiro Shimizu 890ddd
			static_cast<
Toshihiro Shimizu 890ddd
				igs::resource::thread_execute_interface *>(
Toshihiro Shimizu 890ddd
				this->thre_exec_.at(0));
Toshihiro Shimizu 890ddd
		pp->run();
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// pthread_t = unsigned long int(rhel4)
Toshihiro Shimizu 890ddd
// HANDLE = unsigned long(vc6.0) = void *(vc2005)
Toshihiro Shimizu 890ddd
#if defined _WIN32 // vc compile_type
Toshihiro Shimizu 890ddd
	std::vector<HANDLE> id;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	std::vector<pthread_t> id;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		std::vector<void *>::iterator it;
Toshihiro Shimizu 890ddd
		for (it = this->thre_exec_.begin();
Toshihiro Shimizu 890ddd
			 it != this->thre_exec_.end(); ++it) {
Toshihiro Shimizu 890ddd
			id.push_back(igs::resource::thread_run(function_, *it));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
#if defined _WIN32 // vc compile_type
Toshihiro Shimizu 890ddd
		std::vector<HANDLE>::iterator it;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
		std::vector<pthread_t>::iterator it;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
		for (it = id.begin(); it != id.end(); ++it) {
Toshihiro Shimizu 890ddd
			igs::resource::thread_join(*it);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	id.clear();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
void igs::resource::multithread::clear(void)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	this->thre_exec_.clear();
Toshihiro Shimizu 890ddd
}