blob: 26ec35b17236e47dfae94cd79a1d260e6cc41322 [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.
*/
#ifndef _VERIFY_METADATA_H_
#define _VERIFY_METADATA_H_
#include "../common/gc_common.h"
#include "../utils/vector_block.h"
#include "../utils/sync_pool.h"
#define METADATA_SEGMENT_NUM 128
typedef volatile unsigned int SpinLock;
typedef Vector_Block* Vector_Block_Ptr;
typedef struct Heap_Verifier_Metadata{
void* segments[METADATA_SEGMENT_NUM];
unsigned int num_alloc_segs;
SpinLock alloc_lock;
Pool* free_set_pool;
Pool* free_task_pool;
Pool* root_set_pool;
Pool* mark_task_pool;
Pool* objects_pool_before_gc;
Pool* objects_pool_after_gc;
Pool* resurrect_objects_pool_before_gc;
Pool* resurrect_objects_pool_after_gc;
Pool* hashcode_pool_before_gc;
Pool* hashcode_pool_after_gc;
Pool* new_objects_pool;
Pool* obj_with_fin_pool;
Pool* finalizable_obj_pool;
} Heap_Verifier_Metadata;
extern Heap_Verifier_Metadata* verifier_metadata;
struct Heap_Verifier;
void gc_verifier_metadata_initialize(Heap_Verifier* heap_verifier);
void gc_verifier_metadata_destruct(Heap_Verifier* heap_verifier);
Vector_Block* gc_verifier_metadata_extend(Pool* pool, Boolean is_set_pool);
void verifier_clear_pool(Pool* working_pool, Pool* free_pool, Boolean is_vector_stack);
void verifier_remove_pool(Pool* working_pool, Pool* free_pool, Boolean is_vector_stack);
void verifier_copy_pool_reverse_order(Pool* dest_pool, Pool* source_pool);
void verifier_copy_pool(Pool* dest_pool, Pool* source_pool);
inline Vector_Block* verifier_free_set_pool_get_entry(Pool* free_pool)
{
assert(free_pool);
Vector_Block* block = pool_get_entry(free_pool);
while(!block)
block = gc_verifier_metadata_extend(free_pool, TRUE);
assert(vector_block_is_empty(block));
return block;
}
inline Vector_Block* verifier_free_task_pool_get_entry(Pool* free_pool)
{
assert(free_pool);
Vector_Block* block = pool_get_entry(free_pool);
while(!block)
block = gc_verifier_metadata_extend(free_pool, FALSE);
assert(vector_stack_is_empty(block));
return block;
}
inline void verifier_tracestack_push(void* p_task, Vector_Block_Ptr& trace_task)
{
vector_stack_push(trace_task, (POINTER_SIZE_INT)p_task);
if( !vector_stack_is_full(trace_task)) return;
pool_put_entry(verifier_metadata->mark_task_pool, trace_task);
trace_task = verifier_free_task_pool_get_entry(verifier_metadata->free_task_pool);
assert(trace_task);
}
inline void verifier_set_push(void* p_data, Vector_Block_Ptr& set_block, Pool* pool)
{
vector_block_add_entry(set_block, (POINTER_SIZE_INT)p_data);
if( !vector_block_is_full(set_block) ) return;
pool_put_entry(pool, set_block);
set_block = verifier_free_set_pool_get_entry(verifier_metadata->free_set_pool);
assert(set_block);
}
#endif //_VERIFY_METADATA_H_