// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. #ifndef VM_OBJECT_ID_RING_H_ #define VM_OBJECT_ID_RING_H_ namespace dart { // Forward declarations. class RawObject; class Isolate; class ObjectPointerVisitor; // A ring buffer of object pointers that have been given an id. An object // may be pointed to by multiple ids. Objects contained in the ring will // be preserved across scavenges but not old space collections. // When the ring buffer wraps around older objects will be replaced and their // ids will be invalidated. class ObjectIdRing { public: static const int32_t kMaxId = 0x3FFFFFFF; static const int32_t kInvalidId = -1; static const int32_t kDefaultCapacity = 1024; static void Init(Isolate* isolate, int32_t capacity = kDefaultCapacity); ~ObjectIdRing(); int32_t GetIdForObject(RawObject* raw_obj); RawObject* GetObjectForId(int32_t id); void VisitPointers(ObjectPointerVisitor* visitor); private: friend class ObjectIdRingTestHelper; void SetCapacityAndMaxSerial(int32_t capacity, int32_t max_serial); ObjectIdRing(Isolate* isolate, int32_t capacity); Isolate* isolate_; RawObject** table_; int32_t max_serial_; int32_t capacity_; int32_t serial_num_; bool wrapped_; RawObject** table() { return table_; } int32_t table_size() { return capacity_; } int32_t NextSerial(); int32_t AllocateNewId(RawObject* object); int32_t IndexOfId(int32_t id); bool IsValidContiguous(int32_t id); bool IsValidId(int32_t id); DISALLOW_COPY_AND_ASSIGN(ObjectIdRing); }; } // namespace dart #endif // VM_OBJECT_ID_RING_H_