昨日読んだ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 コメント:
コメントを投稿