今日もApache2.2.8コードリーディング。
やっとこさっとこデバッグログ実出力完了。
場所はApache起動直後の初期化部分。
allocator、poolの初期化が終わって、
apr_thread_mutex_createをしようかというところ。
その中で、apr_pcallocという関数がコールされているんだけど、
APR_POOL_DEBUGを有効にしてコンパイルすると
apr_pcallocの代わりにapr_pcalloc_debugという関数が呼ばれるようになる。
んで、この関数の中をいくと、デバッグログを出力するところがあるんだけど、
そこ。
今日読んだところは、
- apr_file_write()/Apache2.2.8
- apr_wait_for_io_or_timeout()/Apache2.2.8
- APR_STATUS_IS_EINTRマクロ(その他)/Apache2.2.8
- APR_STATUS_IS_EINTRマクロ(NETWARE)/Apache2.2.8
- APR_STATUS_IS_EINTRマクロ(WIN32)/Apache2.2.8
- APR_STATUS_IS_EINTRマクロ(OS2)/Apache2.2.8
- SOCEINTRマクロ/Apache2.2.8
- SOCBASEERRマクロ/Apache2.2.8
- APR_EINTRマクロ/Apache2.2.8
- apr_pollset_poll()(select)/Apache2.2.8
- apr_pollset_poll()(poll)/Apache2.2.8
- get_revent()(poll)/Apache2.2.8
- apr_pollset_poll()(port)/Apache2.2.8
- get_revent()(port)/Apache2.2.8
- APR_EGENERALマクロ/Apache2.2.8
- apr_pollset_poll()(kqueue)/Apache2.2.8
- apr_time_usecマクロ/Apache2.2.8
- apr_time_secマクロ/Apache2.2.8
- APR_USEC_PER_SECマクロ/Apache2.2.8
- APR_TIME_Cマクロ/Apache2.2.8
- APR_INT64_Cマクロ/Apache2.2.8
- get_kqueue_revent()/Apache2.2.8
やっとapr_pollset_poll全種類読破。
そして、apr_pollset_pollが読み終わったことで、apr_wait_for_io_or_timeout()も終了。
今日のメインはapr_file_write。
apr_file_writeは、簡単に言うと、バッファリングありの出力と、バッファリングなしの出力をこなす。
バッファリングありかどうかは、apr_file_t構造体にそういう設定があるので、
その設定値によって決まる。
書き込み時にEAGAINやEWOULDBLOCKを伴ってエラーになった場合、
apr_wait_for_io_or_timeout()をコールする。
リソースが一時的に使用不可になっているので、使用可能になるまで待つ。
使用可能になるまで待つのだが、その後使用可能になったのにもかかわらず
また一時的にリソースが使用不可になると、出力バイト数を半分にしてしまう。
半分にしては書き込み、また半分にしては書き込み、というのを、書き込めるか、エラーが
発生するか、writeシステムコールが0を返すまで繰り返される。
通常のファイルの場合、出力予定バイト数が0にさえなれば、
writeシステムコールは0を返すのだが、特殊ファイルの場合は
下手をすると無限ループってことも有り得るじゃないかなー。
確か、特殊ファイルの場合の出力バイト数が0だったときの動作って
未定義だった気がする。
まぁ、それは置いといて、
apr_file_writeを使って書き込みをした場合、
書き込めたバイト数が、書き込みたいバイト数(パラメータに渡したバイト数)と
違っていた場合、リソースが頻繁に「一時的に使用不可」になっている
ということか。
明日はこのapr_file_writeを使っているところから読む予定。
おしまい。
.
0 コメント:
コメントを投稿