miwarin / netbsd-gnats-memo

0 stars 0 forks source link

lib/41645 pthread_cond_timedwait(3) doesn't timeout if NULL is given as abstime argument #48

Open miwarin opened 9 years ago

miwarin commented 9 years ago

http://gnats.netbsd.org/41645

たしかに EINVAL は返ってこないけど仕様と見てもマニュアルを見ても「invalidのとき」とは書いてあるが「invalidとはNULLである」とか「NULLだった場合」とは書いていない。

#include <assert.h>
#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
  pthread_cond_t cond;
  pthread_mutex_t mtx;
  struct timespec abstime;
  int ret;

  /* Create a condition variable with default attributes. */
  assert(pthread_cond_init(&cond, NULL) == 0);

  /* Initialize mutex. */
  assert(pthread_mutex_init(&mtx, NULL) == 0);

  /* Acquire lock. */
  assert(pthread_mutex_lock(&mtx) == 0);

  assert(pthread_cond_timedwait(&cond, &mtx, NULL) == EINVAL);

  /* Release lock. */
  assert(pthread_mutex_unlock(&mtx) == 0);

  /* Cleanup. */
  assert(pthread_cond_destroy(&cond) == 0);
  assert(pthread_mutex_destroy(&mtx) == 0);

  printf("passed\n");

  return (EXIT_SUCCESS);
}

実行

% gcc t.c
% ./a.out
assertion "pthread_cond_timedwait(&cond, &mtx, NULL) == EINVAL" failed: file "t.c", line 23, function "main"
zsh: abort (core dumped)  ./a.out

printf してみると 0 が返る。つまり成功。

/*  assert(pthread_cond_timedwait(&cond, &mtx, NULL) == EINVAL);*/
  ret = pthread_cond_timedwait(&cond, &mtx, NULL);
  printf("%x\n", ret);
  printf("%x\n", ETIMEDOUT);
  printf("%x\n", EINVAL);

% ./a.out
0
3c
16
passed

仕様 pthread_cond_timedwait

マニュアル pthread_cond_timedwait(3) - NetBSD Manual Pages