// 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_(nullptr), track_prev_(nullptr) {} 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_ = nullptr; track_prev_ = nullptr; } // 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 != nullptr); object_count_ = 0; }