mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			77 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights
 | |
| // reserved. Use of this source code is governed by a BSD-style license that
 | |
| // can be found in the LICENSE file.
 | |
| 
 | |
| #include "libcef/common/tracker.h"
 | |
| 
 | |
| // CefTrackNode implementation.
 | |
| 
 | |
| CefTrackNode::CefTrackNode() : track_next_(NULL), track_prev_(NULL) {}
 | |
| 
 | |
| CefTrackNode::~CefTrackNode() {}
 | |
| 
 | |
| void CefTrackNode::InsertTrackPrev(CefTrackNode* object) {
 | |
|   if (track_prev_)
 | |
|     track_prev_->SetTrackNext(object);
 | |
|   object->SetTrackNext(this);
 | |
|   object->SetTrackPrev(track_prev_);
 | |
|   track_prev_ = object;
 | |
| }
 | |
| 
 | |
| void CefTrackNode::InsertTrackNext(CefTrackNode* object) {
 | |
|   if (track_next_)
 | |
|     track_next_->SetTrackPrev(object);
 | |
|   object->SetTrackPrev(this);
 | |
|   object->SetTrackNext(track_next_);
 | |
|   track_next_ = object;
 | |
| }
 | |
| 
 | |
| void CefTrackNode::RemoveTracking() {
 | |
|   if (track_next_)
 | |
|     track_next_->SetTrackPrev(track_prev_);
 | |
|   if (track_prev_)
 | |
|     track_prev_->SetTrackNext(track_next_);
 | |
|   track_next_ = NULL;
 | |
|   track_prev_ = NULL;
 | |
| }
 | |
| 
 | |
| // CefTrackManager implementation.
 | |
| 
 | |
| CefTrackManager::CefTrackManager() : object_count_(0) {}
 | |
| 
 | |
| CefTrackManager::~CefTrackManager() {
 | |
|   DeleteAll();
 | |
| }
 | |
| 
 | |
| void CefTrackManager::Add(CefTrackNode* object) {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   if (!object->IsTracked()) {
 | |
|     tracker_.InsertTrackNext(object);
 | |
|     ++object_count_;
 | |
|   }
 | |
| }
 | |
| 
 | |
| bool CefTrackManager::Delete(CefTrackNode* object) {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   if (object->IsTracked()) {
 | |
|     object->RemoveTracking();
 | |
|     delete object;
 | |
|     --object_count_;
 | |
|     return true;
 | |
|   }
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| void CefTrackManager::DeleteAll() {
 | |
|   base::AutoLock lock_scope(lock_);
 | |
|   CefTrackNode* next;
 | |
|   do {
 | |
|     next = tracker_.GetTrackNext();
 | |
|     if (next) {
 | |
|       next->RemoveTracking();
 | |
|       delete next;
 | |
|     }
 | |
|   } while (next != NULL);
 | |
|   object_count_ = 0;
 | |
| }
 |