hirura <hirura / gmail.com> wrote:
> I tried and reproduced this on
> - Ubuntu Linux on Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz (4cores / 8threads)
> - CentOS Linux on Intel(R) Xeon(R) CPU E5-2660 v3 @ 2.60GHz (1cores /
> 2threads; a VM)
> Unfortunately I don't have a Linux machine with AMD or other vendors'.

OK, I'm on AMD (Phenom II) with 4 cores and no HT.

> As for additional gdb outputs, I have a dumped core file of the
> stopped process, and I tried printing the instructed.
> But I couldn't get "vm" variable like
> ~~~
> (gdb) print vm
> No symbol "vm" in current context.
> ~~~
> Could you give me a bit detailed way to get the output? I'm sorry I'm
> not familiar with gdb.

You can use "up" and "down" to move up/down stack frames until you're
in a function where "vm" is accessible.  (I'm not a gdb expert, either)

> The t0 dummy thread is used so that the process is not killed by
> deadlock detection and I can get the core-dump.
> Without the thread, the process is killed as deadlock.

Odd, I can't reproduce a deadlock with t0 commented out, either.

> The output of the case is the below. I suppose deadlock detection is
> working as expected.
> (Line 45 is t1.join in this case)
> ~~~
> Traceback (most recent call last):
>         1: from readpartial_and_eof_test.rb:45:in `<main>'
> readpartial_and_eof_test.rb:45:in `join': No live threads left.
> Deadlock? (fatal)
> 2 threads, 2 sleeps current:0x00007f8c498cfc20 main thread:0x00007f8c49566470

OK, so that's 2 for both vm->living_thread_num and vm->sleeper;
in that case that's normal.

I'm wondering if a stuck process will show some strange values
(e.g. negative due to underflow).

Perhaps `volatile' is unnecessary and the compiler does
something strange with sleeper...  Does removing it change
things?

```
--- a/vm_core.h
+++ b/vm_core.h
@@ -565,7 +565,7 @@ typedef struct rb_vm_struct {
     unsigned int safe_level_: 1;
 
     int trace_running;
-    volatile int sleeper;
+    int sleeper;
 
     /* object management */
     VALUE mark_object_ary;
```

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>