aboutsummaryrefslogtreecommitdiff
path: root/src/rt/sync
diff options
context:
space:
mode:
authorMichael Bebenita <[email protected]>2010-09-07 18:05:42 -0700
committerMichael Bebenita <[email protected]>2010-09-07 18:41:07 -0700
commit9b74129a4f2d3edd4502dd263b54535aa67780a0 (patch)
treedaa65eaa3a178bd27e5a97d41be0b81774f7405d /src/rt/sync
parentMake run.py only search in the run-pass directory. (diff)
downloadrust-9b74129a4f2d3edd4502dd263b54535aa67780a0.tar.xz
rust-9b74129a4f2d3edd4502dd263b54535aa67780a0.zip
Added a thread utility class to factor out operations on threads.
Diffstat (limited to 'src/rt/sync')
-rw-r--r--src/rt/sync/sync.cpp43
-rw-r--r--src/rt/sync/sync.h21
2 files changed, 64 insertions, 0 deletions
diff --git a/src/rt/sync/sync.cpp b/src/rt/sync/sync.cpp
index 09a6f291..70e5077c 100644
--- a/src/rt/sync/sync.cpp
+++ b/src/rt/sync/sync.cpp
@@ -10,3 +10,46 @@ void sync::yield() {
pthread_yield();
#endif
}
+
+#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();
+ thread->thread = 0;
+ return 0;
+}
+
+void
+rust_thread::start() {
+#if defined(__WIN32__)
+ thread = CreateThread(NULL, 0, rust_thread_start, this, 0, NULL);
+#else
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setstacksize(&attr, 1024 * 1024);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
+ pthread_create(&thread, &attr, rust_thread_start, (void *) this);
+#endif
+}
+
+void
+rust_thread::join() {
+#if defined(__WIN32__)
+ WaitForSingleObject(thread, INFINITE);
+#else
+ pthread_join(thread, NULL);
+#endif
+ thread = 0;
+}
+
+bool
+rust_thread::is_running() {
+ // TODO: This may be broken because of possible races.
+ return thread;
+}
diff --git a/src/rt/sync/sync.h b/src/rt/sync/sync.h
index 8c9a13f0..562d2a1b 100644
--- a/src/rt/sync/sync.h
+++ b/src/rt/sync/sync.h
@@ -11,4 +11,25 @@ public:
}
};
+/**
+ * Thread utility class. Derive and implement your own run() method.
+ */
+class rust_thread {
+public:
+#if defined(__WIN32__)
+ HANDLE thread;
+#else
+ pthread_t thread;
+#endif
+ void start();
+
+ virtual void run() {
+ return;
+ }
+
+ void join();
+
+ bool is_running();
+};
+
#endif /* SYNC_H */