メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。

2008年2月19日火曜日

[Apache][CodeReading] Apache2.2.8コードリーディング19日目(1)

昨日読んだapr_thread_mutex_createの中で、
pthread_mutexattr関連を使っているところでちょっとひっかかった。

確かpthread_mutexattr_t構造体の領域はdestroy後触っちゃいけなかった気が・・・。
manによるとLinuxThreadでは何もしないと書いてあるが。

apr_thread_mutex_create()の中で、

54     if (flags & APR_THREAD_MUTEX_NESTED) {
55 pthread_mutexattr_t mattr;
56
57 rv = pthread_mutexattr_init(&mattr);
58 if (rv) return rv;
59
60 rv = pthread_mutexattr_settype(&mattr, PTHREAD_MUTEX_RECURSIVE);
61 if (rv) {
62 pthread_mutexattr_destroy(&mattr);
63 return rv;
64 }
65
66 rv = pthread_mutex_init(&new_mutex->mutex, &mattr);
67
68 pthread_mutexattr_destroy(&mattr);
69
 
なんていうふうに使われている。
mattrは自動変数。
つまりdestroyした後、スタックの積み具合によって対象の領域を触ってしまうのでは?
と思ってしまった。

で、気になったんでphtreadのソースを拝見。

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)
{
if (!mutex) return EINVAL;
if (attr && attr->pshared == PTHREAD_PROCESS_SHARED) return ENOSYS;

mutex->lock = 0;
mutex->recursion = 0;
mutex->kind = attr ? attr->kind : PTHREAD_MUTEX_DEFAULT;
mutex->owner = NOHANDLE;
mutex->event = mkevent(0, 0);
if (mutex->event < 0) return ENOSPC;
return 0;
}
 

見てみると、なーんてことは無い。
attrが指定されていたら、そのkindをコピーして
後は用無し。

なーんだ。
つまらん。

.

0 コメント: