blob: 2372ee8b49feca1302cf837bf36e748704a6898e [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 _OBJECT_STATUS_H_
#define _OBJECT_STATUS_H_
#include "../gen/gen.h"
#include "../mark_sweep/gc_ms.h"
#include "../move_compact/gc_mc.h"
#include "../mark_sweep/wspace_mark_sweep.h"
inline Boolean obj_is_dead_in_gen_minor_gc(Partial_Reveal_Object *p_obj)
{
/*
* The first condition is for supporting switch between nongen and gen minor collection.
* With this kind of switch dead objects in MOS & LOS may be set the mark or fw bit in oi.
* The second condition is for supporting partially forwarding NOS.
* In partially forwarding situation live objects in the non-forwarding half NOS will only be marked but not forwarded.
* FIXME:: new implementation of partial forwarding does not use MARK_BIT for non-fw objects.
* so I changed the original obj_is_marked_or_fw_in_oi(p_obj) to obj_is_fw_in_oi(p_obj).
*/
return obj_belongs_to_nos(p_obj) && !obj_is_fw_in_oi(p_obj);
}
inline Boolean obj_is_dead_in_nongen_minor_gc(Partial_Reveal_Object *p_obj)
{
return (obj_belongs_to_nos(p_obj) && !obj_is_fw_in_oi(p_obj))
|| (!obj_belongs_to_nos(p_obj) && !obj_is_marked_in_oi(p_obj));
}
/* The caller must be in places where alloc color and mark color haven't been flipped */
inline Boolean obj_is_dead_in_sweep_major_gc(Partial_Reveal_Object *p_obj)
{
return (obj_belongs_to_nos(p_obj) && !obj_is_marked_in_vt(p_obj))
|| (!obj_belongs_to_nos(p_obj) && !obj_is_mark_black_in_table(p_obj));
}
inline Boolean obj_is_dead_in_compact_major_gc(Partial_Reveal_Object *p_obj)
{
return !obj_is_marked_in_vt(p_obj);
}
#ifdef USE_UNIQUE_MARK_SWEEP_GC
inline Boolean obj_is_dead_in_mark_sweep_gc(Partial_Reveal_Object *p_obj)
{
return !obj_is_mark_black_in_table(p_obj);
}
#endif
#ifdef USE_UNIQUE_MOVE_COMPACT_GC
inline Boolean obj_is_dead_in_move_compact_no_los_gc(Partial_Reveal_Object *p_obj)
{
return !obj_is_marked_in_vt(p_obj);
}
#endif
inline Boolean gc_obj_is_dead(GC *gc, Partial_Reveal_Object *p_obj)
{
assert(p_obj);
#ifdef USE_UNIQUE_MARK_SWEEP_GC
return obj_is_dead_in_mark_sweep_gc(p_obj);
#endif
#ifdef USE_UNIQUE_MOVE_COMPACT_GC
return obj_is_dead_in_move_compact_no_los_gc(p_obj);
#endif
if(collect_is_minor()){
if(gc_is_gen_mode())
return obj_is_dead_in_gen_minor_gc(p_obj);
else
return obj_is_dead_in_nongen_minor_gc(p_obj);
} else if(major_is_marksweep()){
return obj_is_dead_in_sweep_major_gc(p_obj);
} else {
return obj_is_dead_in_compact_major_gc(p_obj);
}
}
inline Boolean fspace_obj_to_be_forwarded(Partial_Reveal_Object *p_obj)
{
return forward_first_half ? (p_obj < object_forwarding_boundary) : (p_obj>=object_forwarding_boundary);
}
inline Boolean obj_need_move(GC *gc, Partial_Reveal_Object *p_obj)
{
/* assert(!gc_obj_is_dead(gc, p_obj)); commented out for weakroot */
#ifdef USE_UNIQUE_MARK_SWEEP_GC
Wspace *wspace = gc_ms_get_wspace((GC_MS*)gc);
return wspace->move_object;
#endif
#ifdef USE_UNIQUE_MOVE_COMPACT_GC
Cspace *cspace = gc_mc_get_cspace((GC_MC*)gc);
return cspace->move_object;
#endif
if(collect_is_minor()){
if(!obj_belongs_to_nos(p_obj)) return FALSE;
if(minor_is_semispace())
return TRUE;
else if(gc_is_gen_mode())
return fspace_obj_to_be_forwarded(p_obj);
}
Space *space = space_of_addr(gc, p_obj);
return space->move_object;
}
#endif /* _OBJECT_STATUS_H_ */