Index: src/marking-thread.cc |
diff --git a/src/platform-posix.h b/src/marking-thread.cc |
similarity index 59% |
copy from src/platform-posix.h |
copy to src/marking-thread.cc |
index 7a982ed2ef3080dad77860d6f46b356a9067bf3b..b7127b24ba8d5f129ed44bad74c0c9962dd245ec 100644 |
--- a/src/platform-posix.h |
+++ b/src/marking-thread.cc |
@@ -25,15 +25,61 @@ |
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
-#ifndef V8_PLATFORM_POSIX_H_ |
-#define V8_PLATFORM_POSIX_H_ |
+#include "marking-thread.h" |
+ |
+#include "v8.h" |
+ |
+#include "isolate.h" |
+#include "v8threads.h" |
namespace v8 { |
namespace internal { |
-// Used by platform implementation files during OS::PostSetUp(). |
-void POSIXPostSetUp(); |
+MarkingThread::MarkingThread(Isolate* isolate) |
+ : Thread("MarkingThread"), |
+ isolate_(isolate), |
+ heap_(isolate->heap()), |
+ start_marking_semaphore_(OS::CreateSemaphore(0)), |
+ end_marking_semaphore_(OS::CreateSemaphore(0)), |
+ stop_semaphore_(OS::CreateSemaphore(0)) { |
+ NoBarrier_Store(&stop_thread_, static_cast<AtomicWord>(false)); |
+ id_ = NoBarrier_AtomicIncrement(&id_counter_, 1); |
+} |
-} } // namespace v8::internal |
-#endif // V8_PLATFORM_POSIX_H_ |
+Atomic32 MarkingThread::id_counter_ = -1; |
+ |
+ |
+void MarkingThread::Run() { |
+ Isolate::SetIsolateThreadLocals(isolate_, NULL); |
+ |
+ while (true) { |
+ start_marking_semaphore_->Wait(); |
+ |
+ if (Acquire_Load(&stop_thread_)) { |
+ stop_semaphore_->Signal(); |
+ return; |
+ } |
+ |
+ end_marking_semaphore_->Signal(); |
+ } |
+} |
+ |
+ |
+void MarkingThread::Stop() { |
+ Release_Store(&stop_thread_, static_cast<AtomicWord>(true)); |
+ start_marking_semaphore_->Signal(); |
+ stop_semaphore_->Wait(); |
+} |
+ |
+ |
+void MarkingThread::StartMarking() { |
+ start_marking_semaphore_->Signal(); |
+} |
+ |
+ |
+void MarkingThread::WaitForMarkingThread() { |
+ end_marking_semaphore_->Wait(); |
+} |
+ |
+} } // namespace v8::internal |