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

📄 global.h

📁 OTP是开放电信平台的简称
💻 H
📖 第 1 页 / 共 4 页
字号:
        if (inc_active_last) {                                         \            inc_active_last->active_next = (p);                        \        } else {                                                       \            inc_active_proc = (p);                                     \        }                                                              \        inc_active_last = (p);                                         \        (p)->active = 1;                                               \    }                                                                  \} while(0);#define INC_DEACTIVATE(p) do {                                         \    ASSERT((p)->active == 1);                                          \    if ((p)->active_next == NULL) {                                    \        inc_active_last = (p)->active_prev;                            \    } else {                                                           \        (p)->active_next->active_prev = (p)->active_prev;              \    }                                                                  \    if ((p)->active_prev == NULL) {                                    \        inc_active_proc = (p)->active_next;                            \    } else {                                                           \        (p)->active_prev->active_next = (p)->active_next;              \    }                                                                  \    (p)->active = 0;                                                   \} while(0);#define INC_IS_ACTIVE(p)  ((p)->active != 0)#elseextern Eterm *global_old_htop;extern Eterm *global_high_water;#define ACTIVATE(p)   (p)->active = 1;#define DEACTIVATE(p) (p)->active = 0;#define IS_ACTIVE(p)  ((p)->active != 0)#define INC_ACTIVATE(p)#define INC_IS_ACTIVE(p) 1#endif /* INCREMENTAL */#else#  define ACTIVATE(p)#  define DEACTIVATE(p)#  define IS_ACTIVE(p) 1#  define INC_ACTIVATE(p)#endif /* HYBRID */#ifdef HYBRIDextern Uint global_heap_min_sz;#endifextern int bif_reductions;      /* reductions + fcalls (when doing call_bif) */extern int stackdump_on_exit;/* * Here is an implementation of a lightweiht stack. * * Use it like this: * * DECLARE_ESTACK(Stack)	(At the start of a block) * ... * ESTACK_PUSH(Stack, Term) * ... * if (ESTACK_ISEMPTY(Stack)) { *    Stack is empty * } else { *    Term = ESTACK_POP(Stack); *    Process popped Term here * } * ... * DESTROY_ESTACK(Stack) */ Eterm* erl_grow_stack(Eterm* ptr, size_t new_size);#define ESTK_CONCAT(a,b) a##b#define ESTK_SUBSCRIPT(s,i) *((Eterm *)((byte *)ESTK_CONCAT(s,_start) + (i)))#define DEF_ESTACK_SIZE (16*sizeof(Eterm))#define DECLARE_ESTACK(s)						\    Eterm ESTK_CONCAT(s,_default_stack)[DEF_ESTACK_SIZE/sizeof(Eterm)];	\    Eterm* ESTK_CONCAT(s,_start) = ESTK_CONCAT(s,_default_stack);	\    size_t ESTK_CONCAT(s,_sp) = 0;					\    size_t ESTK_CONCAT(s,_size) = DEF_ESTACK_SIZE#define DESTROY_ESTACK(s)						\do {									\    if (ESTK_CONCAT(s,_start) != ESTK_CONCAT(s,_default_stack)) {	\	erts_free(ERTS_ALC_T_ESTACK, ESTK_CONCAT(s,_start));		\    }									\} while(0)#define ESTACK_PUSH(s, x)							\do {										\    if (ESTK_CONCAT(s,_sp) == ESTK_CONCAT(s,_size)) {				\	ESTK_CONCAT(s,_size) *= 2;						\	ESTK_CONCAT(s,_start) =							\	    erl_grow_stack(ESTK_CONCAT(s,_start), ESTK_CONCAT(s,_size));	\    }										\    ESTK_SUBSCRIPT(s,ESTK_CONCAT(s,_sp)) = (x);					\    ESTK_CONCAT(s,_sp) += sizeof(Eterm);					\} while(0)#define ESTACK_ISEMPTY(s) (ESTK_CONCAT(s,_sp) == 0)#define ESTACK_POP(s)								\((ESTK_CONCAT(s,_sp) -= sizeof(Eterm)), ESTK_SUBSCRIPT(s,ESTK_CONCAT(s,_sp)))/* port status flags */#define ERTS_PORT_SFLG_CONNECTED	((Uint32) (1 <<  0))/* Port have begun exiting */#define ERTS_PORT_SFLG_EXITING		((Uint32) (1 <<  1))/* Distribution port */#define ERTS_PORT_SFLG_DISTRIBUTION	((Uint32) (1 <<  2))#define ERTS_PORT_SFLG_BINARY_IO	((Uint32) (1 <<  3))#define ERTS_PORT_SFLG_SOFT_EOF		((Uint32) (1 <<  4))/* Flow control */#define ERTS_PORT_SFLG_PORT_BUSY	((Uint32) (1 <<  5))/* Port is closing (no i/o accepted) */#define ERTS_PORT_SFLG_CLOSING		((Uint32) (1 <<  6))/* Send a closed message when terminating */#define ERTS_PORT_SFLG_SEND_CLOSED	((Uint32) (1 <<  7))/* Line orinted io on port */  #define ERTS_PORT_SFLG_LINEBUF_IO	((Uint32) (1 <<  8))/* Immortal port (only certain system ports) */#define ERTS_PORT_SFLG_IMMORTAL		((Uint32) (1 <<  9))#define ERTS_PORT_SFLG_FREE		((Uint32) (1 << 10))#define ERTS_PORT_SFLG_FREE_SCHEDULED	((Uint32) (1 << 11))#define ERTS_PORT_SFLG_INITIALIZING	((Uint32) (1 << 12))/* Port uses port specific locking (opposed to driver specific locking) */#define ERTS_PORT_SFLG_PORT_SPECIFIC_LOCK ((Uint32) (1 << 13))#define ERTS_PORT_SFLG_INVALID		((Uint32) (1 << 14))#ifdef DEBUG/* Only debug: make sure all flags aren't cleared unintentionally */#define ERTS_PORT_SFLG_PORT_DEBUG	((Uint32) (1 << 31))#endif/* Combinations of port status flags */ #define ERTS_PORT_SFLGS_DEAD						\  (ERTS_PORT_SFLG_FREE							\   | ERTS_PORT_SFLG_FREE_SCHEDULED					\   | ERTS_PORT_SFLG_INITIALIZING)#define ERTS_PORT_SFLGS_INVALID_DRIVER_LOOKUP				\  (ERTS_PORT_SFLGS_DEAD | ERTS_PORT_SFLG_INVALID)#define ERTS_PORT_SFLGS_INVALID_LOOKUP					\  (ERTS_PORT_SFLGS_INVALID_DRIVER_LOOKUP				\   | ERTS_PORT_SFLG_CLOSING)#define ERTS_PORT_SFLGS_INVALID_TRACER_LOOKUP				\  (ERTS_PORT_SFLGS_INVALID_LOOKUP					\   | ERTS_PORT_SFLG_PORT_BUSY						\   | ERTS_PORT_SFLG_DISTRIBUTION)/* binary.c */Eterm erts_new_heap_binary(Process *p, byte *buf, int len, byte** datap);Eterm new_binary(Process*, byte*, int);#if !defined(HEAP_FRAG_ELIM_TEST)Eterm new_binary_arith(Process*, byte*, int);#endifEterm erts_realloc_binary(Eterm bin, size_t size);void erts_cleanup_mso(ProcBin* pb);/* erl_bif_info.c */void erts_bif_info_init(void);/* bif.c */Eterm erts_make_ref(Process *);Eterm erts_make_ref_in_buffer(Eterm buffer[REF_THING_SIZE]);void erts_queue_monitor_message(Process *, Uint32*, Eterm, Eterm, Eterm, Eterm);void erts_init_bif(void);/* erl_bif_port.c *//* erl_bif_trace.c */void erts_system_monitor_clear(Process *c_p);void erts_do_pending_suspend(Process *c_p, Uint32 enter_locks);/* beam_load.c */int erts_load_module(Process *c_p, Uint32 c_p_locks,		     Eterm group_leader, Eterm* mod, byte* code, int size);void init_load(void);Eterm* find_function_from_pc(Eterm* pc);Eterm erts_module_info_0(Process* p, Eterm module);Eterm erts_module_info_1(Process* p, Eterm module, Eterm what);Eterm erts_make_stub_module(Process* p, Eterm Mod, Eterm Beam, Eterm Info);/* break.c */void init_break_handler(void);void erts_set_ignore_break(void);void erts_replace_intr(void);void process_info(int, void *);void print_process_info(int, void *, Process*);void info(int, void *);void loaded(int, void *);/* config.c */void __noreturn erl_exit(int n, char*, ...);void __noreturn erl_exit0(char *, int, int n, char*, ...);void erl_error(char*, va_list);#define ERL_EXIT0(n,f)		erl_exit0(__FILE__, __LINE__, n, f)#define ERL_EXIT1(n,f,a)	erl_exit0(__FILE__, __LINE__, n, f, a)#define ERL_EXIT2(n,f,a,b)	erl_exit0(__FILE__, __LINE__, n, f, a, b)#define ERL_EXIT3(n,f,a,b,c)	erl_exit0(__FILE__, __LINE__, n, f, a, b, c)/* copy.c */void init_copy(void);Eterm copy_object(Eterm, Process*);Uint size_object(Eterm);Eterm copy_struct(Eterm, Uint, Eterm**, ErlOffHeap*);Eterm copy_shallow(Eterm*, Uint, Eterm**, ErlOffHeap*);#ifdef HYBRID#define RRMA_DEFAULT_SIZE 256#define RRMA_STORE(p,ptr,src) do {                                      \  ASSERT((p)->rrma != NULL);                                            \  ASSERT((p)->rrsrc != NULL);                                           \  (p)->rrma[(p)->nrr] = (ptr);                                          \  (p)->rrsrc[(p)->nrr++] = (src);                                       \  if ((p)->nrr == (p)->rrsz)                                            \  {                                                                     \      ERTS_PROC_LESS_MEM(sizeof(Eterm) * (p)->rrsz * 2);                \      (p)->rrsz *= 2;                                                   \      ERTS_PROC_MORE_MEM(sizeof(Eterm) * (p)->rrsz * 2);                \      (p)->rrma = (Eterm *) erts_realloc(ERTS_ALC_T_ROOTSET,            \                                         (void*)(p)->rrma,              \                                         sizeof(Eterm) * (p)->rrsz);    \      (p)->rrsrc = (Eterm **) erts_realloc(ERTS_ALC_T_ROOTSET,          \                                           (void*)(p)->rrsrc,           \                                            sizeof(Eterm) * (p)->rrsz); \  }                                                                     \} while(0)/* Note that RRMA_REMOVE decreases the given index after deletion.  * This is done so that a loop with an increasing index can call * remove without having to decrease the index to see the element * placed in the hole after the deleted element. */#define RRMA_REMOVE(p,index) do {                                 \        p->rrsrc[index] = p->rrsrc[--p->nrr];                     \        p->rrma[index--] = p->rrma[p->nrr];                       \    } while(0);/* The MessageArea STACKs are used while copying messages to the * message area. */#define MA_STACK_EXTERNAL_DECLARE(type,_s_)     \    typedef type ma_##_s_##_type;               \    extern ma_##_s_##_type *ma_##_s_##_stack;   \    extern Uint ma_##_s_##_top;                 \    extern Uint ma_##_s_##_size;#define MA_STACK_DECLARE(_s_)                                           \    ma_##_s_##_type *ma_##_s_##_stack; Uint ma_##_s_##_top; Uint ma_##_s_##_size;#define MA_STACK_ALLOC(_s_) do {                                        \    ma_##_s_##_top = 0;                                                 \    ma_##_s_##_size = 512;                                              \    ma_##_s_##_stack = (ma_##_s_##_type*)erts_alloc(ERTS_ALC_T_OBJECT_STACK, \                       sizeof(ma_##_s_##_type) * ma_##_s_##_size);      \    ERTS_PROC_MORE_MEM(sizeof(ma_##_s_##_type) * ma_##_s_##_size);      \} while(0)#define MA_STACK_PUSH(_s_,val) do {                                     \    ma_##_s_##_stack[ma_##_s_##_top++] = (val);                         \    if (ma_##_s_##_top == ma_##_s_##_size)                              \    {                                                                   \        ERTS_PROC_LESS_MEM(sizeof(ma_##_s_##_type) * ma_##_s_##_size);  \        ma_##_s_##_size *= 2;                                           \        ERTS_PROC_MORE_MEM(sizeof(ma_##_s_##_type) * ma_##_s_##_size);  \        ma_##_s_##_stack =                                              \            (ma_##_s_##_type*) erts_realloc(ERTS_ALC_T_OBJECT_STACK,    \                                           (void*)ma_##_s_##_stack,     \                            sizeof(ma_##_s_##_type) * ma_##_s_##_size); \    }                                                                   \} while(0)#define MA_STACK_POP(_s_) (ma_##_s_##_top != 0 ? ma_##_s_##_stack[--ma_##_s_##_top] : 0)#define MA_STACK_TOP(_s_) (ma_##_s_##_stack[ma_##_s_##_top - 1])#define MA_STACK_UPDATE(_s_,offset,value)                               \  *(ma_##_s_##_stack[ma_##_s_##_top - 1] + (offset)) = (value)#define MA_STACK_SIZE(_s_) (ma_##_s_##_top)#define MA_STACK_ELM(_s_,i) ma_##_s_##_stack[i]MA_STACK_EXTERNAL_DECLARE(Eterm,src);MA_STACK_EXTERNAL_DECLARE(Eterm*,dst);MA_STACK_EXTERNAL_DECLARE(Uint,offset);#ifdef INCREMENTALextern Eterm *ma_pending_stack;extern Uint ma_pending_top;extern Uint ma_pending_size;#define NO_COPY(obj) (IS_CONST(obj) ||                         \                      (((ptr_val(obj) >= global_heap) &&       \                        (ptr_val(obj) < global_htop)) ||       \                       ((ptr_val(obj) >= inc_fromspc) &&       \                        (ptr_val(obj) < inc_fromend)) ||       \                       ((ptr_val(obj) >= global_old_heap) &&   \                        (ptr_val(obj) < global_old_hend))))#else#define NO_COPY(obj) (IS_CONST(obj) ||                        \                      (((ptr_val(obj) >= global_heap) &&      \                        (ptr_val(obj) < global_htop)) ||      \                       ((ptr_val(obj) >= global_old_heap) &&  \                        (ptr_val(obj) < global_old_hend))))#endif /* INCREMENTAL */#define LAZY_COPY(from,obj) do {                     \  if (!NO_COPY(obj)) {                               \      BM_LAZY_COPY_START;                            \      BM_COUNT(messages_copied);                     \      obj = copy_struct_lazy(from,obj,0);            \      BM_LAZY_COPY_STOP;                             \  }                                                  \} while(0)Eterm copy_struct_lazy(Process*, Eterm, Uint);#endif /* HYBRID *//* dist.c *//* More in dist.h *//* Atom cache */extern void clear_cache(DistEntry*);extern void create_cache(DistEntry*);extern void delete_cache(DistEntry*);/* Utilities */extern void erts_delete_nodes_monitors(Process *, Uint32);extern Eterm erts_monitor_nodes(Process *, Eterm, Eterm);extern Eterm erts_processes_monitoring_nodes(Process *);extern int erts_do_net_exits(DistEntry*, Eterm);extern int distribution_info(int, void *);extern int is_node_name_atom(Eterm a);extern int erts_net_message(Port *, DistEntry *, byte *, int, byte *, int);extern void init_dist(void);extern int stop_dist(void);void erl_progressf(char* format, ...);#ifdef MESS_DEBUGvoid print_pass_through(int, byte*, int);#endif/* beam_emu.c */int catchlevel(Process*);void init_emulator(_VOID_);void process_main(void);Eterm build_stacktrace(Process* c_p, Eterm exc);Eterm expand_error_value(Process* c_p, Uint freason, Eterm Value);/* erl_init.c */typedef struct {    Eterm delay_time;    int context_reds;    int input_reds;} ErtsModifiedTimings;extern Export *erts_delay_trap;extern int erts_modified_timing_level;extern ErtsModifiedTimings erts_modified_timings[];#define ERTS_USE_MODIFIED_TIMING() \  (erts_modified_timing_level >= 0)#define ERTS_MODIFIED_TIMING_DELAY \  (erts_modified_timings[erts_modified_timing_level].delay_time)#define ERTS_MODIFIED_TIMING_CONTEXT_REDS \  (erts_modified_timings[erts_modified_timing_level].context_reds)#define ERTS_MODIFIED_TIMING_INPUT_REDS \  (erts_modified_timings[erts_modified_timing_level].input_reds)extern Eterm erts_error_logger_warnings;extern int erts_initialized;extern int erts_compat_rel;void erts_short_init(void);void erl_start(int, char**);void erts_usage(void);Eterm erts_preloaded(Process* p);/* erl_md5.c */typedef struct {    Uint32 state[4];		/* state (ABCD) */    Uint32 count[2];		/* number of bits, modulo 2^64 (lsb first) */    unsigned char buffer[64];	/* input buffer */} MD5_CTX;void MD5Init(MD5_CTX *);void MD5Update(MD5_CTX *, unsigned char *, unsigned int);void MD5Final(unsigned char [16], MD5_CTX *);

⌨️ 快捷键说明

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