📄 sys.h
字号:
# ifdef __WIN32__static unsigned long zero_value = 0, one_value = 1;# define SET_BLOCKING(fd) { if (ioctlsocket((fd), FIONBIO, &zero_value) != 0) fprintf(stderr, "Error setting socket to non-blocking: %d\n", WSAGetLastError()); }# define SET_NONBLOCKING(fd) ioctlsocket((fd), FIONBIO, &one_value)# else# ifdef VXWORKS# include <fcntl.h> /* xxxP added for O_WRONLY etc ... macro:s ... */# include <ioLib.h>static const int zero_value = 0, one_value = 1;# define SET_BLOCKING(fd) ioctl((fd), FIONBIO, (int)&zero_value)# define SET_NONBLOCKING(fd) ioctl((fd), FIONBIO, (int)&one_value)# define ERRNO_BLOCK EWOULDBLOCK# else# ifdef NB_FIONBIO /* Old BSD */# include <sys/ioctl.h> static const int zero_value = 0, one_value = 1;# define SET_BLOCKING(fd) ioctl((fd), FIONBIO, &zero_value)# define SET_NONBLOCKING(fd) ioctl((fd), FIONBIO, &one_value)# define ERRNO_BLOCK EWOULDBLOCK# else /* !NB_FIONBIO */# include <fcntl.h># ifdef NB_O_NDELAY /* Nothing needs this? */# define NB_FLAG O_NDELAY# ifndef ERRNO_BLOCK /* allow override (e.g. EAGAIN) via Makefile */# define ERRNO_BLOCK EWOULDBLOCK# endif# else /* !NB_O_NDELAY */ /* The True Way - POSIX!:-) */# define NB_FLAG O_NONBLOCK# define ERRNO_BLOCK EAGAIN# endif /* !NB_O_NDELAY */# define SET_BLOCKING(fd) fcntl((fd), F_SETFL, \ fcntl((fd), F_GETFL, 0) & ~NB_FLAG)# define SET_NONBLOCKING(fd) fcntl((fd), F_SETFL, \ fcntl((fd), F_GETFL, 0) | NB_FLAG)# endif /* !NB_FIONBIO */# endif /* _WXWORKS_ */# endif /* !__WIN32__ */# endif /* _OSE_ */#endif /* WANT_NONBLOCKING */void __noreturn erl_exit(int n, char*, ...);/* Some special erl_exit() codes: */#define ERTS_INTR_EXIT INT_MIN /* called from signal handler */#define ERTS_ABORT_EXIT (INT_MIN + 1) /* no crash dump; only abort() */#define ERTS_DUMP_EXIT (127) /* crash dump; then exit() */#ifndef ERTS_SMPEXTERN_FUNCTION(int, check_async_ready, (_VOID_));#ifdef USE_THREADSEXTERN_FUNCTION(void, sys_async_ready, (int hndl));#endif#endifEterm erts_check_io_info(void *p);/* Size of misc memory allocated from system dependent code */Uint erts_sys_misc_mem_sz(void);/* print stuff is declared here instead of in global.h, so sys stuff won't have to include global.h */#include "erl_printf.h"/* Io constants to erts_print and erts_putc */#define ERTS_PRINT_STDERR (2)#define ERTS_PRINT_STDOUT (1)#define ERTS_PRINT_INVALID (0) /* Don't want to use 0 since CBUF was 0 */#define ERTS_PRINT_FILE (-1)#define ERTS_PRINT_SBUF (-2)#define ERTS_PRINT_SNBUF (-3)#define ERTS_PRINT_DSBUF (-4)#define ERTS_PRINT_MIN ERTS_PRINT_DSBUFtypedef struct { char *buf; size_t size;} erts_print_sn_buf;int erts_print(int to, void *arg, char *format, ...); /* in utils.c */int erts_putc(int to, void *arg, char); /* in utils.c *//* logger stuff is declared here instead of in global.h, so sys files won't have to include global.h */erts_dsprintf_buf_t *erts_create_logger_dsbuf(void);int erts_send_info_to_logger(Eterm, erts_dsprintf_buf_t *);int erts_send_warning_to_logger(Eterm, erts_dsprintf_buf_t *);int erts_send_error_to_logger(Eterm, erts_dsprintf_buf_t *);int erts_send_info_to_logger_str(Eterm, char *); int erts_send_warning_to_logger_str(Eterm, char *);int erts_send_error_to_logger_str(Eterm, char *);int erts_send_info_to_logger_nogl(erts_dsprintf_buf_t *);int erts_send_warning_to_logger_nogl(erts_dsprintf_buf_t *);int erts_send_error_to_logger_nogl(erts_dsprintf_buf_t *);int erts_send_info_to_logger_str_nogl(char *);int erts_send_warning_to_logger_str_nogl(char *);int erts_send_error_to_logger_str_nogl(char *);typedef struct preload { char *name; /* Name of module */ int size; /* Size of code */ unsigned char* code; /* Code pointer */} Preload;/* * This structure contains options to all built in drivers. * None of the drivers use all of the fields. *//* OSE: Want process_type and priority in here as well! Needs updates in erl_bif_ports.c! */typedef struct _SysDriverOpts { int ifd; /* Input file descriptor (fd driver). */ int ofd; /* Outputfile descriptor (fd driver). */ int packet_bytes; /* Number of bytes in packet header. */ int read_write; /* Read and write bits. */ int use_stdio; /* Use standard I/O: TRUE or FALSE. */ int redir_stderr; /* Redirect stderr to stdout: TRUE/FALSE. */ int hide_window; /* Hide this windows (Windows). */ int exit_status; /* Report exit status of subprocess. */ char *envir; /* Environment of the port process, */ /* in Windows format. */ char *wd; /* Working directory. */#ifdef _OSE_ enum PROCESS_TYPE process_type; OSPRIORITY priority;#endif /* _OSE_ */} SysDriverOpts;extern char os_type[];extern int sys_init_time(void);#if defined(ERTS_TIMER_THREAD)#define erts_deliver_time()#elseextern void erts_deliver_time(void);#endifextern void erts_time_remaining(SysTimeval *);extern int erts_init_time_sup(void);extern void erts_sys_init_float(void);extern void erts_thread_init_float(void);/* Dynamic library/driver loading */extern void erl_sys_ddll_init(void); /* to initialize mutexes etc */extern int erts_sys_ddll_open(char *path, void **handle);extern int erts_sys_ddll_load_driver_init(void *handle, void **function);extern int erts_sys_ddll_close(void *handle);extern void *erts_sys_ddll_call_init(void *function);extern int erts_sys_ddll_sym(void *handle, char *name, void **function);extern char *erts_sys_ddll_error(int code);/* * System interfaces for startup/sae code (functions found in respective sys.c) */#ifdef ERTS_SMPvoid erts_sys_schedule_interrupt(int set);void erts_sys_schedule_interrupt_timed(int set, long msec);void erts_sys_main_thread(void);#else#define erts_sys_schedule_interrupt(Set)#endifextern void erts_sys_prepare_crash_dump(void);extern void erts_sys_pre_init(void);extern void erl_sys_init(void);extern void erl_sys_args(int *argc, char **argv);extern void erl_sys_schedule(int);#ifdef _OSE_extern void erl_sys_init_final(void);#elsevoid sys_tty_reset(void);#endif#ifdef ERTS_SMP_USE_IO_THREADextern erts_smp_tid_t erts_io_thr_tid; /* io.c */#endifEXTERN_FUNCTION(int, sys_max_files, (_VOID_));void sys_init_io(void);Preload* sys_preloaded(void);EXTERN_FUNCTION(unsigned char*, sys_preload_begin, (Preload*));EXTERN_FUNCTION(void, sys_preload_end, (Preload*));EXTERN_FUNCTION(int, sys_get_key, (int));void elapsed_time_both(unsigned long *ms_user, unsigned long *ms_sys, unsigned long *ms_user_diff, unsigned long *ms_sys_diff);void wall_clock_elapsed_time_both(unsigned long *ms_total, unsigned long *ms_diff);void get_time(int *hour, int *minute, int *second);void get_date(int *year, int *month, int *day);void get_localtime(int *year, int *month, int *day, int *hour, int *minute, int *second);void get_universaltime(int *year, int *month, int *day, int *hour, int *minute, int *second);int univ_to_local(Sint *year, Sint *month, Sint *day, Sint *hour, Sint *minute, Sint *second);int local_to_univ(Sint *year, Sint *month, Sint *day, Sint *hour, Sint *minute, Sint *second, int isdst);void get_now(Uint*, Uint*, Uint*);EXTERN_FUNCTION(void, set_break_quit, (void (*)(void), void (*)(void)));typedef void *GETENV_STATE;void os_flavor(char*, unsigned);void os_version(int*, int*, int*);void init_getenv_state(GETENV_STATE *);char * getenv_string(GETENV_STATE *);void fini_getenv_state(GETENV_STATE *);/* xxxP */void init_sys_float(void);int sys_chars_to_double(char*, double*);int sys_double_to_chars(double, char*);void sys_get_pid(char *);int sys_putenv(char *);/* utils.c *//* Options to sys_alloc_opt */#define SYS_ALLOC_OPT_TRIM_THRESHOLD 0#define SYS_ALLOC_OPT_TOP_PAD 1#define SYS_ALLOC_OPT_MMAP_THRESHOLD 2#define SYS_ALLOC_OPT_MMAP_MAX 3/* Default values to sys_alloc_opt options */#define ERTS_DEFAULT_TRIM_THRESHOLD (128 * 1024)#define ERTS_DEFAULT_TOP_PAD 0#define ERTS_DEFAULT_MMAP_THRESHOLD (128 * 1024)#define ERTS_DEFAULT_MMAP_MAX 64EXTERN_FUNCTION(int, sys_alloc_opt, (int, int));typedef struct { Sint trim_threshold; Sint top_pad; Sint mmap_threshold; Sint mmap_max;} SysAllocStat;EXTERN_FUNCTION(void, sys_alloc_stat, (SysAllocStat *));/* Block the whole system... */#define ERTS_BS_FLG_ALLOW_GC (((Uint32) 1) << 0)#define ERTS_BS_FLG_ALLOW_IO (((Uint32) 1) << 1)/* Activities... */typedef enum { ERTS_ACTIVITY_UNDEFINED, /* Undefined activity */ ERTS_ACTIVITY_WAIT, /* Waiting */ ERTS_ACTIVITY_GC, /* Garbage collecting */ ERTS_ACTIVITY_IO /* I/O including message passing to erl procs */} erts_activity_t;#ifdef ERTS_SMPtypedef enum { ERTS_ACT_ERR_LEAVE_WAIT_UNLOCKED, ERTS_ACT_ERR_LEAVE_UNKNOWN_ACTIVITY, ERTS_ACT_ERR_ENTER_UNKNOWN_ACTIVITY} erts_activity_error_t;typedef struct { erts_smp_atomic_t do_block; struct { erts_smp_atomic_t wait; erts_smp_atomic_t gc; erts_smp_atomic_t io; } in_activity;} erts_system_block_state_t;extern erts_system_block_state_t erts_system_block_state;int erts_is_system_blocked(erts_activity_t allowed_activities);void erts_block_me(void (*prepare)(void *), void (*resume)(void *), void *arg);void erts_register_blockable_thread(void);void erts_unregister_blockable_thread(void);void erts_note_activity_begin(erts_activity_t activity);voiderts_check_block(erts_activity_t old_activity, erts_activity_t new_activity, int locked, void (*prepare)(void *), void (*resume)(void *), void *arg);void erts_block_system(Uint32 allowed_activities);int erts_emergency_block_system(long timeout, Uint32 allowed_activities);void erts_release_system(void);void erts_system_block_init(void);void erts_set_activity_error(erts_activity_error_t, char *, int);#ifdef ERTS_ENABLE_LOCK_CHECKvoid erts_lc_activity_change_begin(void);void erts_lc_activity_change_end(void);int erts_lc_is_blocking(void);#define ERTS_LC_IS_BLOCKING \ (erts_smp_pending_system_block() && erts_lc_is_blocking())#endif#endif#define erts_smp_activity_begin(NACT, PRP, RSM, ARG) \ erts_smp_set_activity(ERTS_ACTIVITY_UNDEFINED, \ (NACT), \ 0, \ (PRP), \ (RSM), \ (ARG), \ __FILE__, \ __LINE__)#define erts_smp_activity_change(OACT, NACT, PRP, RSM, ARG) \ erts_smp_set_activity((OACT), \ (NACT), \ 0, \ (PRP), \ (RSM), \ (ARG), \ __FILE__, \ __LINE__)#define erts_smp_activity_end(OACT, PRP, RSM, ARG) \ erts_smp_set_activity((OACT), \ ERTS_ACTIVITY_UNDEFINED, \ 0, \ (PRP), \ (RSM), \ (ARG), \ __FILE__, \ __LINE__)#define erts_smp_locked_activity_begin(NACT) \ erts_smp_set_activity(ERTS_ACTIVITY_UNDEFINED, \ (NACT), \ 1, \ NULL, \ NULL, \ NULL, \ __FILE__, \ __LINE__)#define erts_smp_locked_activity_change(OACT, NACT) \ erts_smp_set_activity((OACT), \ (NACT), \ 1, \ NULL, \ NULL, \ NULL, \ __FILE__, \ __LINE__)#define erts_smp_locked_activity_end(OACT) \ erts_smp_set_activity((OACT), \ ERTS_ACTIVITY_UNDEFINED, \ 1, \ NULL, \ NULL, \ NULL, \ __FILE__, \ __LINE__)ERTS_GLB_INLINE int erts_smp_is_system_blocked(erts_activity_t allowed_activities);ERTS_GLB_INLINE void erts_smp_block_system(Uint32 allowed_activities);ERTS_GLB_INLINE int erts_smp_emergency_block_system(long timeout, Uint32 allowed_activities);ERTS_GLB_INLINE void erts_smp_release_system(void);ERTS_GLB_INLINE int erts_smp_pending_system_block(void);ERTS_GLB_INLINE void erts_smp_chk_system_block(void (*prepare)(void *), void (*resume)(void *), void *arg);ERTS_GLB_INLINE voiderts_smp_set_activity(erts_activity_t old_activity, erts_activity_t new_activity, int locked, void (*prepare)(void *), void (*resume)(void *), void *arg, char *file, int line);#if ERTS_GLB_INLINE_INCL_FUNC_DEF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -