⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hipe_gc.c

📁 OTP是开放电信平台的简称
💻 C
📖 第 1 页 / 共 2 页
字号:
#ifdef HYBRID#ifdef INCREMENTALEterm *ma_fullsweep_nstack(Process *p, Eterm *n_htop, Eterm *n_hend){    /* known nstack walk state */    Eterm *nsp;    Eterm *nsp_end;    const struct sdesc *sdesc;    unsigned int sdesc_size;    unsigned long ra;    unsigned int i;    unsigned int mask;    /* arch-specific nstack walk state */    struct nstack_walk_state walk_state;    if( !nstack_walk_init_check(p) )	return n_htop;    nsp = nstack_walk_nsp_begin(p);    nsp_end = nstack_walk_nsp_end(p);    sdesc = nstack_walk_init_sdesc(p, &walk_state);    for(;;) {	if( nstack_walk_nsp_reached_end(nsp, nsp_end) ) {	    if( nsp == nsp_end ) {		return n_htop;	    }	    fprintf(stderr, "%s: passed end of stack\r\n", __FUNCTION__);	    break;	}	sdesc_size = nstack_walk_frame_size(sdesc);	i = 0;	mask = sdesc->livebits[0];	for(;;) {	    if( mask & 1 ) {		Eterm *nsp_i = nstack_walk_frame_index(nsp, i);		Eterm val = *nsp_i;                Eterm *obj_ptr = ptr_val(val);                switch (primary_tag(val)) {                    case TAG_PRIMARY_LIST:                        COPYMARK_CONS(obj_ptr,n_htop,nsp_i,n_hend); break;                    case TAG_PRIMARY_BOXED:                        COPYMARK_BOXED(obj_ptr,n_htop,nsp_i,n_hend); break;                    default: break;                }            }	    if( ++i >= sdesc_size )		break;	    if( i & 31 )		mask >>= 1;	    else		mask = sdesc->livebits[i >> 5];	}	ra = nstack_walk_frame_ra(nsp, sdesc);	if( ra == (unsigned long)nbif_stack_trap_ra )	    ra = (unsigned long)p->hipe.ngra;	sdesc = hipe_find_sdesc(ra);	nsp = nstack_walk_next_frame(nsp, sdesc_size);    }    abort();}void ma_gensweep_nstack(Process *p, Eterm **ptr_old_htop, Eterm **ptr_n_htop){    /* known nstack walk state */    Eterm *nsp;    Eterm *nsp_end;    const struct sdesc *sdesc;    unsigned int sdesc_size;    unsigned long ra;    unsigned int i;    unsigned int mask;    /* arch-specific nstack walk state */    struct nstack_walk_state walk_state;    /* ma_gensweep-specific state */    Eterm *low_water, *high_water, *surface;    Eterm *n_htop;    Eterm *old_htop;    if( !nstack_walk_init_check(p) )	return;    nsp = nstack_walk_nsp_begin(p);    nsp_end = nstack_walk_nsp_end(p);    low_water = global_heap;    //high_water = global_high_water;    surface = global_htop;    old_htop = *ptr_old_htop;    n_htop = *ptr_n_htop;    sdesc = nstack_walk_init_sdesc(p, &walk_state);    for(;;) {	if( nstack_walk_nsp_reached_end(nsp, nsp_end) ) {	    if( nsp == nsp_end ) {		*ptr_old_htop = old_htop;		*ptr_n_htop = n_htop;		return;	    }	    fprintf(stderr, "%s: passed end of stack\r\n", __FUNCTION__);	    break;	}	sdesc_size = nstack_walk_frame_size(sdesc);	i = 0;	mask = sdesc->livebits[0];	for(;;) {	    if( mask & 1 ) {		Eterm *nsp_i = nstack_walk_frame_index(nsp, i);		Eterm gval = *nsp_i;		if( is_boxed(gval) ) {		    Eterm *ptr = boxed_val(gval);		    Eterm val = *ptr;		    if( MY_IS_MOVED(val) ) {			*nsp_i = val;		    } else if (ptr_within(ptr,low_water,high_water)) {			MOVE_BOXED(ptr,val,old_htop,nsp_i);		    } else if (ptr_within(ptr,high_water,surface)) {			MOVE_BOXED(ptr,val,n_htop,nsp_i);		    }		} else if( is_list(gval) ) {		    Eterm *ptr = list_val(gval);		    Eterm val = *ptr;		    if( is_non_value(val) ) {			*nsp_i = ptr[1];		    } else if (ptr_within(ptr,low_water,high_water)) {			MOVE_CONS(ptr,val,old_htop,nsp_i);		    } else if (ptr_within(ptr,high_water,surface)) {			MOVE_CONS(ptr,val,n_htop,nsp_i);		    }		}	    }	    if( ++i >= sdesc_size )		break;	    if( i & 31 )		mask >>= 1;	    else		mask = sdesc->livebits[i >> 5];	}	ra = nstack_walk_frame_ra(nsp, sdesc);	if( ra == (unsigned long)nbif_stack_trap_ra )	    ra = (unsigned long)p->hipe.ngra;	sdesc = hipe_find_sdesc(ra);	nsp = nstack_walk_next_frame(nsp, sdesc_size);    }    abort();}#else /* not INCREMENTAL */Eterm *ma_fullsweep_nstack(Process *p, Eterm *n_htop){    /* known nstack walk state */    Eterm *nsp;    Eterm *nsp_end;    const struct sdesc *sdesc;    unsigned int sdesc_size;    unsigned long ra;    unsigned int i;    unsigned int mask;    /* arch-specific nstack walk state */    struct nstack_walk_state walk_state;    /* ma_fullsweep-specific state */    Eterm *gheap = global_heap;    Eterm *ghtop = global_htop;    Eterm *goheap = global_old_heap;    Eterm *gohtop = global_old_htop;    if( !nstack_walk_init_check(p) )	return n_htop;    nsp = nstack_walk_nsp_begin(p);    nsp_end = nstack_walk_nsp_end(p);    sdesc = nstack_walk_init_sdesc(p, &walk_state);    for(;;) {	if( nstack_walk_nsp_reached_end(nsp, nsp_end) ) {	    if( nsp == nsp_end ) {		return n_htop;	    }	    fprintf(stderr, "%s: passed end of stack\r\n", __FUNCTION__);	    break;	}	sdesc_size = nstack_walk_frame_size(sdesc);	i = 0;	mask = sdesc->livebits[0];	for(;;) {	    if( mask & 1 ) {		Eterm *nsp_i = nstack_walk_frame_index(nsp, i);		Eterm gval = *nsp_i;		if( is_boxed(gval) ) {		    Eterm *ptr = boxed_val(gval);		    Eterm val = *ptr;		    if( MY_IS_MOVED(val) ) {			*nsp_i = val;		    } else if (ptr_within(ptr, gheap, ghtop)) {			MOVE_BOXED(ptr,val,n_htop,nsp_i);		    } else if (ptr_within(ptr, goheap, gohtop)) {			MOVE_BOXED(ptr,val,n_htop,nsp_i);		    }		} else if( is_list(gval) ) {		    Eterm *ptr = list_val(gval);		    Eterm val = *ptr;		    if( is_non_value(val) ) {			*nsp_i = ptr[1];		    } else if (ptr_within(ptr, gheap, ghtop)) {			MOVE_CONS(ptr,val,n_htop,nsp_i);		    } else if (ptr_within(ptr, gheap, ghtop)) {			MOVE_CONS(ptr,val,n_htop,nsp_i);		    }		}	    }	    if( ++i >= sdesc_size )		break;	    if( i & 31 )		mask >>= 1;	    else		mask = sdesc->livebits[i >> 5];	}	ra = nstack_walk_frame_ra(nsp, sdesc);	if( ra == (unsigned long)nbif_stack_trap_ra )	    ra = (unsigned long)p->hipe.ngra;	sdesc = hipe_find_sdesc(ra);	nsp = nstack_walk_next_frame(nsp, sdesc_size);    }    abort();}void ma_gensweep_nstack(Process *p, Eterm **ptr_old_htop, Eterm **ptr_n_htop){    /* known nstack walk state */    Eterm *nsp;    Eterm *nsp_end;    const struct sdesc *sdesc;    unsigned int sdesc_size;    unsigned long ra;    unsigned int i;    unsigned int mask;    /* arch-specific nstack walk state */    struct nstack_walk_state walk_state;    /* ma_gensweep-specific state */    Eterm *low_water, *high_water, *surface;    Eterm *n_htop;    Eterm *old_htop;    if( !nstack_walk_init_check(p) )	return;    nsp = nstack_walk_nsp_begin(p);    nsp_end = nstack_walk_nsp_end(p);    low_water = global_heap;    high_water = global_high_water;    surface = global_htop;    old_htop = *ptr_old_htop;    n_htop = *ptr_n_htop;    sdesc = nstack_walk_init_sdesc(p, &walk_state);    for(;;) {	if( nstack_walk_nsp_reached_end(nsp, nsp_end) ) {	    if( nsp == nsp_end ) {		*ptr_old_htop = old_htop;		*ptr_n_htop = n_htop;		return;	    }	    fprintf(stderr, "%s: passed end of stack\r\n", __FUNCTION__);	    break;	}	sdesc_size = nstack_walk_frame_size(sdesc);	i = 0;	mask = sdesc->livebits[0];	for(;;) {	    if( mask & 1 ) {		Eterm *nsp_i = nstack_walk_frame_index(nsp, i);		Eterm gval = *nsp_i;		if( is_boxed(gval) ) {		    Eterm *ptr = boxed_val(gval);		    Eterm val = *ptr;		    if( MY_IS_MOVED(val) ) {			*nsp_i = val;		    } else if (ptr_within(ptr,low_water,high_water)) {			MOVE_BOXED(ptr,val,old_htop,nsp_i);		    } else if (ptr_within(ptr,high_water,surface)) {			MOVE_BOXED(ptr,val,n_htop,nsp_i);		    }		} else if( is_list(gval) ) {		    Eterm *ptr = list_val(gval);		    Eterm val = *ptr;		    if( is_non_value(val) ) {			*nsp_i = ptr[1];		    } else if (ptr_within(ptr,low_water,high_water)) {			MOVE_CONS(ptr,val,old_htop,nsp_i);		    } else if (ptr_within(ptr,high_water,surface)) {			MOVE_CONS(ptr,val,n_htop,nsp_i);		    }		}	    }	    if( ++i >= sdesc_size )		break;	    if( i & 31 )		mask >>= 1;	    else		mask = sdesc->livebits[i >> 5];	}	ra = nstack_walk_frame_ra(nsp, sdesc);	if( ra == (unsigned long)nbif_stack_trap_ra )	    ra = (unsigned long)p->hipe.ngra;	sdesc = hipe_find_sdesc(ra);	nsp = nstack_walk_next_frame(nsp, sdesc_size);    }    abort();}#endif /* INCREMENTAL */#endif /* HYBRID */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -