Chromium Code Reviews| Index: gpu/command_buffer/service/sync_point_manager.cc |
| diff --git a/gpu/command_buffer/service/sync_point_manager.cc b/gpu/command_buffer/service/sync_point_manager.cc |
| index cd8c49088b4e79405f3abe814db9b7da70525a9b..9a5137d2cb13dd7e6e6aa73e27cbb782462083e5 100644 |
| --- a/gpu/command_buffer/service/sync_point_manager.cc |
| +++ b/gpu/command_buffer/service/sync_point_manager.cc |
| @@ -13,17 +13,17 @@ namespace gpu { |
| static const int kMaxSyncBase = INT_MAX; |
| -SyncPointManager::SyncPointManager() |
| - : next_sync_point_(base::RandInt(1, kMaxSyncBase)) { |
| +ThreadedSyncPointManager::ThreadedSyncPointManager() |
| + : next_sync_point_(base::RandInt(1, kMaxSyncBase)), cond_var_(&lock_) { |
| // To reduce the risk that a sync point created in a previous GPU process |
| // will be in flight in the next GPU process, randomize the starting sync |
| // point number. http://crbug.com/373452 |
| } |
| -SyncPointManager::~SyncPointManager() { |
| +ThreadedSyncPointManager::~ThreadedSyncPointManager() { |
| } |
| -uint32 SyncPointManager::GenerateSyncPoint() { |
| +uint32 ThreadedSyncPointManager::GenerateSyncPoint() { |
| base::AutoLock lock(lock_); |
| uint32 sync_point = next_sync_point_++; |
| // When an integer overflow occurs, don't return 0. |
| @@ -40,27 +40,29 @@ uint32 SyncPointManager::GenerateSyncPoint() { |
| return sync_point; |
| } |
| -void SyncPointManager::RetireSyncPoint(uint32 sync_point) { |
| - DCHECK(thread_checker_.CalledOnValidThread()); |
| +void ThreadedSyncPointManager::RetireSyncPoint(uint32 sync_point) { |
| ClosureList list; |
| + base::AutoLock lock(lock_); |
| + SyncPointMap::iterator it = sync_point_map_.find(sync_point); |
| + if (it == sync_point_map_.end()) { |
| + LOG(ERROR) << "Attempted to retire sync point that" |
| + " didn't exist or was already retired."; |
| + return; |
| + } |
| + list.swap(it->second); |
| + sync_point_map_.erase(it); |
| + |
| { |
| - base::AutoLock lock(lock_); |
| - SyncPointMap::iterator it = sync_point_map_.find(sync_point); |
| - if (it == sync_point_map_.end()) { |
| - LOG(ERROR) << "Attempted to retire sync point that" |
| - " didn't exist or was already retired."; |
| - return; |
| - } |
| - list.swap(it->second); |
| - sync_point_map_.erase(it); |
| + base::AutoUnlock unlock(lock_); |
| + for (ClosureList::iterator i = list.begin(); i != list.end(); ++i) |
| + i->Run(); |
| } |
| - for (ClosureList::iterator i = list.begin(); i != list.end(); ++i) |
| - i->Run(); |
| + |
| + cond_var_.Broadcast(); |
|
no sievers
2015/01/27 21:26:39
Can we somehow avoid dealing with the cond. var/lo
no sievers
2015/01/27 21:26:39
Also, it'd be slightly better to call Broadcast()
|
| } |
| -void SyncPointManager::AddSyncPointCallback(uint32 sync_point, |
| +void ThreadedSyncPointManager::AddSyncPointCallback(uint32 sync_point, |
| const base::Closure& callback) { |
| - DCHECK(thread_checker_.CalledOnValidThread()); |
| { |
| base::AutoLock lock(lock_); |
| SyncPointMap::iterator it = sync_point_map_.find(sync_point); |
| @@ -72,13 +74,50 @@ void SyncPointManager::AddSyncPointCallback(uint32 sync_point, |
| callback.Run(); |
| } |
| -bool SyncPointManager::IsSyncPointRetired(uint32 sync_point) { |
| - DCHECK(thread_checker_.CalledOnValidThread()); |
| +bool ThreadedSyncPointManager::IsSyncPointRetired(uint32 sync_point) { |
| { |
| base::AutoLock lock(lock_); |
| - SyncPointMap::iterator it = sync_point_map_.find(sync_point); |
| - return it == sync_point_map_.end(); |
| + return IsSyncPointRetiredLocked(sync_point); |
| } |
| } |
| +void ThreadedSyncPointManager::WaitSyncPoint(uint32 sync_point) { |
| + base::AutoLock lock(lock_); |
| + while (!IsSyncPointRetiredLocked(sync_point)) { |
| + cond_var_.Wait(); |
| + } |
| +} |
| + |
| +bool ThreadedSyncPointManager::IsSyncPointRetiredLocked(uint32 sync_point) { |
| + lock_.AssertAcquired(); |
| + SyncPointMap::iterator it = sync_point_map_.find(sync_point); |
| + return it == sync_point_map_.end(); |
| +} |
| + |
| +SyncPointManager::SyncPointManager() { |
| +} |
| + |
| +SyncPointManager::~SyncPointManager() { |
| +} |
| + |
| +uint32 SyncPointManager::GenerateSyncPoint() { |
| + return threaded_sync_point_manager_.GenerateSyncPoint(); |
| +} |
| + |
| +void SyncPointManager::RetireSyncPoint(uint32 sync_point) { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + threaded_sync_point_manager_.RetireSyncPoint(sync_point); |
|
no sievers
2015/01/27 21:26:39
Since this only adds three DCHECKs(), can you eith
|
| +} |
| + |
| +void SyncPointManager::AddSyncPointCallback(uint32 sync_point, |
| + const base::Closure& callback) { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + threaded_sync_point_manager_.AddSyncPointCallback(sync_point, callback); |
| +} |
| + |
| +bool SyncPointManager::IsSyncPointRetired(uint32 sync_point) { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + return threaded_sync_point_manager_.IsSyncPointRetired(sync_point); |
| +} |
| + |
| } // namespace gpu |