jitcraft/Zone.h
author David Anderson <dvander@alliedmods.net>
Mon Jun 25 02:57:28 2012 -0700 (2012-06-25)
changeset 0 c455ebb9a5dc
child 11 a350c2cc736a
permissions -rw-r--r--
Initial import of prototype.
     1 /*
     2  * Copyright (C) 2012 David Anderson
     3  *
     4  * This file is part of JITCraft.
     5  *
     6  * JITCraft is free software: you can redistribute it and/or modify it under
     7  * the terms of the GNU General Public License as published by the Free
     8  * Software Foundation, either version 3 of the License, or (at your option)
     9  * any later version.
    10  * 
    11  * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
    12  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
    13  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
    14  *
    15  * You should have received a copy of the GNU General Public License along with
    16  * JITCraft. If not, see http://www.gnu.org/licenses/.
    17  */
    18 #ifndef _include_jitcraft_thread_h_
    19 #define _include_jitcraft_thread_h_
    20 
    21 #include "PoolAllocator.h"
    22 #include "Stack.h"
    23 
    24 namespace jc {
    25 
    26 class Zone
    27 {
    28     PoolAllocator pool_;
    29     Stack stack_;
    30     UnsafeStack unsafeStack_;
    31 
    32   public:
    33     bool initialize();
    34 
    35     PoolAllocator &pool() {
    36         return pool_;
    37     }
    38     Stack &stack() {
    39         return stack_;
    40     }
    41     UnsafeStack &unsafeStack() {
    42         return unsafeStack_;
    43     }
    44 };
    45 
    46 // In a multi-threaded system, this would be a TLS variable.
    47 // In the interest of simplicity, we are single-threaded for now.
    48 extern Zone SingleThreadedZone;
    49 
    50 static inline Zone *ZONE()
    51 {
    52     return &SingleThreadedZone;
    53 }
    54 
    55 class LocalTop
    56 {
    57     Top *prev_;
    58     Top &mine_;
    59 
    60   public:
    61     LocalTop(Top &mine)
    62       : mine_(mine),
    63         prev_(ZONE()->stack().top())
    64     {
    65         ZONE()->stack().setTop(&mine_);
    66     }
    67 
    68     ~LocalTop()
    69     {
    70         ZONE()->stack().setTop(prev_);
    71     }
    72 };
    73 
    74 }
    75 
    76 #endif // _include_jitcraft_thread_h_