0xfee1dead

by SATO Yusuke (http://binary.nahi.to)
Dec 16
Permalink
strict weak ordering を満たす順序づけは一通りではないので、
別のやり方で順序を定義してもいい。
一般には、以下の条件が満たされる比較順序なら何でもいい。
  ある型の値 x, y, z に対して
    1. x
Permalink
788 :デフォルトの名無しさん:2007/12/16(日) 20:48:26 »784 コンテナの操作の計算量に関する要求は標準の23.1にあるわけだが、 ここで要求されている計算量は、操作に掛かる時間そのものについてじゃなくて、 「コンテナ内のオブジェクトを操作する回数」についてのものだと規定されてる たとえばvectorに対するpush_backなら、要素のコピーコンストラクタを償却O(1)回呼ぶってことだ で、libstdc++(たぶんstlportも)のdequeの実装だと、最悪O(n)回のポインタ代入が発生するけど、 要素のコピーコンストラクタは常に1回しか呼ばれないので、規格の要求するO(1)は満たしてることになる

【C++】STL(Standard Template Library)相談室 7

std::dequeの先頭末尾追加に関する、定数時間でいけるよ派vs償却定数時間じゃないとむりぽ派のやりとりのまとめ。

Dec 15
Permalink
plot2d([x+1], [x,1,100], [gnuplot_preamble, “set logscale x; set grid;”], [nticks,1])

[Maxima] vertical lines

gnuplot_preambleか。複数のグラフを重ねたいときは、第一引数を[x,x*x]とかか。チラ裏。

Dec 13
Permalink
IPO(inter-procedural optimization, プロシージャ間最適化) Edit 複数ソースファイルのコードをひとまとめに考えて、インライン展開などの最適化を行う。 -fwhole-program —combine を指定する

gcc - RenderNote

すべてのパッケージがこうやってコンパイル・リンクされてるLinuxディストリビューションというのを妄想したがどうか。だめか。iccめ。

Permalink
428 login:Penguin [sage] Date:2007/12/13(木) 23:57:28 ID:GAau1spk Be: >ローカルの時間を設定する >関数ってなんて名前なの? いきなり時刻を変更していいなら、settimeofday(2)か、stime(2)。後者は秒単位でしか設定できない。 徐々に時計をあわせたいなら、adjtime(3)かadjtimex(2)。たぶん。よく知らなかったのでntpdateコマ ンドをstraceして調べた範囲だが。 あと、ハードウェアが覚えている時刻を更新したいんだったら、/sbin/clock -w するか、/dev/rtcを open(2)してioctl(RTC_SET_TIME)も必要。これもclockコマンドをstraceしただけだけど。

Linuxプログラミング [bbs2chreader]

と、よく知りもしないことを2分で調べて書いてみた。1日1つくらい小ネタを仕込みたい俺としてはこのへんに粘着してみるのも悪くないと思った。root or CAP_SYS_TIMEが必要だと書き忘れたな。まぁどうでもいいか。

Dec 06
Permalink
ps -LfしたときのNLWP(スレッド数)って、/proc/pid/statusから取ってるっぽいな。もう少しマシな取り方はなかったっけかな。

Twitter / SATO Yusuke: ps -LfしたときのNLWP(スレッド数)って、/p…

/proc/pid/task/をreaddir_rするのも嫌だしなぁ。

Dec 05
Permalink
# pthread_cancel(pid) * a cancelled thread needs to be joined

lecture #

うげ、pthread_cancel()したスレッドってpthread_join()しないとリソースが漏れたりするんだっけ???

手元で試す…確かに、joinしないとdeferredでcancelしたスレッド用のスタックのメモリ(手元のFedora/2.6.21/NPTLだと10MB)がleakする。munmapされない。自分ではcancelなど滅多にしないこともあり、承知してなかった。detached状態で生成したスレッドだとどうなるかなぁ。

ま、ちゃんとcancelされたことを確認するためにもjoinしたほうがいいかな。でも、ちゃんと(遅延)cancelするのは難しいんだよな。やっぱcancelなんてやーめたと思い直すほど。

Nov 26
Permalink
_Unwind_Backtrace with contemporary libraries (i.e. those that have PT_GNU_EH_FRAME program header and .eh_frame_hdr binary search table) doesn’t use malloc, so I think it is safe to use it for backtrace ().

Jakub Jelinek - [PATCH] i386 backtrace () using _Unwind_Backtrace

malloc云々のところはパス。所在はlibgcc_s.so。手元のglibcだと、x86_64のbacktrace(3)は_Unwind_Backtrace()を使っているっぽくて、x86のは使ってないっぽかった。ぱっと見なので嘘かも。

% nm -D /lib64/libgcc_s.so.1 | grep _Unwind_Backtrace
00000031b08087b0 T _Unwind_Backtrace
% nm -D /lib/libgcc_s.so.1 | grep _Unwind_Backtrace
0000000000d5a650 T _Unwind_Backtrace

Permalink
If you are on x86-64 system, know that you have a set of system libraries with frame-pointers enabled, and compile all your applications with -fno-omit-frame-pointer, then you can enable the built-in perftools stack unwinder by passing the —enable-frame-pointers flag to configure.

http://google-perftools.googlecode.com/svn/trunk/INSTALL

google-perftoolsのソースのコメント、INSTALLファイルと、READMEファイルにはいろいろ面白いことが書いてあるので必見だ。ARM portにも関係する部分だと… まず、x86_64とかarmは、-O2で勝手に-fomit-frame-pointerするという点だな。もし、perftools組込みの、DWARF CFI (.eh_frameセクションとか) を使わない簡易backtracerを使うなら、perftools本体を-fno-omit-frame-pointerでコンパイルしないと明らかにまずい (ので./configure時に—enable-frame-pointer しないといかん>おれ)。解析対象も-fno-omit-frame-pointerしてやらないとだな。最初からインストールされてるDSOは、しょうがないねえ。この部分のプロファイルはちょっとおかしくなりますよということで。特にコールグラフとか。

あとは、libunwindを使えば、CFIのほうを見てbacktraceできるのでこの問題はなくなるとか(ARM対応してんのかねこれ。あと、READMEのほうに更なる問題が書いてあったかも)、glibcのbacktrace(3) and/or(あとで調べる) libgccの_Unwind_Backtrace()は、x86_64だと? (あとで調べる) 中でmallocしてるからdeadlockするかも、使うなとか、そのへんのあれこれも書いてある。

Permalink
ITIMER_VIRTUAL counts CPU time. When your process is sleeping, it’s not using CPU time, so the timer doesn’t run, and won’t expire.

setitimer and nanosleep issue.

元質問は、「nanosleepで寝てると、いつまで待ってもsetitimer(ITIMER_VIRTUAL)が発火しないんだけど?(SIGVTALRMが飛んでこないんだけど?)」というもの。引用部分が答え。ITIMER_PROFのSIGPROFならともかく、VIRTUALならシグナルされそうだと思ってしまいがちなので注意(さっきうっかり同じ疑問を抱いた)。カーネル内で仕事をしているならVIRTUALなシグナルは飛んでくるが、カーネル内で寝ている(CPUを使っていない)と飛んでこない。カウントされない。