パスワードを忘れた? アカウント作成
7770590 journal
プログラミング

iidaの日記: 'mutex_proc_pthread_methods' undeclared PART2

日記 by iida

'mutex_proc_pthread_methods' undeclaredの件を調べる羽目になった。こういうことのようだ。

  1. configureスクリプトのソース build/apr_hints.m4 249行目で

            if test $PLATOSVERS -ge 10; then
                APR_SETIFNULL(apr_lock_method, [USE_PROC_PTHREAD_SERIALIZE])
            else
                APR_SETIFNULL(apr_lock_method, [USE_FCNTL_SERIALIZE])
            fi

    とSolaris 9以前と10以降で、既定の直列化方式を

    • 10以降は、Pスレッド
    • 9以前は、fcntlシステム・コール

    と変えている。

  2. configureスクリプトのソース configure.in の 2146行目

        APR_CHECK_DEFINE(PTHREAD_PROCESS_SHARED, pthread.h)
        AC_CHECK_FUNCS(pthread_mutexattr_setpshared)

    • pthread.h ヘッダー・ファイルで PTHREAD_PROCESS_SHARED マクロが定義されているかどうか
    • pthread_mutexattr_setpshared関数がリンクできるかどうか

    を確認している。 当該マシンは実際

    • pthread.h ヘッダー・ファイルがあり
    • PTHREAD_PROCESS_SHARED マクロが 1 と定義されていて
    • pthread_mutexattr_setpshared関数がリンク可能

    だった。

  3. 2156行目あたりから、次の関数呼出し
    • pthread_mutexattr_init(&attr)
    • pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED)
    • pthread_mutex_init(&mutex, &attr)
    • pthread_mutexattr_destroy(&attr)
    • pthread_mutex_destroy(&mutex)

    が正常 (0) を戻すかどうかを調べている。 すべて正常終了すると、apr_cv_process_shared_works変数の値を「yes」 にする。 当該マシンでは、(なぜか) pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED) が異常終了するので、この変数の値は「no」に設定される。 このときのエラー・メッセージは、

      Operation not applicable

    で、Apacheの立ち上がらなかったときのメッセージは、pthread を無理矢理を使った結果だったようだ。 この変数の値は、ac_cv_func_pthread_mutexattr_setpshared変数にもコピーされる。

  4. 2190行目あたりから

    APR_IFALLYES(header:pthread.h define:PTHREAD_PROCESS_SHARED dnl
                 func:pthread_mutexattr_setpshared dnl
                 file:/dev/zero,
                 hasprocpthreadser="1", hasprocpthreadser="0")

    1. pthread.h ヘッダー・ファイルがあるかどうか
    2. PTHREAD_PROCESS_SHAREDマクロが定義されているかどうか
    3. pthread_mutexattr_setpshared関数がリンクできるかどうか
    4. /dev/zeroファイルがあるかどうか

      を確認するが、ここで2については、ac_cv_func_pthread_mutexattr_setpshared変数に値が設定されているとその値が優先され、大きい[3]で設定してあるので、hasprocpthreadser変数の値は"0"になる (この値は1~4の全部が成立すると"1"、どれか1つ以上が不成立だと"0")。

    5. include/apr.h.inというひながたファイルに

      #define APR_HAS_PROC_PTHREAD_SERIALIZE    @hasprocpthreadser@

      とあり、「@hasprocpthreadser@」の箇所が「0」に置換されて include/apr.hファイルに保存される。

    6. locks/unix/proc_mutex.cの312行目で、

      #if APR_HAS_PROC_PTHREAD_SERIALIZE

      というプリプロセッサif文があり、このマクロの値が0であるため、312~505行目はコンパイルされない。 一方、mutex_proc_pthread_methods変数はまさに493行目で定義されており、ここがコンパイルされていないために、835行目の #elif APR_USE_PROC_PTHREAD_SERIALIZE new_mutex->inter_meth = &mutex_proc_pthread_methods; で、変数未定義エラーが発生

この議論は、iida (8060)によって テキとトモのテキ禁止として作成されたが、今となっては 新たにコメントを付けることはできません。
typodupeerror

犯人はmoriwaka -- Anonymous Coward

読み込み中...