📄 global.h
字号:
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 + -