iidaの日記: 'mutex_proc_pthread_methods' undeclared PART2
'mutex_proc_pthread_methods' undeclaredの件を調べる羽目になった。こういうことのようだ。
- 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システム・コール
と変えている。
- 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関数がリンク可能
だった。
- 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変数にもコピーされる。
- 2190行目あたりから
APR_IFALLYES(header:pthread.h define:PTHREAD_PROCESS_SHARED dnl
func:pthread_mutexattr_setpshared dnl
file:/dev/zero,
hasprocpthreadser="1", hasprocpthreadser="0")で
- pthread.h ヘッダー・ファイルがあるかどうか
- PTHREAD_PROCESS_SHAREDマクロが定義されているかどうか
- pthread_mutexattr_setpshared関数がリンクできるかどうか
- /dev/zeroファイルがあるかどうか
を確認するが、ここで2については、ac_cv_func_pthread_mutexattr_setpshared変数に値が設定されているとその値が優先され、大きい[3]で設定してあるので、hasprocpthreadser変数の値は"0"になる (この値は1~4の全部が成立すると"1"、どれか1つ以上が不成立だと"0")。
- include/apr.h.inというひながたファイルに
#define APR_HAS_PROC_PTHREAD_SERIALIZE @hasprocpthreadser@
とあり、「@hasprocpthreadser@」の箇所が「0」に置換されて include/apr.hファイルに保存される。
- 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; で、変数未定義エラーが発生
'mutex_proc_pthread_methods' undeclared PART2 More ログイン