tests: unblock on sem release

This commit is contained in:
Philippe Gerum 2019-02-15 15:43:58 +01:00
parent 45bc1c1481
commit 64d09d3b06
1 changed files with 62 additions and 0 deletions

62
tests/sem-close-unblock.c Normal file
View File

@ -0,0 +1,62 @@
/*
* SPDX-License-Identifier: MIT
*/
#include <sys/types.h>
#include <time.h>
#include <stdbool.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
#include <evenless/thread.h>
#include <evenless/clock.h>
#include <evenless/sem.h>
#include "helpers.h"
struct test_context {
struct evl_sem start;
struct evl_sem sem;
};
static void *sem_contend(void *arg)
{
struct test_context *p = arg;
int ret, tfd;
__Tcall_assert(tfd, evl_attach_self("sem-unblock-contend:%d", getpid()));
__Tcall_assert(ret, evl_put_sem(&p->start));
__Fcall_assert(ret, evl_get_sem(&p->sem));
__Texpr_assert(ret == -EIDRM);
__Fcall_assert(ret, evl_get_sem(&p->sem));
__Texpr_assert(ret == -EBADF);
return NULL;
}
int main(int argc, char *argv[])
{
struct test_context c;
pthread_t contender;
int tfd, sfd, ret;
char *name;
__Tcall_assert(tfd, evl_attach_self("sem-close-unblock:%d", getpid()));
name = get_unique_name("semaphore", 0);
__Tcall_assert(sfd, evl_new_sem(&c.sem, 0, EVL_CLOCK_MONOTONIC,
0, name));
name = get_unique_name("semaphore", 1);
__Tcall_assert(sfd, evl_new_sem(&c.start, 0, EVL_CLOCK_MONOTONIC,
0, name));
ret = new_thread(&contender, SCHED_FIFO, 1, sem_contend, &c);
if (ret < 0)
exit(1);
__Tcall_assert(ret, evl_get_sem(&c.start));
__Tcall_assert(ret, evl_release_sem(&c.sem));
pthread_join(contender, NULL);
evl_release_sem(&c.start);
return 0;
}