1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
use memory::page::Page;
use memory::stackbucket::StackBucket;

pub struct Region {
    pub page: *mut Page,
}

impl Region {
    pub fn create_from_page(page: *mut Page) -> Region {
        let our_page_address = StackBucket::new_page(page);
        //println!("our_page_address:{:X}", our_page_address as usize);
        Region {
            page: our_page_address,
        }
    }
    pub fn create(region: &Region) -> Region {
        Region::create_from_page(region.page)
    }

    pub fn new<T>(&mut self, object: T) -> *mut T {
        unsafe { (*self.page).allocate(object) }
    }

    pub fn allocate(&mut self, length: usize) -> *mut u8 {
        unsafe { (*self.page).allocate_raw(length, 1) }
    }
}

impl Drop for Region {
    fn drop(&mut self) {
        unsafe {
            (*self.page).deallocate_extensions();
        }
    }
}

// #[test]
// fn test_region() {
//     use memory::bucket::BUCKET_PAGES;
//     use memory::heap::Heap;
//     unsafe {
//         let mut heap = Heap::create();
//         let root_stack_bucket = StackBucket::create(&mut heap);
//         let mut r1 = Region::create_from_page(&*Page::get(root_stack_bucket as usize));
//         //println!("r1.page:{:X}", r1.page as *mut Page as usize);
//         let one = r1.new(1);
//         //println!("one:{:X}", one as *mut i32 as usize);
//         assert_eq!(*one, 1);
//         let two = r1.new(2);
//         //println!("two:{:X}", two as *mut i32 as usize);
//         assert_eq!(*two, 2);
//         {
//             let mut r2a = Region::create(&r1);
//             //println!("r2a.page:{:X}", r2a.page as *mut Page as usize);
//             let three = r2a.new(3);
//             //println!("three:{:X}", three as *mut i32 as usize);
//             assert_eq!(*three, 3);
//             let four = r2a.new(4);
//             //println!("four:{:X}", four as *mut i32 as usize);
//             assert_eq!(*four, 4);
//             assert_eq!(*three, 3);
//             let five = r2a.new(5);
//             //println!("five:{:X}", five as *mut i32 as usize);
//             assert_eq!(*five, 5);
//             assert_eq!(*four, 4);
//             assert_eq!(*three, 3);
//         }
//         {
//             let mut r2b = Region::create(&r1);
//             //println!("r2b.page:{:X}", r2b.page as *mut Page as usize);
//             let six = r2b.new(6);
//             //println!("six:{:X}", six as *mut i32 as usize);
//             assert_eq!(*six, 6);
//             let seven = r2b.new(7);
//             //println!("seven:{:X}", seven as *mut i32 as usize);
//             assert_eq!(*seven, 7);
//             assert_eq!(*six, 6);
//         }
//         // println!("one:{:X}", one as *mut i32 as usize);
//         // println!("one value: {}", *one);
//         assert_eq!(*one, 1);
//         assert_eq!(*two, 2);
//         // (*root_stack_bucket).deallocate();
//     }
//     unsafe {
//         use memory::heap::Heap;
//         let mut heap = Heap::create();
//         let root_stack_bucket = StackBucket::create(&mut heap);

//         let mut r = Region::create_from_page(&*Page::get(root_stack_bucket as usize));
//         for _ in 1..BUCKET_PAGES * 2 {
//             r = Region::create(&r);
//         }

//         //(*root_stack_bucket).deallocate();
//     }
// }