diff options
author | Rick Reed <[email protected]> | 2012-03-16 16:01:44 -0700 |
---|---|---|
committer | Björn-Egil Dahlberg <[email protected]> | 2012-04-05 14:58:44 +0200 |
commit | daf8f46c46745ebb6fcdfb226252c7823264a410 (patch) | |
tree | eba550a3e78aa1ec535bbca5e95dd764c9e59cf2 /erts/emulator/beam/erl_process_lock.c | |
parent | fbd09660fe4bd57632ec481a60106cf79ea93bcd (diff) | |
download | otp-daf8f46c46745ebb6fcdfb226252c7823264a410.tar.gz otp-daf8f46c46745ebb6fcdfb226252c7823264a410.tar.bz2 otp-daf8f46c46745ebb6fcdfb226252c7823264a410.zip |
erts: Add lcnt port and suspend options
* Add new suspend, location, and port_locks options to erts_debug:lock_counters.
* Init and destroy lock counting for processes and ports as appropriate.
Conflicts:
erts/emulator/beam/erl_bif_info.c
Diffstat (limited to 'erts/emulator/beam/erl_process_lock.c')
-rw-r--r-- | erts/emulator/beam/erl_process_lock.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/erts/emulator/beam/erl_process_lock.c b/erts/emulator/beam/erl_process_lock.c index a5a753b798..4437d46ff9 100644 --- a/erts/emulator/beam/erl_process_lock.c +++ b/erts/emulator/beam/erl_process_lock.c @@ -1002,7 +1002,7 @@ erts_proc_lock_init(Process *p) #ifdef ERTS_ENABLE_LOCK_COUNT void erts_lcnt_proc_lock_init(Process *p) { - + if (erts_lcnt_rt_options & ERTS_LCNT_OPT_PROCLOCK) { if (p->id != ERTS_INVALID_PID) { erts_lcnt_init_lock_x(&(p->lock.lcnt_main), "proc_main", ERTS_LCNT_LT_PROCLOCK, p->id); erts_lcnt_init_lock_x(&(p->lock.lcnt_msgq), "proc_msgq", ERTS_LCNT_LT_PROCLOCK, p->id); @@ -1014,6 +1014,12 @@ void erts_lcnt_proc_lock_init(Process *p) { erts_lcnt_init_lock(&(p->lock.lcnt_link), "proc_link", ERTS_LCNT_LT_PROCLOCK); erts_lcnt_init_lock(&(p->lock.lcnt_status), "proc_status", ERTS_LCNT_LT_PROCLOCK); } + } else { + sys_memzero(&(p->lock.lcnt_main), sizeof(p->lock.lcnt_main)); + sys_memzero(&(p->lock.lcnt_msgq), sizeof(p->lock.lcnt_msgq)); + sys_memzero(&(p->lock.lcnt_link), sizeof(p->lock.lcnt_link)); + sys_memzero(&(p->lock.lcnt_status), sizeof(p->lock.lcnt_status)); + } } @@ -1108,6 +1114,29 @@ void erts_lcnt_proc_trylock(erts_proc_lock_t *lock, ErtsProcLocks locks, int res } } +void enable_proc_lock_count (int enable); + +void +enable_proc_lock_count (int enable) +{ + int i; + + for (i = 0; i < erts_max_processes; ++i) { + Process* p = process_tab[i]; + if (p) { + if (enable) { + if (!ERTS_LCNT_LOCK_TYPE(&(p->lock.lcnt_main))) { + erts_lcnt_proc_lock_init(p); + } + } else { + if (ERTS_LCNT_LOCK_TYPE(&(p->lock.lcnt_main))) { + erts_lcnt_proc_lock_destroy(p); + } + } + } + } +} + #endif /* ifdef ERTS_ENABLE_LOCK_COUNT */ |