From: Rocky Bernstein Date: 2009-06-09T09:30:06+09:00 Subject: [ruby-core:23763] Re: [Bug #977] caller for all threads patch --000325572b82daab73046bdf6190 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit One thing I think might be cool is rather than raising an error for a negative Fixnum value is to count from the other end. So caller(-1) is the least-recent call. If you want me to try my hand at extending the below, let me know. On Mon, Jun 8, 2009 at 7:06 PM, SASADA Koichi wrote: > I made a patch to Thread#caller(lev=1). It may be more flexible than > fetching "all" backtrace. > How about it? (not tested enough) > > > Index: vm_eval.c > > =================================================================== > > --- vm_eval.c (リビジョン 23650) > > +++ vm_eval.c (作業コピー) > > @@ -1342,6 +1342,19 @@ rb_make_backtrace(void) > > } > > > > VALUE > > +rb_thread_backtrace(VALUE thval, int lev) > > +{ > > + rb_thread_t *th; > > + GetThreadPtr(thval, th); > > + > > + if (th->status != THREAD_KILLED && GET_THREAD() != th) { > > + lev--; > > + } > > + > > + return vm_backtrace(th, lev); > > +} > > + > > +VALUE > > rb_backtrace_each(rb_backtrace_iter_func *iter, void *arg) > > { > > return vm_backtrace_each(GET_THREAD(), -1, iter, arg); > > Index: thread.c > > =================================================================== > > --- thread.c (リビジョン 23651) > > +++ thread.c (作業コピー) > > @@ -3817,6 +3817,26 @@ ruby_suppress_tracing(VALUE (*func)(VALU > > return result; > > } > > > > +VALUE rb_thread_backtrace(VALUE thval, int lev); > > + > > +static VALUE > > +rb_thread_caller_m(int argc, VALUE *argv, VALUE thval) > > +{ > > + VALUE level; > > + int lev; > > + > > + rb_scan_args(argc, argv, "01", &level); > > + > > + if (NIL_P(level)) > > + lev = 1; > > + else > > + lev = NUM2INT(level); > > + if (lev < 0) > > + rb_raise(rb_eArgError, "negative level (%d)", lev); > > + > > + return rb_thread_backtrace(thval, lev); > > +} > > + > > /* > > * +Thread+ encapsulates the behavior of a thread of > > * execution, including the main thread of the Ruby script. > > @@ -3873,6 +3893,7 @@ Init_Thread(void) > > rb_define_method(rb_cThread, "abort_on_exception=", > rb_thread_abort_exc_set, 1); > > rb_define_method(rb_cThread, "safe_level", rb_thread_safe_level, 0); > > rb_define_method(rb_cThread, "group", rb_thread_group, 0); > > + rb_define_method(rb_cThread, "caller", rb_thread_caller_m, -1); > > > > rb_define_method(rb_cThread, "inspect", rb_thread_inspect, 0); > > > > Roger Pack wrote:: > > Bug #977: caller for all threads patch > > http://redmine.ruby-lang.org/issues/show/977 > > > > Author: Roger Pack > > Status: Open, Priority: Normal > > > > Here is a patch which provides backtrace for all current threads, instead > of just the current one. > > http://ph7spot.com/articles/caller_for_all_threads > > Author said it would be great to have it accepted upstream. > > Thoughts? > > -=r > > > > > > ---------------------------------------- > > http://redmine.ruby-lang.org > > > > > -- > // SASADA Koichi at atdot dot net > > --000325572b82daab73046bdf6190 Content-Type: text/html; charset=ISO-2022-JP Content-Transfer-Encoding: base64 T25lIHRoaW5nIEkgdGhpbmsgbWlnaHQgYmUgY29vbCBpcyByYXRoZXIgdGhhbiByYWlzaW5nIGFu IGVycm9yIGZvciBhIG5lZ2F0aXZlIEZpeG51bSB2YWx1ZSBpcyB0byBjb3VudCBmcm9tIHRoZSBv dGhlciBlbmQuIFNvIGNhbGxlcigtMSkgaXMgdGhlIGxlYXN0LXJlY2VudCBjYWxsLiA8YnI+PGJy PklmIHlvdSB3YW50IG1lIHRvIHRyeSBteSBoYW5kIGF0IGV4dGVuZGluZyB0aGUgYmVsb3csIGxl dCBtZSBrbm93Ljxicj4KPGJyPjxicj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+T24gTW9uLCBK dW4gOCwgMjAwOSBhdCA3OjA2IFBNLCBTQVNBREEgS29pY2hpIDxzcGFuIGRpcj0ibHRyIj4mbHQ7 PGEgaHJlZj0ibWFpbHRvOmtvMUBhdGRvdC5uZXQiPmtvMUBhdGRvdC5uZXQ8L2E+Jmd0Ozwvc3Bh bj4gd3JvdGU6PGJyPjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9ImJvcmRl ci1sZWZ0OiAxcHggc29saWQgcmdiKDIwNCwgMjA0LCAyMDQpOyBtYXJnaW46IDBwdCAwcHQgMHB0 IDAuOGV4OyBwYWRkaW5nLWxlZnQ6IDFleDsiPgpJIG1hZGUgYSBwYXRjaCB0byBUaHJlYWQjY2Fs bGVyKGxldj0xKS4gJm5ic3A7SXQgbWF5IGJlIG1vcmUgZmxleGlibGUgdGhhbjxicj4KZmV0Y2hp bmcgJnF1b3Q7YWxsJnF1b3Q7IGJhY2t0cmFjZS48YnI+CkhvdyBhYm91dCBpdD8gKG5vdCB0ZXN0 ZWQgZW5vdWdoKTxicj4KPGJyPgomZ3Q7IEluZGV4OiB2bV9ldmFsLmM8YnI+CiZndDsgPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PTxicj4KJmd0OyAtLS0gdm1fZXZhbC5jICgbJEIlaiVTJTglZyVzGyhCIDIzNjUwKTxicj4K Jmd0OyArKysgdm1fZXZhbC5jICgbJEI6bjZIJTMlVCE8GyhCKTxicj4KJmd0OyBAQCAtMTM0Miw2 ICsxMzQyLDE5IEBAIHJiX21ha2VfYmFja3RyYWNlKHZvaWQpPGJyPgomZ3Q7ICZuYnNwO308YnI+ CiZndDs8YnI+CiZndDsgJm5ic3A7VkFMVUU8YnI+CiZndDsgK3JiX3RocmVhZF9iYWNrdHJhY2Uo VkFMVUUgdGh2YWwsIGludCBsZXYpPGJyPgomZ3Q7ICt7PGJyPgomZ3Q7ICsgJm5ic3A7ICZuYnNw O3JiX3RocmVhZF90ICp0aDs8YnI+CiZndDsgKyAmbmJzcDsgJm5ic3A7R2V0VGhyZWFkUHRyKHRo dmFsLCB0aCk7PGJyPgomZ3Q7ICs8YnI+CiZndDsgKyAmbmJzcDsgJm5ic3A7aWYgKHRoLSZndDtz dGF0dXMgIT0gVEhSRUFEX0tJTExFRCAmYW1wOyZhbXA7IEdFVF9USFJFQUQoKSAhPSB0aCkgezxi cj4KJmd0OyArICZuYnNwOyAmbmJzcDsgbGV2LS07PGJyPgomZ3Q7ICsgJm5ic3A7ICZuYnNwO308 YnI+CiZndDsgKzxicj4KJmd0OyArICZuYnNwOyAmbmJzcDtyZXR1cm4gdm1fYmFja3RyYWNlKHRo LCBsZXYpOzxicj4KJmd0OyArfTxicj4KJmd0OyArPGJyPgomZ3Q7ICtWQUxVRTxicj4KJmd0OyAm bmJzcDtyYl9iYWNrdHJhY2VfZWFjaChyYl9iYWNrdHJhY2VfaXRlcl9mdW5jICppdGVyLCB2b2lk ICphcmcpPGJyPgomZ3Q7ICZuYnNwO3s8YnI+CiZndDsgJm5ic3A7ICZuYnNwOyAmbmJzcDtyZXR1 cm4gdm1fYmFja3RyYWNlX2VhY2goR0VUX1RIUkVBRCgpLCAtMSwgaXRlciwgYXJnKTs8YnI+CiZn dDsgSW5kZXg6IHRocmVhZC5jPGJyPgomZ3Q7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT08YnI+CiZndDsgLS0tIHRocmVh ZC5jICZuYnNwOygbJEIlaiVTJTglZyVzGyhCIDIzNjUxKTxicj4KJmd0OyArKysgdGhyZWFkLmMg Jm5ic3A7KBskQjpuNkglMyVUITwbKEIpPGJyPgomZ3Q7IEBAIC0zODE3LDYgKzM4MTcsMjYgQEAg cnVieV9zdXBwcmVzc190cmFjaW5nKFZBTFVFICgqZnVuYykoVkFMVTxicj4KJmd0OyAmbmJzcDsg Jm5ic3A7ICZuYnNwO3JldHVybiByZXN1bHQ7PGJyPgomZ3Q7ICZuYnNwO308YnI+CiZndDs8YnI+ CiZndDsgK1ZBTFVFIHJiX3RocmVhZF9iYWNrdHJhY2UoVkFMVUUgdGh2YWwsIGludCBsZXYpOzxi cj4KJmd0OyArPGJyPgomZ3Q7ICtzdGF0aWMgVkFMVUU8YnI+CiZndDsgK3JiX3RocmVhZF9jYWxs ZXJfbShpbnQgYXJnYywgVkFMVUUgKmFyZ3YsIFZBTFVFIHRodmFsKTxicj4KJmd0OyArezxicj4K Jmd0OyArICZuYnNwOyAmbmJzcDtWQUxVRSBsZXZlbDs8YnI+CiZndDsgKyAmbmJzcDsgJm5ic3A7 aW50IGxldjs8YnI+CiZndDsgKzxicj4KJmd0OyArICZuYnNwOyAmbmJzcDtyYl9zY2FuX2FyZ3Mo YXJnYywgYXJndiwgJnF1b3Q7MDEmcXVvdDssICZhbXA7bGV2ZWwpOzxicj4KJmd0OyArPGJyPgom Z3Q7ICsgJm5ic3A7ICZuYnNwO2lmIChOSUxfUChsZXZlbCkpPGJyPgomZ3Q7ICsgJm5ic3A7ICZu YnNwOyBsZXYgPSAxOzxicj4KJmd0OyArICZuYnNwOyAmbmJzcDtlbHNlPGJyPgomZ3Q7ICsgJm5i c3A7ICZuYnNwOyBsZXYgPSBOVU0ySU5UKGxldmVsKTs8YnI+CiZndDsgKyAmbmJzcDsgJm5ic3A7 aWYgKGxldiAmbHQ7IDApPGJyPgomZ3Q7ICsgJm5ic3A7ICZuYnNwOyByYl9yYWlzZShyYl9lQXJn RXJyb3IsICZxdW90O25lZ2F0aXZlIGxldmVsICglZCkmcXVvdDssIGxldik7PGJyPgomZ3Q7ICs8 YnI+CiZndDsgKyAmbmJzcDsgJm5ic3A7cmV0dXJuIHJiX3RocmVhZF9iYWNrdHJhY2UodGh2YWws IGxldik7PGJyPgomZ3Q7ICt9PGJyPgomZ3Q7ICs8YnI+CiZndDsgJm5ic3A7Lyo8YnI+CiZndDsg Jm5ic3A7ICogJm5ic3A7K1RocmVhZCsgZW5jYXBzdWxhdGVzIHRoZSBiZWhhdmlvciBvZiBhIHRo cmVhZCBvZjxicj4KJmd0OyAmbmJzcDsgKiAmbmJzcDtleGVjdXRpb24sIGluY2x1ZGluZyB0aGUg bWFpbiB0aHJlYWQgb2YgdGhlIFJ1Ynkgc2NyaXB0Ljxicj4KJmd0OyBAQCAtMzg3Myw2ICszODkz LDcgQEAgSW5pdF9UaHJlYWQodm9pZCk8YnI+CiZndDsgJm5ic3A7ICZuYnNwOyAmbmJzcDtyYl9k ZWZpbmVfbWV0aG9kKHJiX2NUaHJlYWQsICZxdW90O2Fib3J0X29uX2V4Y2VwdGlvbj0mcXVvdDss IHJiX3RocmVhZF9hYm9ydF9leGNfc2V0LCAxKTs8YnI+CiZndDsgJm5ic3A7ICZuYnNwOyAmbmJz cDtyYl9kZWZpbmVfbWV0aG9kKHJiX2NUaHJlYWQsICZxdW90O3NhZmVfbGV2ZWwmcXVvdDssIHJi X3RocmVhZF9zYWZlX2xldmVsLCAwKTs8YnI+CiZndDsgJm5ic3A7ICZuYnNwOyAmbmJzcDtyYl9k ZWZpbmVfbWV0aG9kKHJiX2NUaHJlYWQsICZxdW90O2dyb3VwJnF1b3Q7LCByYl90aHJlYWRfZ3Jv dXAsIDApOzxicj4KJmd0OyArICZuYnNwOyAmbmJzcDtyYl9kZWZpbmVfbWV0aG9kKHJiX2NUaHJl YWQsICZxdW90O2NhbGxlciZxdW90OywgcmJfdGhyZWFkX2NhbGxlcl9tLCAtMSk7PGJyPgomZ3Q7 PGJyPgomZ3Q7ICZuYnNwOyAmbmJzcDsgJm5ic3A7cmJfZGVmaW5lX21ldGhvZChyYl9jVGhyZWFk LCAmcXVvdDtpbnNwZWN0JnF1b3Q7LCByYl90aHJlYWRfaW5zcGVjdCwgMCk7PGJyPgomZ3Q7PGJy Pgo8YnI+ClJvZ2VyIFBhY2sgd3JvdGU6Ojxicj4KJmd0OyBCdWcgIzk3NzogY2FsbGVyIGZvciBh bGwgdGhyZWFkcyBwYXRjaDxicj4KJmd0OyA8YSBocmVmPSJodHRwOi8vcmVkbWluZS5ydWJ5LWxh bmcub3JnL2lzc3Vlcy9zaG93Lzk3NyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly9yZWRtaW5lLnJ1 YnktbGFuZy5vcmcvaXNzdWVzL3Nob3cvOTc3PC9hPjxicj4KJmd0Ozxicj4KJmd0OyBBdXRob3I6 IFJvZ2VyIFBhY2s8YnI+CiZndDsgU3RhdHVzOiBPcGVuLCBQcmlvcml0eTogTm9ybWFsPGJyPgom Z3Q7PGJyPgomZ3Q7IEhlcmUgaXMgYSBwYXRjaCB3aGljaCBwcm92aWRlcyBiYWNrdHJhY2UgZm9y IGFsbCBjdXJyZW50IHRocmVhZHMsIGluc3RlYWQgb2YganVzdCB0aGUgY3VycmVudCBvbmUuPGJy PgomZ3Q7IDxhIGhyZWY9Imh0dHA6Ly9waDdzcG90LmNvbS9hcnRpY2xlcy9jYWxsZXJfZm9yX2Fs bF90aHJlYWRzIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3BoN3Nwb3QuY29tL2FydGljbGVzL2Nh bGxlcl9mb3JfYWxsX3RocmVhZHM8L2E+PGJyPgomZ3Q7IEF1dGhvciBzYWlkIGl0IHdvdWxkIGJl IGdyZWF0IHRvIGhhdmUgaXQgYWNjZXB0ZWQgdXBzdHJlYW0uPGJyPgomZ3Q7IFRob3VnaHRzPzxi cj4KJmd0OyAtPXI8YnI+CiZndDs8YnI+CiZndDs8YnI+CiZndDsgLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLTxicj4KJmd0OyA8YSBocmVmPSJodHRwOi8vcmVkbWluZS5y dWJ5LWxhbmcub3JnIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3JlZG1pbmUucnVieS1sYW5nLm9y ZzwvYT48YnI+CiZndDs8YnI+Cjxmb250IGNvbG9yPSIjODg4ODg4Ij48YnI+Cjxicj4KLS08YnI+ Ci8vIFNBU0FEQSBLb2ljaGkgYXQgYXRkb3QgZG90IG5ldDxicj4KPGJyPgo8L2ZvbnQ+PC9ibG9j a3F1b3RlPjwvZGl2Pjxicj4K --000325572b82daab73046bdf6190--