Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:19
erlang
3474-etp.py-Correct-reading-of-atomics.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 3474-etp.py-Correct-reading-of-atomics.patch of Package erlang
From 917abd142f8a575816d7f767195d6fd0426d94fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org> Date: Sun, 11 Apr 2021 07:04:26 +0200 Subject: [PATCH 3/7] etp.py: Correct reading of atomics Atomics have different implementations on different platforms. The conversion of a continuation pointer to an "M:F/A" will need working reading of atomics because the range table contains atomics. --- erts/etc/unix/etp.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/erts/etc/unix/etp.py b/erts/etc/unix/etp.py index 69cb3ba02e..7917e5cc48 100644 --- a/erts/etc/unix/etp.py +++ b/erts/etc/unix/etp.py @@ -48,7 +48,7 @@ def processes_cmd(debugger, command, result, internal_dict): proc_r_o = proc.GetChildMemberWithName('r').GetChildMemberWithName('o') proc_max_ix = proc_r_o.GetChildMemberWithName('max') proc_tab = proc_r_o.GetChildMemberWithName('tab').Cast(ProcessPtrPtr(target)) - proc_cnt = proc.GetChildMemberWithName('vola').GetChildMemberWithName('tile').GetChildMemberWithName('count').GetChildMemberWithName('counter').unsigned + proc_cnt = atomic_value(proc.GetChildMemberWithName('vola').GetChildMemberWithName('tile').GetChildMemberWithName('count')) invalid_proc = global_var('erts_invalid_process', target).address_of for proc_ix in range(0, proc_max_ix.unsigned): proc = offset(proc_ix, proc_tab).deref @@ -74,7 +74,7 @@ def process_info(proc): print(' Flags: %s' % process_flags(proc)) print_process_reg_name(proc) current = proc.GetChildMemberWithName('current') - if current.unsigned != 0 and proc.GetChildMemberWithName('state').GetChildMemberWithName('counter').unsigned & 0x800 == 0: + if current.unsigned != 0 and atomic_value(proc.GetChildMemberWithName('state')) & 0x800 == 0: print(' Current function: %s' % mfa(current)) else: print(' Current function: %s' % 'unknown') @@ -250,7 +250,7 @@ def stackdump(proc, dump): stop = proc.GetChildMemberWithName('stop') send = proc.GetChildMemberWithName('hend') cnt = 0 - if proc.GetChildMemberWithName('state').GetChildMemberWithName('counter').unsigned & 0x8000: + if atomic_value(proc.GetChildMemberWithName('state')) & 0x8000: print('%%%%%% WARNING: The process is currently running, so c_p->stop will not be correct') print(F'%% Stacktrace ({send.unsigned - stop.unsigned})'); i = proc.GetChildMemberWithName('i') @@ -618,9 +618,11 @@ def find_range(valobj): range_pointer_type = range_type.GetPointerType() mid = ranges.GetChildMemberWithName('mid').Cast(range_pointer_type) while low.unsigned < high.unsigned: - if pc < mid.GetChildMemberWithName('start').unsigned: + start = mid.GetChildMemberWithName('start').unsigned + end = atomic_value(mid.GetChildMemberWithName('end')) + if pc < start: high = mid - elif pc > mid.GetChildMemberWithName('end').GetChildMemberWithName('counter').unsigned: + elif pc > end: low = offset(1, mid).Cast(range_pointer_type) else: return mid @@ -659,3 +661,10 @@ def offset(i, valobj): return val.address_of.Cast(valobj.GetType()) else: return val + +def atomic_value(valobj): + value = valobj.GetChildMemberWithName('counter') + if value.IsValid(): + return value.unsigned + else: + return valobj.GetChildMemberWithName('value').unsigned -- 2.26.2
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor