1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CONTENT_COMMON_GPU_SYNC_POINT_MANAGER_H_ 6 #define CONTENT_COMMON_GPU_SYNC_POINT_MANAGER_H_ 7 8 #include <vector> 9 10 #include "base/callback.h" 11 #include "base/containers/hash_tables.h" 12 #include "base/memory/ref_counted.h" 13 #include "base/synchronization/lock.h" 14 #include "base/threading/thread_checker.h" 15 16 namespace content { 17 18 // This class manages the sync points, which allow cross-channel 19 // synchronization. 20 class SyncPointManager : public base::RefCountedThreadSafe<SyncPointManager> { 21 public: 22 SyncPointManager(); 23 24 // Generates a sync point, returning its ID. This can me called on any thread. 25 // IDs start at 1. 26 uint32 GenerateSyncPoint(); 27 28 // Retires a sync point. This will call all the registered callbacks for this 29 // sync point. This can only be called on the main thread. 30 void RetireSyncPoint(uint32 sync_point); 31 32 // Adds a callback to the sync point. The callback will be called when the 33 // sync point is retired, or immediately (from within that function) if the 34 // sync point was already retired (or not created yet). This can only be 35 // called on the main thread. 36 void AddSyncPointCallback(uint32 sync_point, const base::Closure& callback); 37 38 private: 39 friend class base::RefCountedThreadSafe<SyncPointManager>; 40 typedef std::vector<base::Closure> ClosureList; 41 typedef base::hash_map<uint32, ClosureList > SyncPointMap; 42 43 ~SyncPointManager(); 44 45 base::ThreadChecker thread_checker_; 46 47 // Protects the 2 fields below. Note: callbacks shouldn't be called with this 48 // held. 49 base::Lock lock_; 50 SyncPointMap sync_point_map_; 51 uint32 next_sync_point_; 52 53 DISALLOW_COPY_AND_ASSIGN(SyncPointManager); 54 }; 55 56 } // namespace content 57 58 #endif // CONTENT_COMMON_GPU_SYNC_POINT_MANAGER_H_ 59