Home | History | Annotate | Download | only in common
      1 // Copyright (c) 2011 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 // This file contains the implementation of IdAllocator.
      6 
      7 #include "gpu/command_buffer/common/id_allocator.h"
      8 
      9 #include "base/logging.h"
     10 
     11 namespace gpu {
     12 
     13 IdAllocatorInterface::~IdAllocatorInterface() {
     14 }
     15 
     16 IdAllocator::IdAllocator() {}
     17 
     18 IdAllocator::~IdAllocator() {}
     19 
     20 ResourceId IdAllocator::AllocateID() {
     21   ResourceId id;
     22   ResourceIdSet::iterator iter = free_ids_.begin();
     23   if (iter != free_ids_.end()) {
     24     id = *iter;
     25   } else {
     26     id = LastUsedId() + 1;
     27     if (!id) {
     28       // We wrapped around to 0.
     29       id = FindFirstUnusedId();
     30     }
     31   }
     32   MarkAsUsed(id);
     33   return id;
     34 }
     35 
     36 ResourceId IdAllocator::AllocateIDAtOrAbove(ResourceId desired_id) {
     37   ResourceId id;
     38   ResourceIdSet::iterator iter = free_ids_.lower_bound(desired_id);
     39   if (iter != free_ids_.end()) {
     40     id = *iter;
     41   } else if (LastUsedId() < desired_id) {
     42     id = desired_id;
     43   } else {
     44     id = LastUsedId() + 1;
     45     if (!id) {
     46       // We wrapped around to 0.
     47       id = FindFirstUnusedId();
     48     }
     49   }
     50   MarkAsUsed(id);
     51   return id;
     52 }
     53 
     54 bool IdAllocator::MarkAsUsed(ResourceId id) {
     55   DCHECK(id);
     56   free_ids_.erase(id);
     57   std::pair<ResourceIdSet::iterator, bool> result = used_ids_.insert(id);
     58   return result.second;
     59 }
     60 
     61 void IdAllocator::FreeID(ResourceId id) {
     62   if (id) {
     63     used_ids_.erase(id);
     64     free_ids_.insert(id);
     65   }
     66 }
     67 
     68 bool IdAllocator::InUse(ResourceId id) const {
     69   return id == kInvalidResource || used_ids_.find(id) != used_ids_.end();
     70 }
     71 
     72 ResourceId IdAllocator::LastUsedId() const {
     73   if (used_ids_.empty()) {
     74     return 0u;
     75   } else {
     76     return *used_ids_.rbegin();
     77   }
     78 }
     79 
     80 ResourceId IdAllocator::FindFirstUnusedId() const {
     81   ResourceId id = 1;
     82   for (ResourceIdSet::const_iterator it = used_ids_.begin();
     83        it != used_ids_.end(); ++it) {
     84     if ((*it) != id) {
     85       return id;
     86     }
     87     ++id;
     88   }
     89   return id;
     90 }
     91 
     92 NonReusedIdAllocator::NonReusedIdAllocator() : last_id_(0) {
     93 }
     94 
     95 NonReusedIdAllocator::~NonReusedIdAllocator() {
     96 }
     97 
     98 ResourceId NonReusedIdAllocator::AllocateID() {
     99   return ++last_id_;
    100 }
    101 
    102 ResourceId NonReusedIdAllocator::AllocateIDAtOrAbove(ResourceId desired_id) {
    103   if (desired_id > last_id_)
    104     last_id_ = desired_id;
    105 
    106   return ++last_id_;
    107 }
    108 
    109 bool NonReusedIdAllocator::MarkAsUsed(ResourceId id) {
    110   NOTREACHED();
    111   return false;
    112 }
    113 
    114 void NonReusedIdAllocator::FreeID(ResourceId id) {
    115 }
    116 
    117 bool NonReusedIdAllocator::InUse(ResourceId id) const {
    118   NOTREACHED();
    119   return false;
    120 }
    121 
    122 }  // namespace gpu
    123