815
832
BIF_ERROR(BIF_P, BADARG);
818
res = process_info_list(BIF_P, BIF_ARG_1, pi_1_keys_list, 0);
819
if (res == am_undefined)
820
ERTS_SMP_BIF_CHK_RESCHEDULE(BIF_P);
821
else if (is_non_value(res))
822
BIF_ERROR(BIF_P, BADARG);
835
res = process_info_list(BIF_P, BIF_ARG_1, pi_1_keys_list, 0, &yield);
836
if (is_non_value(res)) {
838
BIF_ERROR(BIF_P, BADARG);
840
ERTS_BIF_YIELD1(bif_export[BIF_process_info_1], BIF_P, BIF_ARG_1);
824
843
ASSERT(!(BIF_P->flags & F_P2PNR_RESCHED));
848
868
if (is_list(BIF_ARG_2)) {
849
res = process_info_list(BIF_P, BIF_ARG_1, BIF_ARG_2, 1);
850
if (res == am_undefined)
851
ERTS_SMP_BIF_CHK_RESCHEDULE(BIF_P);
852
else if (is_non_value(res))
853
BIF_ERROR(BIF_P, BADARG);
869
res = process_info_list(BIF_P, BIF_ARG_1, BIF_ARG_2, 1, &yield);
870
if (is_non_value(res)) {
872
BIF_ERROR(BIF_P, BADARG);
874
ERTS_BIF_YIELD2(bif_export[BIF_process_info_2], BIF_P,
875
BIF_ARG_1, BIF_ARG_2);
854
877
ASSERT(!(BIF_P->flags & F_P2PNR_RESCHED));
1709
1731
ASSERT(erts_compat_rel > 0);
1710
1732
BIF_RET(make_small(erts_compat_rel));
1711
1733
} else if (BIF_ARG_1 == am_memory) {
1712
erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN);
1713
1734
res = erts_memory(NULL, NULL, BIF_P, THE_NON_VALUE);
1714
erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN);
1716
1736
} else if (BIF_ARG_1 == am_multi_scheduling) {
1717
1737
#ifndef ERTS_SMP
1718
1738
BIF_RET(am_disabled);
1720
if (erts_no_of_schedulers == 1)
1740
if (erts_no_schedulers == 1)
1721
1741
BIF_RET(am_disabled);
1723
1743
BIF_RET(erts_is_multi_scheduling_blocked()
3022
else if (ERTS_IS_ATOM_STR("slot_to_atom", BIF_ARG_1)) {
3042
else if (ERTS_IS_ATOM_STR("colliding_names", BIF_ARG_1)) {
3023
3043
/* Used by ets_SUITE (stdlib) */
3025
if (term_to_Uint(BIF_ARG_2, &slot) != 0) {
3026
BIF_RET(erts_ets_slot_to_atom(slot));
3044
if (is_tuple(BIF_ARG_2)) {
3045
Eterm* tpl = tuple_val(BIF_ARG_2);
3047
if (arityval(tpl[0]) == 2 && is_atom(tpl[1]) &&
3048
term_to_Uint(tpl[2], &cnt)) {
3049
BIF_RET(erts_ets_colliding_names(BIF_P,tpl[1],cnt));
3029
3053
else if (ERTS_IS_ATOM_STR("re_loop_limit", BIF_ARG_1)) {
3037
3061
BIF_RET(make_small(max_loops));
3064
else if (ERTS_IS_ATOM_STR("unicode_loop_limit", BIF_ARG_1)) {
3065
/* Used by unicode_SUITE (stdlib) */
3067
if (is_atom(BIF_ARG_2) && ERTS_IS_ATOM_STR("default", BIF_ARG_2)) {
3068
max_loops = erts_unicode_set_loop_limit(-1);
3069
BIF_RET(make_small(max_loops));
3070
} else if (term_to_Uint(BIF_ARG_2, &max_loops) != 0) {
3071
max_loops = erts_unicode_set_loop_limit(max_loops);
3072
BIF_RET(make_small(max_loops));
3040
3075
else if (ERTS_IS_ATOM_STR("hipe_test_reschedule_suspend", BIF_ARG_1)) {
3041
3076
/* Used by hipe test suites */
3042
3077
long flag = erts_smp_atomic_read(&hipe_test_reschedule_flag);
3043
3078
if (!flag && BIF_ARG_2 != am_false) {
3044
3079
erts_smp_atomic_set(&hipe_test_reschedule_flag, 1);
3045
3080
erts_suspend(BIF_P, ERTS_PROC_LOCK_MAIN, NULL);
3046
BIF_ERROR(BIF_P, RESCHEDULE);
3081
ERTS_BIF_YIELD2(bif_export[BIF_erts_debug_set_internal_state_2],
3082
BIF_P, BIF_ARG_1, BIF_ARG_2);
3048
3084
erts_smp_atomic_set(&hipe_test_reschedule_flag, !flag);
3072
3108
BIF_ERROR(BIF_P, BADARG);
3111
#ifdef ERTS_ENABLE_LOCK_COUNT
3113
static Eterm lcnt_build_lock_term(Process *p, erts_lcnt_lock_t *lock, Eterm res) {
3114
Eterm loc, nlt, nlc, tup, lid, type;
3115
Eterm ts, tns, tn, ttup;
3118
unsigned long tries, colls;
3120
int need = 4 + 7 + 2;
3123
ethr_atomic_read(&lock->tries, (long *)&tries);
3124
ethr_atomic_read(&lock->colls, (long *)&colls);
3125
need += (!IS_USMALL(0, tries) +
3126
!IS_USMALL(0, colls) +
3127
!IS_USMALL(0,lock->timer_s ) +
3128
!IS_USMALL(0,lock->timer_ns) +
3129
!IS_USMALL(0,lock->timer_n ))*BIG_UINT_HEAP_SIZE;
3130
hp = HAlloc(p, need);
3132
ltype = erts_lcnt_lock_type(lock->flag);
3134
loc = am_atom_put(lock->name, strlen(lock->name));
3136
type = am_atom_put(ltype, strlen(ltype));
3137
nlt = erts_bld_uint( &hp, NULL, tries);
3138
nlc = erts_bld_uint( &hp, NULL, colls);
3140
ts = erts_bld_uint( &hp, NULL, lock->timer_s);
3141
tns = erts_bld_uint( &hp, NULL, lock->timer_ns);
3142
tn = erts_bld_uint( &hp, NULL, lock->timer_n);
3143
ttup = erts_bld_tuple(&hp, NULL, 3,
3146
tup = erts_bld_tuple(&hp, NULL, 6,
3147
loc, lid, type, nlt, nlc, ttup);
3149
res = erts_bld_cons( &hp, NULL, tup, res);
3155
BIF_RETTYPE erts_debug_lock_counters_1(BIF_ALIST_1)
3157
#ifdef ERTS_ENABLE_LOCK_COUNT
3160
if (BIF_ARG_1 == am_info) {
3161
erts_lcnt_lock_t *lock = NULL;
3162
erts_lcnt_data_t *data;
3165
erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN);
3166
erts_smp_block_system(0);
3168
data = erts_lcnt_get_data();
3170
/* Build eterm in the form of,
3171
* * [{lock_name(), lock_id(), lock_type(), Tries :: int(), Colls :: int()}]
3173
for (lock = data->current_locks->head; lock != NULL ; lock = lock->next ) {
3174
res = lcnt_build_lock_term(BIF_P, lock, res);
3176
for (lock = data->deleted_locks->head; lock != NULL ; lock = lock->next ) {
3177
res = lcnt_build_lock_term(BIF_P, lock, res);
3181
erts_smp_release_system();
3182
erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN);
3184
} else if (BIF_ARG_1 == am_clear) {
3185
erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN);
3186
erts_smp_block_system(0);
3187
/* clear counters */
3188
erts_lcnt_clear_counters();
3189
erts_smp_release_system();
3190
erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN);
3191
/* clear counters */
3194
#endif /* ERTS_ENABLE_LOCK_COUNT */
3195
BIF_ERROR(BIF_P, BADARG);
3076
3199
erts_bif_info_init(void)