305
382
# endif /* !__WIN32__ */
306
383
# endif /* _OSE_ */
307
384
#endif /* WANT_NONBLOCKING */
387
void __noreturn erl_exit(int n, char*, ...);
389
/* Some special erl_exit() codes: */
390
#define ERTS_INTR_EXIT INT_MIN /* called from signal handler */
391
#define ERTS_ABORT_EXIT (INT_MIN + 1) /* no crash dump; only abort() */
392
#define ERTS_DUMP_EXIT (127) /* crash dump; then exit() */
309
396
EXTERN_FUNCTION(int, check_async_ready, (_VOID_));
311
397
#ifdef USE_THREADS
313
398
EXTERN_FUNCTION(void, sys_async_ready, (int hndl));
317
/* Memory allocated from system dependent code (declared in utils.c) */
318
extern Uint erts_sys_misc_mem_sz;
320
/* Io constants to sys_printf and sys_putc */
403
void erts_io_lock(void);
404
void erts_io_unlock(void);
407
ERTS_GLB_INLINE void erts_smp_io_lock(void);
408
ERTS_GLB_INLINE void erts_smp_io_unlock(void);
410
#if ERTS_GLB_INLINE_INCL_FUNC_DEF
413
erts_smp_io_lock(void)
421
erts_smp_io_unlock(void)
430
Eterm erts_check_io_info(void *p);
432
/* Size of misc memory allocated from system dependent code */
433
Uint erts_sys_misc_mem_sz(void);
435
/* print stuff is declared here instead of in global.h, so sys stuff won't
436
have to include global.h */
437
#include "erl_printf.h"
439
/* Io constants to erts_print and erts_putc */
440
#define ERTS_PRINT_STDERR (2)
441
#define ERTS_PRINT_STDOUT (1)
442
#define ERTS_PRINT_INVALID (0) /* Don't want to use 0 since CBUF was 0 */
443
#define ERTS_PRINT_FILE (-1)
444
#define ERTS_PRINT_SBUF (-2)
445
#define ERTS_PRINT_SNBUF (-3)
446
#define ERTS_PRINT_DSBUF (-4)
448
#define ERTS_PRINT_MIN ERTS_PRINT_DSBUF
455
int erts_print(int to, void *arg, char *format, ...); /* in utils.c */
456
int erts_putc(int to, void *arg, char); /* in utils.c */
458
/* logger stuff is declared here instead of in global.h, so sys files
459
won't have to include global.h */
461
erts_dsprintf_buf_t *erts_create_logger_dsbuf(void);
462
int erts_send_info_to_logger(Eterm, erts_dsprintf_buf_t *);
463
int erts_send_warning_to_logger(Eterm, erts_dsprintf_buf_t *);
464
int erts_send_error_to_logger(Eterm, erts_dsprintf_buf_t *);
465
int erts_send_info_to_logger_str(Eterm, char *);
466
int erts_send_warning_to_logger_str(Eterm, char *);
467
int erts_send_error_to_logger_str(Eterm, char *);
468
int erts_send_info_to_logger_nogl(erts_dsprintf_buf_t *);
469
int erts_send_warning_to_logger_nogl(erts_dsprintf_buf_t *);
470
int erts_send_error_to_logger_nogl(erts_dsprintf_buf_t *);
471
int erts_send_info_to_logger_str_nogl(char *);
472
int erts_send_warning_to_logger_str_nogl(char *);
473
int erts_send_error_to_logger_str_nogl(char *);
328
475
typedef struct preload {
329
476
char *name; /* Name of module */
448
613
EXTERN_FUNCTION(void, sys_alloc_stat, (SysAllocStat *));
615
/* Block the whole system... */
617
#define ERTS_BS_FLG_ALLOW_GC (((Uint32) 1) << 0)
618
#define ERTS_BS_FLG_ALLOW_IO (((Uint32) 1) << 1)
622
ERTS_ACTIVITY_UNDEFINED, /* Undefined activity */
623
ERTS_ACTIVITY_WAIT, /* Waiting */
624
ERTS_ACTIVITY_GC, /* Garbage collecting */
625
ERTS_ACTIVITY_IO /* I/O including message passing to erl procs */
631
ERTS_ACT_ERR_LEAVE_WAIT_UNLOCKED,
632
ERTS_ACT_ERR_LEAVE_UNKNOWN_ACTIVITY,
633
ERTS_ACT_ERR_ENTER_UNKNOWN_ACTIVITY
634
} erts_activity_error_t;
637
erts_smp_atomic_t do_block;
639
erts_smp_atomic_t wait;
640
erts_smp_atomic_t gc;
641
erts_smp_atomic_t io;
643
} erts_system_block_state_t;
645
extern erts_system_block_state_t erts_system_block_state;
647
int erts_is_system_blocked(erts_activity_t allowed_activities);
648
void erts_block_me(void (*prepare)(void *), void (*resume)(void *), void *arg);
649
void erts_register_blockable_thread(void);
650
void erts_unregister_blockable_thread(void);
651
void erts_note_activity_begin(erts_activity_t activity);
653
erts_check_block(erts_activity_t old_activity,
654
erts_activity_t new_activity,
656
void (*prepare)(void *),
657
void (*resume)(void *),
659
void erts_block_system(Uint32 allowed_activities);
660
int erts_emergency_block_system(long timeout, Uint32 allowed_activities);
661
void erts_release_system(void);
662
void erts_system_block_init(void);
663
void erts_set_activity_error(erts_activity_error_t, char *, int);
664
#ifdef ERTS_ENABLE_LOCK_CHECK
665
void erts_lc_activity_change_begin(void);
666
void erts_lc_activity_change_end(void);
670
#define erts_smp_activity_begin(NACT, PRP, RSM, ARG) \
671
erts_smp_set_activity(ERTS_ACTIVITY_UNDEFINED, \
679
#define erts_smp_activity_change(OACT, NACT, PRP, RSM, ARG) \
680
erts_smp_set_activity((OACT), \
688
#define erts_smp_activity_end(OACT, PRP, RSM, ARG) \
689
erts_smp_set_activity((OACT), \
690
ERTS_ACTIVITY_UNDEFINED, \
698
#define erts_smp_locked_activity_begin(NACT) \
699
erts_smp_set_activity(ERTS_ACTIVITY_UNDEFINED, \
707
#define erts_smp_locked_activity_change(OACT, NACT) \
708
erts_smp_set_activity((OACT), \
716
#define erts_smp_locked_activity_end(OACT) \
717
erts_smp_set_activity((OACT), \
718
ERTS_ACTIVITY_UNDEFINED, \
727
ERTS_GLB_INLINE int erts_smp_is_system_blocked(erts_activity_t allowed_activities);
728
ERTS_GLB_INLINE void erts_smp_block_system(Uint32 allowed_activities);
729
ERTS_GLB_INLINE int erts_smp_emergency_block_system(long timeout,
730
Uint32 allowed_activities);
731
ERTS_GLB_INLINE void erts_smp_release_system(void);
732
ERTS_GLB_INLINE int erts_smp_pending_system_block(void);
733
ERTS_GLB_INLINE void erts_smp_chk_system_block(void (*prepare)(void *),
734
void (*resume)(void *),
737
erts_smp_set_activity(erts_activity_t old_activity,
738
erts_activity_t new_activity,
740
void (*prepare)(void *),
741
void (*resume)(void *),
746
#if ERTS_GLB_INLINE_INCL_FUNC_DEF
750
erts_smp_is_system_blocked(erts_activity_t allowed_activities)
753
return erts_is_system_blocked(allowed_activities);
760
erts_smp_block_system(Uint32 allowed_activities)
763
erts_block_system(allowed_activities);
768
erts_smp_emergency_block_system(long timeout, Uint32 allowed_activities)
771
return erts_emergency_block_system(timeout, allowed_activities);
778
erts_smp_release_system(void)
781
erts_release_system();
786
erts_smp_pending_system_block(void)
789
return erts_smp_atomic_read(&erts_system_block_state.do_block);
797
erts_smp_chk_system_block(void (*prepare)(void *),
798
void (*resume)(void *),
802
if (erts_smp_pending_system_block())
803
erts_block_me(prepare, resume, arg);
808
erts_smp_set_activity(erts_activity_t old_activity,
809
erts_activity_t new_activity,
811
void (*prepare)(void *),
812
void (*resume)(void *),
818
#ifdef ERTS_ENABLE_LOCK_CHECK
819
erts_lc_activity_change_begin();
821
switch (old_activity) {
822
case ERTS_ACTIVITY_UNDEFINED:
824
case ERTS_ACTIVITY_WAIT:
825
erts_smp_atomic_dec(&erts_system_block_state.in_activity.wait);
827
/* You are not allowed to leave activity waiting
828
* without supplying the possibility to block
831
erts_set_activity_error(ERTS_ACT_ERR_LEAVE_WAIT_UNLOCKED,
835
case ERTS_ACTIVITY_GC:
836
erts_smp_atomic_dec(&erts_system_block_state.in_activity.gc);
838
case ERTS_ACTIVITY_IO:
839
erts_smp_atomic_dec(&erts_system_block_state.in_activity.io);
842
erts_set_activity_error(ERTS_ACT_ERR_LEAVE_UNKNOWN_ACTIVITY,
847
if (erts_smp_pending_system_block())
848
erts_check_block(old_activity,new_activity,locked,prepare,resume,arg);
850
switch (new_activity) {
851
case ERTS_ACTIVITY_UNDEFINED:
853
case ERTS_ACTIVITY_WAIT:
854
erts_smp_atomic_inc(&erts_system_block_state.in_activity.wait);
856
case ERTS_ACTIVITY_GC:
857
erts_smp_atomic_inc(&erts_system_block_state.in_activity.gc);
859
case ERTS_ACTIVITY_IO:
860
erts_smp_atomic_inc(&erts_system_block_state.in_activity.io);
863
erts_set_activity_error(ERTS_ACT_ERR_ENTER_UNKNOWN_ACTIVITY,
868
switch (new_activity) {
869
case ERTS_ACTIVITY_WAIT:
870
case ERTS_ACTIVITY_GC:
871
case ERTS_ACTIVITY_IO:
872
if (erts_smp_pending_system_block())
873
erts_note_activity_begin(new_activity);
879
#ifdef ERTS_ENABLE_LOCK_CHECK
880
erts_lc_activity_change_end();
886
#endif /* #if ERTS_GLB_INLINE_INCL_FUNC_DEF */
888
#if defined(DEBUG) || defined(ERTS_ENABLE_LOCK_CHECK)
889
#undef ERTS_REFC_DEBUG
890
#define ERTS_REFC_DEBUG
893
typedef erts_smp_atomic_t erts_refc_t;
895
ERTS_GLB_INLINE void erts_refc_init(erts_refc_t *refcp, long val);
896
ERTS_GLB_INLINE void erts_refc_inc(erts_refc_t *refcp, long min_val);
897
ERTS_GLB_INLINE long erts_refc_inctest(erts_refc_t *refcp, long min_val);
898
ERTS_GLB_INLINE void erts_refc_dec(erts_refc_t *refcp, long min_val);
899
ERTS_GLB_INLINE long erts_refc_dectest(erts_refc_t *refcp, long min_val);
900
ERTS_GLB_INLINE long erts_refc_read(erts_refc_t *refcp, long min_val);
902
#if ERTS_GLB_INLINE_INCL_FUNC_DEF
905
erts_refc_init(erts_refc_t *refcp, long val)
907
erts_smp_atomic_init((erts_smp_atomic_t *) refcp, val);
911
erts_refc_inc(erts_refc_t *refcp, long min_val)
913
#ifdef ERTS_REFC_DEBUG
914
long val = erts_smp_atomic_inctest((erts_smp_atomic_t *) refcp);
916
erl_exit(ERTS_ABORT_EXIT,
917
"erts_refc_inc(): Bad refc found (refc=%ld < %ld)!\n",
920
erts_smp_atomic_inc((erts_smp_atomic_t *) refcp);
925
erts_refc_inctest(erts_refc_t *refcp, long min_val)
927
long val = erts_smp_atomic_inctest((erts_smp_atomic_t *) refcp);
928
#ifdef ERTS_REFC_DEBUG
930
erl_exit(ERTS_ABORT_EXIT,
931
"erts_refc_inctest(): Bad refc found (refc=%ld < %ld)!\n",
938
erts_refc_dec(erts_refc_t *refcp, long min_val)
940
#ifdef ERTS_REFC_DEBUG
941
long val = erts_smp_atomic_dectest((erts_smp_atomic_t *) refcp);
943
erl_exit(ERTS_ABORT_EXIT,
944
"erts_refc_dec(): Bad refc found (refc=%ld < %ld)!\n",
947
erts_smp_atomic_dec((erts_smp_atomic_t *) refcp);
952
erts_refc_dectest(erts_refc_t *refcp, long min_val)
954
long val = erts_smp_atomic_dectest((erts_smp_atomic_t *) refcp);
955
#ifdef ERTS_REFC_DEBUG
957
erl_exit(ERTS_ABORT_EXIT,
958
"erts_refc_dectest(): Bad refc found (refc=%ld < %ld)!\n",
965
erts_refc_read(erts_refc_t *refcp, long min_val)
967
long val = erts_smp_atomic_read((erts_smp_atomic_t *) refcp);
968
#ifdef ERTS_REFC_DEBUG
970
erl_exit(ERTS_ABORT_EXIT,
971
"erts_refc_read(): Bad refc found (refc=%ld < %ld)!\n",
977
#endif /* #if ERTS_GLB_INLINE_INCL_FUNC_DEF */
979
#ifdef ERTS_ENABLE_KERNEL_POLL
980
extern int erts_use_kernel_poll;
450
983
void elib_ensure_initialized(void);