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

📄 global.h

📁 OTP是开放电信平台的简称
💻 H
📖 第 1 页 / 共 4 页
字号:
/* external.c */int erts_to_external_format(DistEntry*, Eterm, byte**, byte**, Uint *);Eterm erts_from_external_format(DistEntry*, Eterm**, byte**, ErlOffHeap*);Eterm encode_size_struct(Eterm, unsigned);int decode_size(byte*, int);/* ggc.c */typedef struct {    Uint garbage_collections;    Uint reclaimed;} ErtsGCInfo;void erts_gc_info(ErtsGCInfo *gcip);void erts_init_gc(void);int erts_garbage_collect(Process*, int, Eterm*, int);void erts_garbage_collect_hibernate(Process* p);#if defined(HEAP_FRAG_ELIM_TEST)Eterm erts_gc_after_bif_call(Process* p, Eterm result);void erts_garbage_collect_literals(Process* p, Eterm* literals, Uint lit_size);#endifUint erts_next_heap_size(Uint, Uint);Eterm erts_heap_sizes(Process* p);void erts_shrink_new_heap(Process *p, Uint new_sz, Eterm *objv, int nobj);void erts_offset_off_heap(ErlOffHeap *, Sint, Eterm*, Eterm*);void erts_offset_heap_ptr(Eterm*, Uint, Sint, Eterm*, Eterm*);void erts_offset_heap(Eterm*, Uint, Sint, Eterm*, Eterm*);#ifdef HYBRIDint erts_global_garbage_collect(Process*, int, Eterm*, int);#endif/* io.c */struct erl_drv_port_data_lock {    erts_mtx_t mtx;#ifdef ETHR_EXTENDED_LIB    ethr_atomic_t refc;#else    long refc;#endif};typedef struct {    char *name;    char *driver_name;} ErtsPortNames;void erts_add_driver_entry(ErlDrvEntry *drv, int driver_list_locked);void erts_wake_process_later(Port*, Process*);int erts_open_driver(ErlDrvEntry*, Eterm, char*, SysDriverOpts*, int *);void close_port(Eterm);void init_io(void);void cleanup_io(void);void erts_do_exit_port(Port *, Eterm, Eterm);void erts_port_command(Process *, Eterm, Port *, Eterm);Eterm erts_port_control(Process*, Port*, Uint, Eterm);int erts_write_to_port(Eterm caller_id, Port *p, Eterm list);void print_port_info(int, void *, int);void dist_port_command(Port*, byte*, int);void driver_report_exit(int, int);LineBuf* allocate_linebuf(int);int async_ready(Port *, void*);Sint erts_test_next_port(int, Uint);ErtsPortNames *erts_get_port_names(Eterm);void erts_free_port_names(ErtsPortNames *);Uint erts_port_ioq_size(Port *pp);void erts_stale_drv_select(Eterm, ErlDrvEvent, int, int);/* use erts_port_ready_input() instead of input_ready() */void input_ready(int, int) __deprecated;/* use erts_port_ready_input() instead of output_ready() */void output_ready(int, int) __deprecated;/* use erts_port_ready_event() instead of event_ready() */void event_ready(int, int, ErlDrvEventData) __deprecated;void erts_port_ready_input(Port *, ErlDrvEvent);void erts_port_ready_output(Port *, ErlDrvEvent);void erts_port_ready_event(Port *, ErlDrvEvent, ErlDrvEventData);void erts_port_cleanup(Port *);void erts_fire_port_monitor(Port *prt, Eterm ref);#ifdef ERTS_SMPvoid erts_smp_xports_unlock(Port *);#endif#ifdef ERTS_USE_PORT_TASKSvoid erts_port_ready_timeout(Port *p);#endif#if defined(ERTS_SMP) && defined(ERTS_ENABLE_LOCK_CHECK)int erts_lc_is_port_locked(Port *);#endifextern erts_smp_spinlock_t erts_port_tab_lock;ERTS_GLB_INLINE void erts_smp_port_tab_lock(void);ERTS_GLB_INLINE void erts_smp_port_tab_unlock(void);ERTS_GLB_INLINE int erts_smp_port_trylock(Port *prt);ERTS_GLB_INLINE void erts_smp_port_lock(Port *prt);ERTS_GLB_INLINE void erts_smp_port_unlock(Port *prt);#if ERTS_GLB_INLINE_INCL_FUNC_DEFERTS_GLB_INLINE voiderts_smp_port_tab_lock(void){    erts_smp_spin_lock(&erts_port_tab_lock);}ERTS_GLB_INLINE voiderts_smp_port_tab_unlock(void){    erts_smp_spin_unlock(&erts_port_tab_lock);}ERTS_GLB_INLINE interts_smp_port_trylock(Port *prt){#ifdef ERTS_SMP    int res;    ASSERT(erts_smp_atomic_read(&prt->refc) > 0);    erts_smp_atomic_inc(&prt->refc);    res = erts_smp_mtx_trylock(prt->lock);    if (res == EBUSY) {	erts_smp_atomic_dec(&prt->refc);    }    return res;#else /* !ERTS_SMP */    return 0;#endif}ERTS_GLB_INLINE voiderts_smp_port_lock(Port *prt){#ifdef ERTS_SMP    ASSERT(erts_smp_atomic_read(&prt->refc) > 0);    erts_smp_atomic_inc(&prt->refc);    erts_smp_mtx_lock(prt->lock);#endif}ERTS_GLB_INLINE voiderts_smp_port_unlock(Port *prt){#ifdef ERTS_SMP    long refc;    refc = erts_smp_atomic_dectest(&prt->refc);    ASSERT(refc >= 0);    if (refc == 0)	erts_port_cleanup(prt);    else	erts_smp_mtx_unlock(prt->lock);#endif}#endif /* #if ERTS_GLB_INLINE_INCL_FUNC_DEF */#define ERTS_INVALID_PORT_OPT(PP, ID, FLGS) \  (!(PP) || ((PP)->status & (FLGS)) || (PP)->id != (ID))/* port lookup */#define INVALID_PORT(PP, ID) \  ERTS_INVALID_PORT_OPT((PP), (ID), ERTS_PORT_SFLGS_INVALID_LOOKUP)/* Invalidate trace port if anything suspicious, for instance * that the port is a distribution port or it is busy. */#define INVALID_TRACER_PORT(PP, ID)					\  ERTS_INVALID_PORT_OPT((PP), (ID), ERTS_PORT_SFLGS_INVALID_TRACER_LOOKUP)#ifdef ERTS_SMPPort *erts_de2port(DistEntry *, Process *, Uint32);#endif#define erts_id2port(ID, P, PL) \  erts_id2port_sflgs((ID), (P), (PL), ERTS_PORT_SFLGS_INVALID_LOOKUP)ERTS_GLB_INLINE Port*erts_id2port_sflgs(Eterm, Process *, Uint32, Uint32);ERTS_GLB_INLINE void erts_port_release(Port *);ERTS_GLB_INLINE Port*erts_drvport2port(ErlDrvPort);ERTS_GLB_INLINE Port*erts_drvportid2port(Eterm);ERTS_GLB_INLINE Uint32 erts_portid2status(Eterm id);ERTS_GLB_INLINE int erts_is_port_alive(Eterm id);ERTS_GLB_INLINE int erts_is_valid_tracer_port(Eterm id);ERTS_GLB_INLINE void erts_dist_op_prepare(DistEntry *, Process *, Uint32);ERTS_GLB_INLINE void erts_dist_op_finalize(DistEntry *);ERTS_GLB_INLINE void erts_port_status_bandor_set(Port *, Uint32, Uint32);ERTS_GLB_INLINE void erts_port_status_band_set(Port *, Uint32);ERTS_GLB_INLINE void erts_port_status_bor_set(Port *, Uint32);ERTS_GLB_INLINE void erts_port_status_set(Port *, Uint32);ERTS_GLB_INLINE Uint32 erts_port_status_get(Port *);#if ERTS_GLB_INLINE_INCL_FUNC_DEFERTS_GLB_INLINE Port*erts_id2port_sflgs(Eterm id, Process *c_p, Uint32 c_p_locks, Uint32 sflgs){#ifdef ERTS_SMP    int no_proc_locks = !c_p || !c_p_locks;#endif    Port *prt;    int ix;    if (is_not_internal_port(id))	return NULL;    ix = internal_port_index(id);    erts_smp_port_tab_lock();    if (ERTS_INVALID_PORT_OPT(&erts_port[ix], id, sflgs)) {	prt = NULL;    }    else {#ifdef ERTS_SMP	erts_smp_atomic_inc(&erts_port[ix].refc);#endif	prt = &erts_port[ix];    }    erts_smp_port_tab_unlock();#ifdef ERTS_SMP    if (prt) {	if (no_proc_locks)	    erts_smp_mtx_lock(prt->lock);	else if (erts_smp_mtx_trylock(prt->lock) == EBUSY) {	    /* Unlock process locks, and acquire locks in lock order... */	    erts_smp_proc_unlock(c_p, c_p_locks);	    erts_smp_mtx_lock(prt->lock);	    erts_smp_proc_lock(c_p, c_p_locks);	}	/* The id may not have changed... */	ERTS_SMP_LC_ASSERT(prt->id == id);	/* ... but status may have... */	if (prt->status & sflgs) {	    erts_smp_port_unlock(prt); /* Also decrements refc... */	    prt = NULL;	}    }#endif    return prt;}ERTS_GLB_INLINE voiderts_port_release(Port *prt){#ifdef ERTS_SMP    erts_smp_port_unlock(prt);#else    if (prt->status & ERTS_PORT_SFLGS_DEAD)	erts_port_cleanup(prt);#endif}ERTS_GLB_INLINE Port*erts_drvport2port(ErlDrvPort drvport){    int ix = (int) drvport;    if (ix < 0 || erts_max_ports <= ix)	return NULL;    if (erts_port[ix].status & ERTS_PORT_SFLGS_INVALID_DRIVER_LOOKUP)	return NULL;    ERTS_SMP_LC_ASSERT(erts_lc_is_port_locked(&erts_port[ix]));    return &erts_port[ix];}ERTS_GLB_INLINE Port*erts_drvportid2port(Eterm id){    int ix;    if (is_not_internal_port(id))	return NULL;    ix = (int) internal_port_index(id);    if (erts_max_ports <= ix)	return NULL;    if (erts_port[ix].status & ERTS_PORT_SFLGS_INVALID_DRIVER_LOOKUP)	return NULL;    if (erts_port[ix].id != id)	return NULL;    ERTS_SMP_LC_ASSERT(erts_lc_is_port_locked(&erts_port[ix]));    return &erts_port[ix];}ERTS_GLB_INLINE Uint32erts_portid2status(Eterm id){    if (is_not_internal_port(id))	return ERTS_PORT_SFLG_INVALID;    else {	Uint32 status;	int ix = internal_port_index(id);	if (erts_max_ports <= ix)	    return ERTS_PORT_SFLG_INVALID;	erts_smp_port_tab_lock();	if (erts_port[ix].id == id)	    status = erts_port[ix].status;	else	    status = ERTS_PORT_SFLG_INVALID;	erts_smp_port_tab_unlock();	return status;    }}ERTS_GLB_INLINE interts_is_port_alive(Eterm id){    return !(erts_portid2status(id) & (ERTS_PORT_SFLG_INVALID				       | ERTS_PORT_SFLGS_DEAD));}ERTS_GLB_INLINE interts_is_valid_tracer_port(Eterm id){    return !(erts_portid2status(id) & ERTS_PORT_SFLGS_INVALID_TRACER_LOOKUP);}ERTS_GLB_INLINE voiderts_dist_op_prepare(DistEntry *dep, Process *proc, Uint32 proc_locks){    erts_smp_dist_entry_lock(dep);#ifdef ERTS_SMP    dep->port = erts_de2port(dep, proc, proc_locks);#else    dep->port = erts_id2port(dep->cid, NULL, 0);#endif}ERTS_GLB_INLINE voiderts_dist_op_finalize(DistEntry *dep){    if (dep->port) {	erts_port_release(dep->port);	dep->port = NULL;    }    erts_smp_dist_entry_unlock(dep);}ERTS_GLB_INLINE void erts_port_status_bandor_set(Port *prt,						 Uint32 band_status,						 Uint32 bor_status){    ERTS_SMP_LC_ASSERT(erts_lc_is_port_locked(prt));    erts_smp_port_tab_lock();    prt->status &= band_status;    prt->status |= bor_status;    erts_smp_port_tab_unlock();}ERTS_GLB_INLINE void erts_port_status_band_set(Port *prt, Uint32 status){    ERTS_SMP_LC_ASSERT(erts_lc_is_port_locked(prt));    erts_smp_port_tab_lock();    prt->status &= status;    erts_smp_port_tab_unlock();}ERTS_GLB_INLINE void erts_port_status_bor_set(Port *prt, Uint32 status){    ERTS_SMP_LC_ASSERT(erts_lc_is_port_locked(prt));    erts_smp_port_tab_lock();    prt->status |= status;    erts_smp_port_tab_unlock();}ERTS_GLB_INLINE void erts_port_status_set(Port *prt, Uint32 status){    ERTS_SMP_LC_ASSERT(erts_lc_is_port_locked(prt));    erts_smp_port_tab_lock();    prt->status = status;    erts_smp_port_tab_unlock();}ERTS_GLB_INLINE Uint32 erts_port_status_get(Port *prt){    Uint32 res;    erts_smp_port_tab_lock();    res = prt->status;    erts_smp_port_tab_unlock();    return res;}#endif /* #if ERTS_GLB_INLINE_INCL_FUNC_DEF *//* erl_obsolete.c */void erts_init_obsolete(void);/* time.c */ERTS_GLB_INLINE long do_time_read_and_reset(void);#ifdef ERTS_TIMER_THREAD

⌨️ 快捷键说明

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