71 lines
1.7 KiB
C++
71 lines
1.7 KiB
C++
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
|
// file at the top-level directory of this distribution and at
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
// option. This file may not be copied, modified, or distributed
|
|
// except according to those terms.
|
|
|
|
|
|
#include "rust_thread.h"
|
|
|
|
const size_t default_stack_sz = 1024*1024;
|
|
|
|
rust_thread::rust_thread() : thread(0), stack_sz(default_stack_sz) {
|
|
}
|
|
|
|
rust_thread::rust_thread(size_t stack_sz)
|
|
: thread(0), stack_sz(stack_sz) {
|
|
}
|
|
|
|
rust_thread::~rust_thread() {
|
|
}
|
|
|
|
#if defined(__WIN32__)
|
|
static DWORD WINAPI
|
|
#elif defined(__GNUC__)
|
|
static void *
|
|
#else
|
|
#error "Platform not supported"
|
|
#endif
|
|
rust_thread_start(void *ptr) {
|
|
rust_thread *thread = (rust_thread *) ptr;
|
|
thread->run();
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
rust_thread::start() {
|
|
#if defined(__WIN32__)
|
|
thread = CreateThread(NULL, stack_sz, rust_thread_start, this, 0, NULL);
|
|
#else
|
|
pthread_attr_t attr;
|
|
CHECKED(pthread_attr_init(&attr));
|
|
CHECKED(pthread_attr_setstacksize(&attr, stack_sz));
|
|
CHECKED(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE));
|
|
CHECKED(pthread_create(&thread, &attr, rust_thread_start, (void *) this));
|
|
#endif
|
|
}
|
|
|
|
void
|
|
rust_thread::join() {
|
|
#if defined(__WIN32__)
|
|
if (thread)
|
|
WaitForSingleObject(thread, INFINITE);
|
|
#else
|
|
if (thread)
|
|
CHECKED(pthread_join(thread, NULL));
|
|
#endif
|
|
thread = 0;
|
|
}
|
|
|
|
void
|
|
rust_thread::detach() {
|
|
#if !defined(__WIN32__)
|
|
// Don't leak pthread resources.
|
|
// http://crosstantine.blogspot.com/2010/01/pthreadcreate-memory-leak.html
|
|
CHECKED(pthread_detach(thread));
|
|
#endif
|
|
}
|