| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 #include "regexp-stack.h" | 35 #include "regexp-stack.h" |
| 36 | 36 |
| 37 namespace v8 { | 37 namespace v8 { |
| 38 | 38 |
| 39 | 39 |
| 40 // Track whether this V8 instance has ever called v8::Locker. This allows the | 40 // Track whether this V8 instance has ever called v8::Locker. This allows the |
| 41 // API code to verify that the lock is always held when V8 is being entered. | 41 // API code to verify that the lock is always held when V8 is being entered. |
| 42 bool Locker::active_ = false; | 42 bool Locker::active_ = false; |
| 43 | 43 |
| 44 | 44 |
| 45 Locker::Locker() { | |
| 46 Initialize(i::Isolate::GetDefaultIsolateForLocking()); | |
| 47 } | |
| 48 | |
| 49 | |
| 50 // Once the Locker is initialized, the current thread will be guaranteed to have | 45 // Once the Locker is initialized, the current thread will be guaranteed to have |
| 51 // the lock for a given isolate. | 46 // the lock for a given isolate. |
| 52 void Locker::Initialize(v8::Isolate* isolate) { | 47 void Locker::Initialize(v8::Isolate* isolate) { |
| 53 ASSERT(isolate != NULL); | 48 ASSERT(isolate != NULL); |
| 54 has_lock_= false; | 49 has_lock_= false; |
| 55 top_level_ = true; | 50 top_level_ = true; |
| 56 isolate_ = reinterpret_cast<i::Isolate*>(isolate); | 51 isolate_ = reinterpret_cast<i::Isolate*>(isolate); |
| 57 // Record that the Locker has been used at least once. | 52 // Record that the Locker has been used at least once. |
| 58 active_ = true; | 53 active_ = true; |
| 59 // Get the big lock if necessary. | 54 // Get the big lock if necessary. |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 if (top_level_) { | 104 if (top_level_) { |
| 110 isolate_->thread_manager()->FreeThreadResources(); | 105 isolate_->thread_manager()->FreeThreadResources(); |
| 111 } else { | 106 } else { |
| 112 isolate_->thread_manager()->ArchiveThread(); | 107 isolate_->thread_manager()->ArchiveThread(); |
| 113 } | 108 } |
| 114 isolate_->thread_manager()->Unlock(); | 109 isolate_->thread_manager()->Unlock(); |
| 115 } | 110 } |
| 116 } | 111 } |
| 117 | 112 |
| 118 | 113 |
| 119 Unlocker::Unlocker() { | |
| 120 Initialize(i::Isolate::GetDefaultIsolateForLocking()); | |
| 121 } | |
| 122 | |
| 123 | |
| 124 void Unlocker::Initialize(v8::Isolate* isolate) { | 114 void Unlocker::Initialize(v8::Isolate* isolate) { |
| 125 ASSERT(isolate != NULL); | 115 ASSERT(isolate != NULL); |
| 126 isolate_ = reinterpret_cast<i::Isolate*>(isolate); | 116 isolate_ = reinterpret_cast<i::Isolate*>(isolate); |
| 127 ASSERT(isolate_->thread_manager()->IsLockedByCurrentThread()); | 117 ASSERT(isolate_->thread_manager()->IsLockedByCurrentThread()); |
| 128 if (isolate_->IsDefaultIsolate()) { | 118 if (isolate_->IsDefaultIsolate()) { |
| 129 isolate_->Exit(); | 119 isolate_->Exit(); |
| 130 } | 120 } |
| 131 isolate_->thread_manager()->ArchiveThread(); | 121 isolate_->thread_manager()->ArchiveThread(); |
| 132 isolate_->thread_manager()->Unlock(); | 122 isolate_->thread_manager()->Unlock(); |
| 133 } | 123 } |
| 134 | 124 |
| 135 | 125 |
| 136 Unlocker::~Unlocker() { | 126 Unlocker::~Unlocker() { |
| 137 ASSERT(!isolate_->thread_manager()->IsLockedByCurrentThread()); | 127 ASSERT(!isolate_->thread_manager()->IsLockedByCurrentThread()); |
| 138 isolate_->thread_manager()->Lock(); | 128 isolate_->thread_manager()->Lock(); |
| 139 isolate_->thread_manager()->RestoreThread(); | 129 isolate_->thread_manager()->RestoreThread(); |
| 140 if (isolate_->IsDefaultIsolate()) { | 130 if (isolate_->IsDefaultIsolate()) { |
| 141 isolate_->Enter(); | 131 isolate_->Enter(); |
| 142 } | 132 } |
| 143 } | 133 } |
| 144 | 134 |
| 145 | 135 |
| 146 void Locker::StartPreemption(int every_n_ms) { | 136 void Locker::StartPreemption(v8::Isolate* isolate, int every_n_ms) { |
| 147 v8::internal::ContextSwitcher::StartPreemption( | 137 v8::internal::ContextSwitcher::StartPreemption( |
| 148 i::Isolate::Current(), every_n_ms); | 138 reinterpret_cast<i::Isolate*>(isolate), every_n_ms); |
| 149 } | 139 } |
| 150 | 140 |
| 151 | 141 |
| 152 void Locker::StopPreemption() { | 142 void Locker::StopPreemption(v8::Isolate* isolate) { |
| 153 v8::internal::ContextSwitcher::StopPreemption(i::Isolate::Current()); | 143 v8::internal::ContextSwitcher::StopPreemption( |
| 144 reinterpret_cast<i::Isolate*>(isolate)); |
| 154 } | 145 } |
| 155 | 146 |
| 156 | 147 |
| 157 namespace internal { | 148 namespace internal { |
| 158 | 149 |
| 159 | 150 |
| 160 bool ThreadManager::RestoreThread() { | 151 bool ThreadManager::RestoreThread() { |
| 161 ASSERT(IsLockedByCurrentThread()); | 152 ASSERT(IsLockedByCurrentThread()); |
| 162 // First check whether the current thread has been 'lazily archived', i.e. | 153 // First check whether the current thread has been 'lazily archived', i.e. |
| 163 // not archived at all. If that is the case we put the state storage we | 154 // not archived at all. If that is the case we put the state storage we |
| (...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 481 | 472 |
| 482 // Acknowledge the preemption by the receiving thread. | 473 // Acknowledge the preemption by the receiving thread. |
| 483 void ContextSwitcher::PreemptionReceived() { | 474 void ContextSwitcher::PreemptionReceived() { |
| 484 // There is currently no accounting being done for this. But could be in the | 475 // There is currently no accounting being done for this. But could be in the |
| 485 // future, which is why we leave this in. | 476 // future, which is why we leave this in. |
| 486 } | 477 } |
| 487 | 478 |
| 488 | 479 |
| 489 } // namespace internal | 480 } // namespace internal |
| 490 } // namespace v8 | 481 } // namespace v8 |
| OLD | NEW |