blob: 35f096a3b98b8117bdeb76103e49f46279730c17 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Xiao-Feng Li, 2006/10/05
*/
#ifndef _MSC_SPACE_H_
#define _MSC_SPACE_H_
#include "../thread/gc_thread.h"
/* Mark-compaction space is orgnized into blocks*/
typedef struct Mspace{
/* <-- first couple of fields are overloadded as Space */
void* heap_start;
void* heap_end;
POINTER_SIZE_INT reserved_heap_size;
POINTER_SIZE_INT committed_heap_size;
unsigned int num_collections;
int64 time_collections;
float survive_ratio;
unsigned int collect_algorithm;
GC* gc;
Boolean move_object;
Space_Statistics* space_statistic;
/* Size allocted since last minor collection. */
volatile uint64 last_alloced_size;
/* Size allocted since last major collection. */
uint64 accumu_alloced_size;
/* Total size allocated since VM starts. */
uint64 total_alloced_size;
/* Size survived from last collection. */
uint64 last_surviving_size;
/* Size survived after a certain period. */
uint64 period_surviving_size;
/* END of Space --> */
Block* blocks; /* short-cut for mpsace blockheader access, not mandatory */
/* FIXME:: the block indices should be replaced with block header addresses */
unsigned int first_block_idx;
unsigned int ceiling_block_idx;
volatile unsigned int free_block_idx;
unsigned int num_used_blocks;
unsigned int num_managed_blocks;
unsigned int num_total_blocks;
volatile Block_Header* block_iterator;
/* END of Blocked_Space --> */
/*Threshold computed by NOS adaptive*/
float expected_threshold_ratio;
}Mspace;
Mspace *mspace_initialize(GC* gc, void* reserved_base, POINTER_SIZE_INT mspace_size, POINTER_SIZE_INT commit_size);
void mspace_destruct(Mspace* mspace);
inline POINTER_SIZE_INT mspace_free_space_size(Mspace* mos)
{ return blocked_space_free_mem_size((Blocked_Space*)mos);}
inline POINTER_SIZE_INT mspace_used_space_size(Mspace* mos)
{ return blocked_space_used_mem_size((Blocked_Space*)mos);}
void* mspace_alloc(unsigned size, Allocator *allocator);
void mspace_collection(Mspace* mspace);
void mspace_reset_after_collection(Mspace* mspace);
void mspace_fix_after_copy_nursery(Collector* collector, Mspace* mspace);
void mspace_set_expected_threshold_ratio(Mspace* mspace, float threshold_ratio);
#endif //#ifdef _MSC_SPACE_H_