blob: f9dca15c1063df82db20ca9038da99c2fc8f238a [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 _COLLECTOR_H_
#define _COLLECTOR_H_
#include "../common/gc_space.h"
struct Block_Header;
struct Stealable_Stack;
struct Chunk_Header;
struct Free_Chunk_List;
#define NORMAL_SIZE_SEGMENT_GRANULARITY_BITS 8
#define NORMAL_SIZE_SEGMENT_GRANULARITY (1 << NORMAL_SIZE_SEGMENT_GRANULARITY_BITS)
#define NORMAL_SIZE_SEGMENT_NUM (GC_LOS_OBJ_SIZE_THRESHOLD / NORMAL_SIZE_SEGMENT_GRANULARITY)
#define SIZE_TO_SEGMENT_INDEX(size) ((((size) + NORMAL_SIZE_SEGMENT_GRANULARITY-1) >> NORMAL_SIZE_SEGMENT_GRANULARITY_BITS) - 1)
#define SEGMENT_INDEX_TO_SIZE(index) (((index)+1) << NORMAL_SIZE_SEGMENT_GRANULARITY_BITS)
typedef struct Collector{
/* <-- first couple of fields are overloaded as Allocator */
void *free;
void *ceiling;
void *end;
void *alloc_block;
Chunk_Header ***local_chunks; /* this is for MARK-SWEEP GC */
Space* alloc_space;
GC* gc;
VmThreadHandle thread_handle; /* This thread; */
unsigned int handshake_signal; /*Handshake is used in concurrent GC.*/
unsigned int num_alloc_blocks; /* the number of allocated blocks in this collection. */
int64 time_measurement_start;
int64 time_measurement_end;
/* End of Allocator --> */
/* FIXME:: for testing */
Space* collect_space;
/* backup allocator in case there are two target copy spaces, such as semispace GC */
Allocator* backup_allocator;
Vector_Block *trace_stack;
Vector_Block* rep_set; /* repointed set */
Vector_Block* rem_set;
#ifdef USE_32BITS_HASHCODE
Vector_Block* hashcode_set;
#endif
Vector_Block *softref_set;
Vector_Block *weakref_set;
Vector_Block *phanref_set;
VmEventHandle task_assigned_event;
VmEventHandle task_finished_event;
Block_Header* cur_compact_block;
Block_Header* cur_target_block;
Free_Chunk_List *free_chunk_list;
POINTER_SIZE_INT live_obj_size;
POINTER_SIZE_INT live_obj_num;
void(*task_func)(void*) ; /* current task */
/* following three fields are to support LOS extension: to estimate MOS size */
POINTER_SIZE_INT non_los_live_obj_size;
POINTER_SIZE_INT los_live_obj_size;
POINTER_SIZE_INT segment_live_size[NORMAL_SIZE_SEGMENT_NUM];
unsigned int result;
Boolean collector_is_active;
/*for collect statistics info*/
#ifdef GC_GEN_STATS
void* stats;
#endif
}Collector;
void collector_destruct(GC* gc);
void collector_initialize(GC* gc);
void collector_reset(GC* gc);
void collector_execute_task(GC* gc, TaskType task_func, Space* space);
void collector_execute_task_concurrent(GC* gc, TaskType task_func, Space* space, unsigned int num_collectors);
void collector_release_weakref_sets(GC* gc, unsigned int num_collectors);
void collector_restore_obj_info(Collector* collector);
#ifdef USE_32BITS_HASHCODE
void collector_attach_hashcode(Collector *collector);
#endif
#ifndef USE_UNIQUE_MARK_SWEEP_GC
void gc_gen_hook_for_collector_init(Collector *collector);
#endif
Boolean is_collector_finished(GC* gc);
void wait_collection_finish(GC* gc);
int64 gc_get_collector_time(GC* gc);
inline Boolean gc_collection_result(GC* gc)
{
Boolean result = TRUE;
for(unsigned i=0; i<gc->num_active_collectors; i++){
Collector* collector = gc->collectors[i];
result &= collector->result;
}
return result;
}
inline void gc_reset_collect_result(GC* gc)
{
for(unsigned i=0; i<gc->num_active_collectors; i++){
Collector* collector = gc->collectors[i];
collector->result = TRUE;
}
gc->collect_result = TRUE;
return;
}
#endif //#ifndef _COLLECTOR_H_