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); }
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); }
SML_PRIMITIVE void sml_write(void *obj, void **writeaddr, void *new_value) { *writeaddr = new_value; sml_global_barrier(writeaddr, obj); }
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 */ }