コード例 #1
0
ファイル: heap_bitmap.c プロジェクト: hsk/docs
SML_PRIMITIVE void
sml_write(void *objaddr, void **writeaddr, void *new_value)
{
	*writeaddr = new_value;
	if (!IS_IN_HEAP(writeaddr))
		sml_global_barrier(writeaddr, objaddr);
}
コード例 #2
0
ファイル: heap_cheney.c プロジェクト: eldesh/smlsharp
SML_PRIMITIVE void
sml_write(void *objaddr, void **writeaddr, void *new_value)
{
	*writeaddr = new_value;

	if (IS_IN_HEAP_SPACE(sml_heap_from_space, writeaddr))
		return;

	ASSERT(!IS_IN_HEAP_SPACE(sml_heap_to_space, writeaddr));
	ASSERT(!IS_IN_HEAP_SPACE(sml_heap_to_space, *writeaddr));

	/* remember the writeaddr as a root pointer which is outside
	 * of the heap. */
	sml_global_barrier(writeaddr, objaddr);
}
コード例 #3
0
ファイル: heap_boehm.c プロジェクト: smlsharp/smlsharp
SML_PRIMITIVE void
sml_write(void *obj, void **writeaddr, void *new_value)
{
    *writeaddr = new_value;
    sml_global_barrier(writeaddr, obj);
}
コード例 #4
0
ファイル: heap_otomo.c プロジェクト: hsk/docs
SML_PRIMITIVE void
sml_write(void *objaddr, void **writeaddr, void *new_value)
{
    *writeaddr = new_value;
#ifndef NOT_CLEAR_BITMAP
    if (IS_IN_HEAP_SPACE(writeaddr)) return;

    /* remember the writeaddr as a root pointer which is outside
     * of the heap. */
    sml_global_barrier(writeaddr, objaddr);

#else /* NOT_CLEAR_BITMAP */
    struct bitmap_info_space *b_info;
    unsigned int obj_size, alloc_size;
    unsigned int tmp,tmp_index;
    unsigned int *tmp_bitmap;
    void *obj = *writeaddr;

    if (!(IS_IN_HEAP_SPACE(writeaddr)))
        sml_global_barrier(writeaddr, objaddr);

#ifdef PRINT_ALLOC_TIME
    count_call_mark++;
#endif /* PRINT_ALLOC_TIME */

#define OUTSIDE(obj)  do{trace_outside(obj); return;}while(0)
    MAPPING_HEAP_MARK(obj,b_info,NULL,OUTSIDE);
#undef OUTSIDE

    //marked check and mark
    tmp = FROM_HEAP_TO_BITMAP(b_info,obj);
    tmp_index = tmp >> 5;
    tmp_bitmap = (unsigned int *)b_info->base + tmp_index;
    tmp = (unsigned int)0x01 << (tmp & 0x0000001f);

    if(*tmp_bitmap & tmp) {
        DBG(("%p at %p already marked", obj, NULL));
#ifdef PRINT_ALLOC_TIME
        count_not_mark++;
#endif /* PRINT_ALLOC_TIME */
        return;
    }

    *tmp_bitmap |= tmp; //mark

    //tree check
    unsigned int i;
    for(i=0; (*tmp_bitmap == 0xffffffff)&&(i < b_info->rank); i++) {
        tmp = ((unsigned int)0x01 << (tmp_index & 0x0000001f));
        tmp_index >>= 5;
        tmp_bitmap = (unsigned int *)b_info->tree[i] + tmp_index;
        *tmp_bitmap |= tmp;
    }

    DBG(("%p at %p mark (%"PRIuMAX", %"PRIuMAX")",
         obj, NULL, (intmax_t)obj_size, (intmax_t)alloc_size));

#ifdef PRINT_ALLOC_TIME
    print_info[b_info - bitmap_info].count_mark++;
    live_tmp += HEAP_ROUND_SIZE(OBJ_TOTAL_SIZE(obj));
#endif /* PRINT_ALLOC_TIME */

    /* STACK_PUSH */
    (*(marking_stack.top)) = obj;
    marking_stack.top++;
#endif /* NOT_CLEAR_BITMAP */

}