123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- #include "precomp_wasabi_bfc.h"
- #include "thread.h"
- #if !defined(WIN32) && !defined(LINUX)
- #error port me!
- #endif
- #pragma warning(push)
- #pragma warning(disable : 4229)
- THREADCALL Thread::ThreadProc(void *param) {
- Thread *th = static_cast<Thread*>(param);
- th->isrunning = true;
- int ret = th->threadProc();
- th->isrunning = false;
- return (THREADCALL)ret;
- }
- #pragma warning(pop)
- Thread::Thread(HANDLE _parent_handle) :
- isrunning(false),
- killswitch(0),
- handle(0), parent_handle(0), nicekill(1),
- auto_close_parent(FALSE)
- {
- setParentHandle(_parent_handle);
- #ifdef WIN32
- handle = CreateThread(NULL, 0, ThreadProc, (LPVOID)this, CREATE_SUSPENDED, &threadid);
- #endif
- }
- Thread::~Thread() {
- if (handle != 0) {
- if (isrunning) {
- setKillSwitch(TRUE);
- end();
- // FUCKO: might need to get rough here
- // FG> this serves no purpose, end() will not return unless the thread exits nicely
- #ifdef WIN32
- CloseHandle(handle);
- #elif defined(LINUX)
- pthread_kill(handle, SIGTERM);
- #endif
- }
- }
- setParentHandle(0);
- }
- int Thread::start() {
- if (running()) return 1;
- #ifdef WIN32
- return !(ResumeThread(handle) == 0xffffffff);
- #endif
- #ifdef LINUX
- pthread_create(&handle, NULL, ThreadProc, (LPVOID)this);
- return 1;
- #endif
- }
- bool Thread::running() {
- return isrunning;
- }
- int Thread::end() {
- while (running()) Sleep(66);
- return 1;
- }
- int Thread::kill() {
- #ifdef WIN32
- CloseHandle(handle);
- #elif defined(LINUX)
- pthread_kill(handle, SIGTERM);
- #endif
- handle = 0;
- isrunning = false;
- return 1;
- }
- void Thread::setKillSwitch(int k) {
- killswitch = k;
- }
- int Thread::getKillSwitch() {
- if (killswitch) return 1;
- if (parent_handle != 0 && !parentRunning()) return 1;
- return 0;
- }
- THREADID Thread::getThreadId() const {
- return threadid;
- }
- void Thread::setParentHandle(HANDLE _parent_handle, int _auto_close) {
- if (parent_handle != 0 && auto_close_parent) {
- #ifdef WIN32
- CloseHandle(parent_handle);
- #else
- //#error port me!
- DebugString("setParentHandle???\n");
- #endif
- }
- parent_handle = _parent_handle;
- auto_close_parent = _auto_close;
- }
- int Thread::parentRunning() {
- if (parent_handle == 0) return -1;
- #ifdef WIN32
- DWORD exitcode;
- int r = GetExitCodeThread(parent_handle, &exitcode);
- if (r == 0 || exitcode != STILL_ACTIVE) return 0;
- return 1;
- #else
- //#error port me!
- DebugString("parentRunning???\n");
- #endif
- }
- void Thread::setPriority(int priority) {
- Wasabi::Std::setThreadPriority(priority, handle);
- }
|