chill()
DTraceアクションブロックを呼び出すと、timestamp
変数は増加しますがvtimestamp
sumが増加しない理由を理解しようとしますwalltimestamp
。
timestamp
以下は、呼び出し後の増加を示す例ですchill()
。
# dtrace -w -c true -n 'pid$target:::entry {self->t = $1; chill(1); printf("%d\n", $1 - self->t);}' timestamp
dtrace: description 'pid$target:::entry ' matched 3082 probes
dtrace: allowing destructive actions
dtrace: pid 6734 has exited
CPU ID FUNCTION:NAME
5 83475 _r_debug_postinit:entry 11258
5 85771 atexit:entry 2218
5 86468 __libc_atexit:entry 491
5 86428 exit:entry 441
5 85397 __cxa_thread_call_dtors:entry 441
5 86213 __cxa_finalize:entry 447
5 86213 __cxa_finalize:entry 565
5 83470 _rtld_addr_phdr:entry 454
5 86213 __cxa_finalize:entry 431
5 83470 _rtld_addr_phdr:entry 1645
5 84405 _exit:entry 432
同じスクリプトを実行しますがwalltimestamp
(またはvtimestamp
)を使用すると、カウンタが増加しないことがわかります。
# dtrace -w -c true -n 'pid$target:::entry {self->t = $1; chill(1); printf("%d\n", $1 - self->t);}' walltimestamp
dtrace: description 'pid$target:::entry ' matched 3082 probes
dtrace: allowing destructive actions
dtrace: pid 6707 has exited
CPU ID FUNCTION:NAME
4 83475 _r_debug_postinit:entry 0
4 85771 atexit:entry 0
4 86468 __libc_atexit:entry 0
4 86428 exit:entry 0
4 85397 __cxa_thread_call_dtors:entry 0
4 86213 __cxa_finalize:entry 0
4 86213 __cxa_finalize:entry 0
4 83470 _rtld_addr_phdr:entry 0
4 86213 __cxa_finalize:entry 0
4 83470 _rtld_addr_phdr:entry 0
4 84405 _exit:entry 0
これは、DTraceコードを実行しても増加しないため理解できますが、ここでは動作をvtimestamp
理解していません。walltimestamp
amd64でFreeBSD 13.1-RELEASE-p1を実行しています。
答え1
明らかにこれはDTraceのバグです。明らかに、実装はchill()
変数のキャッシュされた値のみを無効にしますtimestamp
が、forの実装はそうではありません。walltimestamp
これは間違っています。
回答をいただいたMark Johnstonに感謝します。FreeBSD DTraceメーリングリスト。