OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/trees/thread_proxy.h" | 5 #include "cc/trees/thread_proxy.h" |
6 | 6 |
| 7 #include <string> |
| 8 |
7 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
8 #include "base/bind.h" | 10 #include "base/bind.h" |
9 #include "base/debug/trace_event.h" | 11 #include "base/debug/trace_event.h" |
10 #include "cc/base/thread.h" | 12 #include "cc/base/thread.h" |
11 #include "cc/input/input_handler.h" | 13 #include "cc/input/input_handler.h" |
12 #include "cc/output/context_provider.h" | 14 #include "cc/output/context_provider.h" |
13 #include "cc/output/output_surface.h" | 15 #include "cc/output/output_surface.h" |
14 #include "cc/quads/draw_quad.h" | 16 #include "cc/quads/draw_quad.h" |
15 #include "cc/resources/prioritized_resource_manager.h" | 17 #include "cc/resources/prioritized_resource_manager.h" |
16 #include "cc/scheduler/delay_based_time_source.h" | 18 #include "cc/scheduler/delay_based_time_source.h" |
17 #include "cc/scheduler/frame_rate_controller.h" | 19 #include "cc/scheduler/frame_rate_controller.h" |
18 #include "cc/scheduler/scheduler.h" | 20 #include "cc/scheduler/scheduler.h" |
19 #include "cc/scheduler/vsync_time_source.h" | |
20 #include "cc/trees/layer_tree_host.h" | 21 #include "cc/trees/layer_tree_host.h" |
21 #include "cc/trees/layer_tree_impl.h" | 22 #include "cc/trees/layer_tree_impl.h" |
22 | 23 |
23 namespace { | 24 namespace { |
24 | 25 |
25 // Measured in seconds. | 26 // Measured in seconds. |
26 const double kContextRecreationTickRate = 0.03; | 27 const double kContextRecreationTickRate = 0.03; |
27 | 28 |
28 // Measured in seconds. | 29 // Measured in seconds. |
29 const double kSmoothnessTakesPriorityExpirationDelay = 0.25; | 30 const double kSmoothnessTakesPriorityExpirationDelay = 0.25; |
30 | 31 |
31 } // namespace | 32 } // namespace |
32 | 33 |
33 namespace cc { | 34 namespace cc { |
34 | 35 |
| 36 struct ThreadProxy::ReadbackRequest { |
| 37 CompletionEvent completion; |
| 38 bool success; |
| 39 void* pixels; |
| 40 gfx::Rect rect; |
| 41 }; |
| 42 |
| 43 struct ThreadProxy::CommitPendingRequest { |
| 44 CompletionEvent completion; |
| 45 bool commit_pending; |
| 46 }; |
| 47 |
| 48 struct ThreadProxy::SchedulerStateRequest { |
| 49 CompletionEvent completion; |
| 50 std::string state; |
| 51 }; |
| 52 |
35 scoped_ptr<Proxy> ThreadProxy::Create(LayerTreeHost* layer_tree_host, | 53 scoped_ptr<Proxy> ThreadProxy::Create(LayerTreeHost* layer_tree_host, |
36 scoped_ptr<Thread> impl_thread) { | 54 scoped_ptr<Thread> impl_thread) { |
37 return make_scoped_ptr( | 55 return make_scoped_ptr( |
38 new ThreadProxy(layer_tree_host, impl_thread.Pass())).PassAs<Proxy>(); | 56 new ThreadProxy(layer_tree_host, impl_thread.Pass())).PassAs<Proxy>(); |
39 } | 57 } |
40 | 58 |
41 ThreadProxy::ThreadProxy(LayerTreeHost* layer_tree_host, | 59 ThreadProxy::ThreadProxy(LayerTreeHost* layer_tree_host, |
42 scoped_ptr<Thread> impl_thread) | 60 scoped_ptr<Thread> impl_thread) |
43 : Proxy(impl_thread.Pass()), | 61 : Proxy(impl_thread.Pass()), |
44 animate_requested_(false), | 62 animate_requested_(false), |
(...skipping 12 matching lines...) Expand all Loading... |
57 commit_completion_event_on_impl_thread_(NULL), | 75 commit_completion_event_on_impl_thread_(NULL), |
58 completion_event_for_commit_held_on_tree_activation_(NULL), | 76 completion_event_for_commit_held_on_tree_activation_(NULL), |
59 texture_acquisition_completion_event_on_impl_thread_(NULL), | 77 texture_acquisition_completion_event_on_impl_thread_(NULL), |
60 next_frame_is_newly_committed_frame_on_impl_thread_(false), | 78 next_frame_is_newly_committed_frame_on_impl_thread_(false), |
61 throttle_frame_production_( | 79 throttle_frame_production_( |
62 layer_tree_host->settings().throttle_frame_production), | 80 layer_tree_host->settings().throttle_frame_production), |
63 begin_frame_scheduling_enabled_( | 81 begin_frame_scheduling_enabled_( |
64 layer_tree_host->settings().begin_frame_scheduling_enabled), | 82 layer_tree_host->settings().begin_frame_scheduling_enabled), |
65 using_synchronous_renderer_compositor_( | 83 using_synchronous_renderer_compositor_( |
66 layer_tree_host->settings().using_synchronous_renderer_compositor), | 84 layer_tree_host->settings().using_synchronous_renderer_compositor), |
67 vsync_client_(NULL), | |
68 inside_draw_(false), | 85 inside_draw_(false), |
69 defer_commits_(false), | 86 defer_commits_(false), |
70 renew_tree_priority_on_impl_thread_pending_(false) { | 87 renew_tree_priority_on_impl_thread_pending_(false) { |
71 TRACE_EVENT0("cc", "ThreadProxy::ThreadProxy"); | 88 TRACE_EVENT0("cc", "ThreadProxy::ThreadProxy"); |
72 DCHECK(IsMainThread()); | 89 DCHECK(IsMainThread()); |
73 DCHECK(layer_tree_host_); | 90 DCHECK(layer_tree_host_); |
74 } | 91 } |
75 | 92 |
76 ThreadProxy::~ThreadProxy() { | 93 ThreadProxy::~ThreadProxy() { |
77 TRACE_EVENT0("cc", "ThreadProxy::~ThreadProxy"); | 94 TRACE_EVENT0("cc", "ThreadProxy::~ThreadProxy"); |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 offscreen_context_provider() : NULL; | 338 offscreen_context_provider() : NULL; |
322 | 339 |
323 if (offscreen_contexts) | 340 if (offscreen_contexts) |
324 offscreen_contexts->VerifyContexts(); | 341 offscreen_contexts->VerifyContexts(); |
325 scheduler_on_impl_thread_->DidLoseOutputSurface(); | 342 scheduler_on_impl_thread_->DidLoseOutputSurface(); |
326 } | 343 } |
327 | 344 |
328 void ThreadProxy::OnSwapBuffersCompleteOnImplThread() { | 345 void ThreadProxy::OnSwapBuffersCompleteOnImplThread() { |
329 DCHECK(IsImplThread()); | 346 DCHECK(IsImplThread()); |
330 TRACE_EVENT0("cc", "ThreadProxy::OnSwapBuffersCompleteOnImplThread"); | 347 TRACE_EVENT0("cc", "ThreadProxy::OnSwapBuffersCompleteOnImplThread"); |
331 scheduler_on_impl_thread_->DidSwapBuffersComplete(); | |
332 Proxy::MainThread()->PostTask( | 348 Proxy::MainThread()->PostTask( |
333 base::Bind(&ThreadProxy::DidCompleteSwapBuffers, main_thread_weak_ptr_)); | 349 base::Bind(&ThreadProxy::DidCompleteSwapBuffers, main_thread_weak_ptr_)); |
334 } | 350 } |
335 | 351 |
336 void ThreadProxy::OnVSyncParametersChanged(base::TimeTicks timebase, | 352 void ThreadProxy::SetNeedsBeginFrameOnImplThread(bool enable) { |
337 base::TimeDelta interval) { | |
338 DCHECK(IsImplThread()); | 353 DCHECK(IsImplThread()); |
339 TRACE_EVENT2("cc", | 354 TRACE_EVENT1("cc", "ThreadProxy::SetNeedsBeginFrameOnImplThread", |
340 "ThreadProxy::OnVSyncParametersChanged", | 355 "enable", enable); |
341 "timebase", | 356 layer_tree_host_impl_->SetNeedsBeginFrame(enable); |
342 (timebase - base::TimeTicks()).InMilliseconds(), | |
343 "interval", | |
344 interval.InMilliseconds()); | |
345 scheduler_on_impl_thread_->SetTimebaseAndInterval(timebase, interval); | |
346 } | 357 } |
347 | 358 |
348 void ThreadProxy::BeginFrameOnImplThread(base::TimeTicks frame_time) { | 359 void ThreadProxy::BeginFrameOnImplThread(base::TimeTicks frame_time) { |
349 DCHECK(IsImplThread()); | 360 DCHECK(IsImplThread()); |
350 TRACE_EVENT0("cc", "ThreadProxy::OnBeginFrameOnImplThread"); | 361 TRACE_EVENT0("cc", "ThreadProxy::BeginFrameOnImplThread"); |
351 if (vsync_client_) | 362 scheduler_on_impl_thread_->BeginFrame(frame_time); |
352 vsync_client_->DidVSync(frame_time); | |
353 } | |
354 | |
355 void ThreadProxy::RequestVSyncNotification(VSyncClient* client) { | |
356 DCHECK(IsImplThread()); | |
357 TRACE_EVENT1( | |
358 "cc", "ThreadProxy::RequestVSyncNotification", "enable", !!client); | |
359 vsync_client_ = client; | |
360 layer_tree_host_impl_->SetNeedsBeginFrame(!!client); | |
361 } | 363 } |
362 | 364 |
363 void ThreadProxy::OnCanDrawStateChanged(bool can_draw) { | 365 void ThreadProxy::OnCanDrawStateChanged(bool can_draw) { |
364 DCHECK(IsImplThread()); | 366 DCHECK(IsImplThread()); |
365 TRACE_EVENT1( | 367 TRACE_EVENT1( |
366 "cc", "ThreadProxy::OnCanDrawStateChanged", "can_draw", can_draw); | 368 "cc", "ThreadProxy::OnCanDrawStateChanged", "can_draw", can_draw); |
367 scheduler_on_impl_thread_->SetCanDraw(can_draw); | 369 scheduler_on_impl_thread_->SetCanDraw(can_draw); |
368 layer_tree_host_impl_->UpdateBackgroundAnimateTicking( | 370 layer_tree_host_impl_->UpdateBackgroundAnimateTicking( |
369 !scheduler_on_impl_thread_->WillDrawIfNeeded()); | 371 !scheduler_on_impl_thread_->WillDrawIfNeeded()); |
370 } | 372 } |
(...skipping 732 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1103 DCHECK(IsImplThread()); | 1105 DCHECK(IsImplThread()); |
1104 *has_initialized_output_surface = | 1106 *has_initialized_output_surface = |
1105 scheduler_on_impl_thread_->HasInitializedOutputSurface(); | 1107 scheduler_on_impl_thread_->HasInitializedOutputSurface(); |
1106 completion->Signal(); | 1108 completion->Signal(); |
1107 } | 1109 } |
1108 | 1110 |
1109 void ThreadProxy::InitializeImplOnImplThread(CompletionEvent* completion) { | 1111 void ThreadProxy::InitializeImplOnImplThread(CompletionEvent* completion) { |
1110 TRACE_EVENT0("cc", "ThreadProxy::InitializeImplOnImplThread"); | 1112 TRACE_EVENT0("cc", "ThreadProxy::InitializeImplOnImplThread"); |
1111 DCHECK(IsImplThread()); | 1113 DCHECK(IsImplThread()); |
1112 layer_tree_host_impl_ = layer_tree_host_->CreateLayerTreeHostImpl(this); | 1114 layer_tree_host_impl_ = layer_tree_host_->CreateLayerTreeHostImpl(this); |
1113 const base::TimeDelta display_refresh_interval = | |
1114 base::TimeDelta::FromMicroseconds( | |
1115 base::Time::kMicrosecondsPerSecond / | |
1116 layer_tree_host_->settings().refresh_rate); | |
1117 scoped_ptr<FrameRateController> frame_rate_controller; | |
1118 if (throttle_frame_production_) { | |
1119 if (begin_frame_scheduling_enabled_) { | |
1120 frame_rate_controller.reset( | |
1121 new FrameRateController(VSyncTimeSource::Create( | |
1122 this, | |
1123 using_synchronous_renderer_compositor_ ? | |
1124 VSyncTimeSource::DISABLE_SYNCHRONOUSLY : | |
1125 VSyncTimeSource::DISABLE_ON_NEXT_TICK))); | |
1126 } else { | |
1127 frame_rate_controller.reset( | |
1128 new FrameRateController(DelayBasedTimeSource::Create( | |
1129 display_refresh_interval, Proxy::ImplThread()))); | |
1130 } | |
1131 } else { | |
1132 frame_rate_controller.reset(new FrameRateController(Proxy::ImplThread())); | |
1133 } | |
1134 const LayerTreeSettings& settings = layer_tree_host_->settings(); | 1115 const LayerTreeSettings& settings = layer_tree_host_->settings(); |
1135 SchedulerSettings scheduler_settings; | 1116 SchedulerSettings scheduler_settings; |
1136 scheduler_settings.impl_side_painting = settings.impl_side_painting; | 1117 scheduler_settings.impl_side_painting = settings.impl_side_painting; |
1137 scheduler_settings.timeout_and_draw_when_animation_checkerboards = | 1118 scheduler_settings.timeout_and_draw_when_animation_checkerboards = |
1138 settings.timeout_and_draw_when_animation_checkerboards; | 1119 settings.timeout_and_draw_when_animation_checkerboards; |
1139 scheduler_on_impl_thread_ = Scheduler::Create(this, | 1120 scheduler_settings.using_synchronous_renderer_compositor = |
1140 frame_rate_controller.Pass(), | 1121 settings.using_synchronous_renderer_compositor; |
1141 scheduler_settings); | 1122 scheduler_on_impl_thread_ = Scheduler::Create(this, scheduler_settings); |
1142 scheduler_on_impl_thread_->SetVisible(layer_tree_host_impl_->visible()); | 1123 scheduler_on_impl_thread_->SetVisible(layer_tree_host_impl_->visible()); |
1143 | 1124 |
1144 impl_thread_weak_ptr_ = weak_factory_on_impl_thread_.GetWeakPtr(); | 1125 impl_thread_weak_ptr_ = weak_factory_on_impl_thread_.GetWeakPtr(); |
1145 completion->Signal(); | 1126 completion->Signal(); |
1146 } | 1127 } |
1147 | 1128 |
1148 void ThreadProxy::InitializeOutputSurfaceOnImplThread( | 1129 void ThreadProxy::InitializeOutputSurfaceOnImplThread( |
1149 CompletionEvent* completion, | 1130 CompletionEvent* completion, |
1150 scoped_ptr<OutputSurface> output_surface, | 1131 scoped_ptr<OutputSurface> output_surface, |
1151 scoped_refptr<ContextProvider> offscreen_context_provider, | 1132 scoped_refptr<ContextProvider> offscreen_context_provider, |
1152 bool* success, | 1133 bool* success, |
1153 RendererCapabilities* capabilities) { | 1134 RendererCapabilities* capabilities) { |
1154 TRACE_EVENT0("cc", "ThreadProxy::InitializeOutputSurfaceOnImplThread"); | 1135 TRACE_EVENT0("cc", "ThreadProxy::InitializeOutputSurfaceOnImplThread"); |
1155 DCHECK(IsImplThread()); | 1136 DCHECK(IsImplThread()); |
1156 DCHECK(IsMainThreadBlocked()); | 1137 DCHECK(IsMainThreadBlocked()); |
1157 DCHECK(success); | 1138 DCHECK(success); |
1158 DCHECK(capabilities); | 1139 DCHECK(capabilities); |
1159 | 1140 |
1160 layer_tree_host_->DeleteContentsTexturesOnImplThread( | 1141 layer_tree_host_->DeleteContentsTexturesOnImplThread( |
1161 layer_tree_host_impl_->resource_provider()); | 1142 layer_tree_host_impl_->resource_provider()); |
1162 | 1143 |
1163 *success = layer_tree_host_impl_->InitializeRenderer(output_surface.Pass()); | 1144 *success = layer_tree_host_impl_->InitializeRenderer(output_surface.Pass()); |
1164 | 1145 |
1165 if (*success) { | 1146 if (*success) { |
1166 *capabilities = layer_tree_host_impl_->GetRendererCapabilities(); | 1147 *capabilities = layer_tree_host_impl_->GetRendererCapabilities(); |
1167 | |
1168 OutputSurface* output_surface_ptr = layer_tree_host_impl_->output_surface(); | |
1169 DCHECK(output_surface_ptr); | |
1170 int max_frames_pending = | |
1171 output_surface_ptr->capabilities().max_frames_pending; | |
1172 if (max_frames_pending <= 0) | |
1173 max_frames_pending = FrameRateController::DEFAULT_MAX_FRAMES_PENDING; | |
1174 | |
1175 scheduler_on_impl_thread_->SetMaxFramesPending(max_frames_pending); | |
1176 | |
1177 scheduler_on_impl_thread_->DidCreateAndInitializeOutputSurface(); | 1148 scheduler_on_impl_thread_->DidCreateAndInitializeOutputSurface(); |
1178 } | 1149 } |
1179 | 1150 |
1180 DidTryInitializeRendererOnImplThread(*success, offscreen_context_provider); | 1151 DidTryInitializeRendererOnImplThread(*success, offscreen_context_provider); |
1181 | 1152 |
1182 completion->Signal(); | 1153 completion->Signal(); |
1183 } | 1154 } |
1184 | 1155 |
1185 void ThreadProxy::DidTryInitializeRendererOnImplThread( | 1156 void ThreadProxy::DidTryInitializeRendererOnImplThread( |
1186 bool success, | 1157 bool success, |
(...skipping 24 matching lines...) Expand all Loading... |
1211 | 1182 |
1212 void ThreadProxy::LayerTreeHostClosedOnImplThread(CompletionEvent* completion) { | 1183 void ThreadProxy::LayerTreeHostClosedOnImplThread(CompletionEvent* completion) { |
1213 TRACE_EVENT0("cc", "ThreadProxy::LayerTreeHostClosedOnImplThread"); | 1184 TRACE_EVENT0("cc", "ThreadProxy::LayerTreeHostClosedOnImplThread"); |
1214 DCHECK(IsImplThread()); | 1185 DCHECK(IsImplThread()); |
1215 layer_tree_host_->DeleteContentsTexturesOnImplThread( | 1186 layer_tree_host_->DeleteContentsTexturesOnImplThread( |
1216 layer_tree_host_impl_->resource_provider()); | 1187 layer_tree_host_impl_->resource_provider()); |
1217 layer_tree_host_impl_->SetNeedsBeginFrame(false); | 1188 layer_tree_host_impl_->SetNeedsBeginFrame(false); |
1218 scheduler_on_impl_thread_.reset(); | 1189 scheduler_on_impl_thread_.reset(); |
1219 layer_tree_host_impl_.reset(); | 1190 layer_tree_host_impl_.reset(); |
1220 weak_factory_on_impl_thread_.InvalidateWeakPtrs(); | 1191 weak_factory_on_impl_thread_.InvalidateWeakPtrs(); |
1221 vsync_client_ = NULL; | |
1222 completion->Signal(); | 1192 completion->Signal(); |
1223 } | 1193 } |
1224 | 1194 |
1225 size_t ThreadProxy::MaxPartialTextureUpdates() const { | 1195 size_t ThreadProxy::MaxPartialTextureUpdates() const { |
1226 return ResourceUpdateController::MaxPartialTextureUpdates(); | 1196 return ResourceUpdateController::MaxPartialTextureUpdates(); |
1227 } | 1197 } |
1228 | 1198 |
1229 ThreadProxy::BeginFrameAndCommitState::BeginFrameAndCommitState() | 1199 ThreadProxy::BeginFrameAndCommitState::BeginFrameAndCommitState() |
1230 : memory_allocation_limit_bytes(0) {} | 1200 : memory_allocation_limit_bytes(0) {} |
1231 | 1201 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1271 void ThreadProxy::CommitPendingOnImplThreadForTesting( | 1241 void ThreadProxy::CommitPendingOnImplThreadForTesting( |
1272 CommitPendingRequest* request) { | 1242 CommitPendingRequest* request) { |
1273 DCHECK(IsImplThread()); | 1243 DCHECK(IsImplThread()); |
1274 if (layer_tree_host_impl_->output_surface()) | 1244 if (layer_tree_host_impl_->output_surface()) |
1275 request->commit_pending = scheduler_on_impl_thread_->CommitPending(); | 1245 request->commit_pending = scheduler_on_impl_thread_->CommitPending(); |
1276 else | 1246 else |
1277 request->commit_pending = false; | 1247 request->commit_pending = false; |
1278 request->completion.Signal(); | 1248 request->completion.Signal(); |
1279 } | 1249 } |
1280 | 1250 |
| 1251 std::string ThreadProxy::SchedulerStateAsStringForTesting() { |
| 1252 if (IsImplThread()) |
| 1253 return scheduler_on_impl_thread_->StateAsStringForTesting(); |
| 1254 |
| 1255 SchedulerStateRequest scheduler_state_request; |
| 1256 { |
| 1257 DebugScopedSetMainThreadBlocked main_thread_blocked(this); |
| 1258 Proxy::ImplThread()->PostTask( |
| 1259 base::Bind(&ThreadProxy::SchedulerStateAsStringOnImplThreadForTesting, |
| 1260 impl_thread_weak_ptr_, |
| 1261 &scheduler_state_request)); |
| 1262 scheduler_state_request.completion.Wait(); |
| 1263 } |
| 1264 return scheduler_state_request.state; |
| 1265 } |
| 1266 |
| 1267 void ThreadProxy::SchedulerStateAsStringOnImplThreadForTesting( |
| 1268 SchedulerStateRequest* request) { |
| 1269 DCHECK(IsImplThread()); |
| 1270 request->state = scheduler_on_impl_thread_->StateAsStringForTesting(); |
| 1271 request->completion.Signal(); |
| 1272 } |
| 1273 |
1281 skia::RefPtr<SkPicture> ThreadProxy::CapturePicture() { | 1274 skia::RefPtr<SkPicture> ThreadProxy::CapturePicture() { |
1282 DCHECK(IsMainThread()); | 1275 DCHECK(IsMainThread()); |
1283 CompletionEvent completion; | 1276 CompletionEvent completion; |
1284 skia::RefPtr<SkPicture> picture; | 1277 skia::RefPtr<SkPicture> picture; |
1285 { | 1278 { |
1286 DebugScopedSetMainThreadBlocked main_thread_blocked(this); | 1279 DebugScopedSetMainThreadBlocked main_thread_blocked(this); |
1287 Proxy::ImplThread()->PostTask( | 1280 Proxy::ImplThread()->PostTask( |
1288 base::Bind(&ThreadProxy::CapturePictureOnImplThread, | 1281 base::Bind(&ThreadProxy::CapturePictureOnImplThread, |
1289 impl_thread_weak_ptr_, | 1282 impl_thread_weak_ptr_, |
1290 &completion, | 1283 &completion, |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1383 !layer_tree_host_impl_->pending_tree()) { | 1376 !layer_tree_host_impl_->pending_tree()) { |
1384 TRACE_EVENT_INSTANT0("cc", "ReleaseCommitbyActivation", | 1377 TRACE_EVENT_INSTANT0("cc", "ReleaseCommitbyActivation", |
1385 TRACE_EVENT_SCOPE_THREAD); | 1378 TRACE_EVENT_SCOPE_THREAD); |
1386 DCHECK(layer_tree_host_impl_->settings().impl_side_painting); | 1379 DCHECK(layer_tree_host_impl_->settings().impl_side_painting); |
1387 completion_event_for_commit_held_on_tree_activation_->Signal(); | 1380 completion_event_for_commit_held_on_tree_activation_->Signal(); |
1388 completion_event_for_commit_held_on_tree_activation_ = NULL; | 1381 completion_event_for_commit_held_on_tree_activation_ = NULL; |
1389 } | 1382 } |
1390 } | 1383 } |
1391 | 1384 |
1392 } // namespace cc | 1385 } // namespace cc |
OLD | NEW |