15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2008, Google Inc.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Redistribution and use in source and binary forms, with or without
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modification, are permitted provided that the following conditions are
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// met:
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Redistributions of source code must retain the above copyright
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notice, this list of conditions and the following disclaimer.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Redistributions in binary form must reproduce the above
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// copyright notice, this list of conditions and the following disclaimer
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the documentation and/or other materials provided with the
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distribution.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Neither the name of Google Inc. nor the names of its
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contributors may be used to endorse or promote products derived from
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this software without specific prior written permission.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ---
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: Sanjay Ghemawat <opensource@google.com>
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A Span is a contiguous run of pages.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef TCMALLOC_SPAN_H_
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TCMALLOC_SPAN_H_
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <config.h>
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "common.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tcmalloc {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Information kept for a span (a contiguous run of pages).
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Span {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PageID        start;          // Starting page number
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Length        length;         // Number of pages in span
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Span*         next;           // Used when in link list
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Span*         prev;           // Used when in link list
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void*         objects;        // Linked list of free objects
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned int  refcount : 16;  // Number of non-free objects
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned int  sizeclass : 8;  // Size-class for small objects (or 0)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned int  location : 2;   // Is the span on a freelist, and if so, which?
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned int  sample : 1;     // Sampled object?
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef SPAN_HISTORY
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SPAN_HISTORY
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For debugging, we can keep a log events per span
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nexthistory;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char history[64];
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int value[64];
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // What freelist the span is on: IN_USE if on none, or normal or returned
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum { IN_USE, ON_NORMAL_FREELIST, ON_RETURNED_FREELIST };
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SPAN_HISTORY
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Event(Span* span, char op, int v = 0);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define Event(s,o,v) ((void) 0)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Allocator/deallocator for spans
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Span* NewSpan(PageID p, Length len);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeleteSpan(Span* span);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -------------------------------------------------------------------------
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Doubly linked list of spans.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -------------------------------------------------------------------------
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Initialize *list to an empty list.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DLL_Init(Span* list);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Remove 'span' from the linked list in which it resides, updating the
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pointers of adjacent Spans and setting span's next and prev to NULL.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DLL_Remove(Span* span);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return true iff "list" is empty.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool DLL_IsEmpty(const Span* list) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return list->next == list;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Add span to the front of list.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DLL_Prepend(Span* list, Span* span);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return the length of the linked list. O(n)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int DLL_Length(const Span* list);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace tcmalloc
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // TCMALLOC_SPAN_H_
102