Author: Armin Rigo <[email protected]>
Branch: reverse-debugger
Changeset: r86160:e2ab29983fd5
Date: 2016-08-11 21:24 +0200
http://bitbucket.org/pypy/pypy/changeset/e2ab29983fd5/
Log: During debugging, print a separator line when a thread switch occurs
diff --git a/rpython/translator/revdb/interact.py
b/rpython/translator/revdb/interact.py
--- a/rpython/translator/revdb/interact.py
+++ b/rpython/translator/revdb/interact.py
@@ -37,10 +37,19 @@
def interact(self):
last_command = 'help'
previous_time = None
+ previous_thread = 0
while True:
last_time = self.pgroup.get_current_time()
if last_time != previous_time:
print
+ if self.pgroup.get_current_thread() != previous_thread:
+ previous_thread = self.pgroup.get_current_thread()
+ if previous_thread == 0:
+ print ('-------------------- in the main thread '
+ '--------------------')
+ else:
+ print ('-------------------- in non-main thread '
+ '#%d --------------------' % (previous_thread,))
self.pgroup.update_watch_values()
last_time = self.pgroup.get_current_time()
if self.print_extra_pending_info:
@@ -49,6 +58,7 @@
if last_time != previous_time:
self.pgroup.show_backtrace(complete=0)
previous_time = last_time
+
prompt = '(%d)$ ' % last_time
try:
cmdline = raw_input(prompt).strip()
diff --git a/rpython/translator/revdb/process.py
b/rpython/translator/revdb/process.py
--- a/rpython/translator/revdb/process.py
+++ b/rpython/translator/revdb/process.py
@@ -120,12 +120,13 @@
return msg
def expect_ready(self):
- msg = self.expect(ANSWER_READY, Ellipsis, Ellipsis)
+ msg = self.expect(ANSWER_READY, Ellipsis, Ellipsis, Ellipsis)
self.update_times(msg)
def update_times(self, msg):
self.current_time = msg.arg1
self.currently_created_objects = msg.arg2
+ self.current_thread = msg.arg3
def clone(self):
"""Fork this subprocess. Returns a new ReplayProcess() that is
@@ -252,10 +253,13 @@
def get_currently_created_objects(self):
return self.active.currently_created_objects
+ def get_current_thread(self):
+ return self.active.current_thread
+
def _check_current_time(self, time):
assert self.get_current_time() == time
self.active.send(Message(CMD_FORWARD, 0))
- return self.active.expect(ANSWER_READY, time, Ellipsis)
+ return self.active.expect(ANSWER_READY, time, Ellipsis, Ellipsis)
def get_max_time(self):
return self.total_stop_points
diff --git a/rpython/translator/revdb/src-revdb/revdb.c
b/rpython/translator/revdb/src-revdb/revdb.c
--- a/rpython/translator/revdb/src-revdb/revdb.c
+++ b/rpython/translator/revdb/src-revdb/revdb.c
@@ -663,6 +663,7 @@
static stacklet_thread_handle st_thread;
static stacklet_handle st_outer_controller_h;
static uint64_t current_thread_id, target_thread_id;
+static uint64_t current_thread_num, next_thread_num;
static void *thread_tree_root;
@@ -672,7 +673,7 @@
char **argv;
};
struct replay_thread_s {
- uint64_t tid;
+ uint64_t tid, tnum;
stacklet_handle h;
struct pypy_threadlocal_s tloc;
};
@@ -754,7 +755,9 @@
struct replay_thread_s *node, **item, dummy;
if (real_tloc == NULL) {
- _OP_THREADLOCALREF_ADDR_SIGHANDLER(real_tloc);
+ char *p;
+ _OP_THREADLOCALREF_ADDR_SIGHANDLER(p);
+ real_tloc = (struct pypy_threadlocal_s *)p;
}
if (h == NULL)
@@ -767,6 +770,7 @@
if (!node)
goto out_of_memory;
node->tid = current_thread_id;
+ node->tnum = current_thread_num;
node->h = h;
/* save the thread-locals, if any */
if (real_tloc != NULL)
@@ -793,6 +797,7 @@
item = tfind(&dummy, &thread_tree_root, compare_replay_thread);
if (item == NULL) {
/* it's a new thread, start it now */
+ current_thread_num = next_thread_num++;
if (real_tloc != NULL)
memset(((char *)real_tloc) + RPY_TLOFSFIRST, 0,
sizeof(struct pypy_threadlocal_s) - RPY_TLOFSFIRST);
@@ -801,6 +806,7 @@
else {
node = *item;
assert(node->tid == target_thread_id);
+ current_thread_num = node->tnum;
h = node->h;
tdelete(node, &thread_tree_root, compare_replay_thread);
if (real_tloc != NULL)
@@ -957,6 +963,8 @@
exit(1);
}
current_thread_id = h.main_thread_id;
+ current_thread_num = 0;
+ next_thread_num = 1;
if (h.ptr1 != &rpy_reverse_db_stop_point ||
h.ptr2 != &rpy_revdb) {
fprintf(stderr,
@@ -1389,7 +1397,7 @@
write_answer(ANSWER_READY,
saved_state.stop_point_seen,
saved_state.unique_id_seen,
- 0);
+ current_thread_num);
read_sock(&cmd, sizeof(cmd));
char extra[cmd.extra_size + 1];
diff --git a/rpython/translator/revdb/test/test_thread.py
b/rpython/translator/revdb/test/test_thread.py
--- a/rpython/translator/revdb/test/test_thread.py
+++ b/rpython/translator/revdb/test/test_thread.py
@@ -166,13 +166,14 @@
child = self.replay()
for i in range(2, 6):
child.send(Message(CMD_FORWARD, 1))
- child.expect(ANSWER_READY, i, Ellipsis)
+ child.expect(ANSWER_READY, i, Ellipsis,
+ (i & 1) ^ 1) # thread number: either 0 or 1 here
child.send(Message(CMD_FORWARD, 1))
child.expect(ANSWER_AT_END)
class TestThreadLocal(InteractiveTests):
- expected_stop_points = 1
+ expected_stop_points = 2
def setup_class(cls):
from rpython.translator.revdb.test.test_basic import compile, run
@@ -192,6 +193,7 @@
rthread.gc_thread_die()
def main(argv):
+ revdb.stop_point()
ec = EC(12)
raw_thread_local.set(ec)
rthread.start_new_thread(bootstrap, ())
@@ -206,4 +208,6 @@
def test_go_threadlocal(self):
child = self.replay()
child.send(Message(CMD_FORWARD, 1))
+ child.expect(ANSWER_READY, 2, Ellipsis, 1)
+ child.send(Message(CMD_FORWARD, 1))
child.expect(ANSWER_AT_END)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit