lib/sem: introduce compact creation calls

Zero-initialized semaphores timed on the monotonic clock is the
most common form used by applications. Allow people to write more
compact code by providing creation calls and static initializers aimed
at building these directly:

- evl_new_sem(), EVL_SEM_INITIALIZER() for zero-init semaphores
  timed on the monotonic clock.

- evl_new_sem_any() and EVL_SEM_ANY_INITIALIZER() usable for any
  initialization form, specifying the clock and init value.
This commit is contained in:
Philippe Gerum 2019-08-18 19:57:17 +02:00
parent 5af05a5020
commit a7a084ea15
14 changed files with 39 additions and 26 deletions

View File

@ -15,7 +15,7 @@
#define __SEM_ACTIVE_MAGIC 0xcb13cb13
#define __SEM_DEAD_MAGIC 0
int evl_new_sem(struct evl_sem *sem, int clockfd, int initval,
int evl_new_sem_any(struct evl_sem *sem, int clockfd, int initval,
const char *fmt, ...)
{
int fd;
@ -67,7 +67,7 @@ static int check_sanity(struct evl_sem *sem)
int efd;
if (sem->magic == __SEM_UNINIT_MAGIC) {
efd = evl_new_sem(sem,
efd = evl_new_sem_any(sem,
sem->uninit.clockfd,
sem->uninit.initval,
sem->uninit.name);

View File

@ -27,23 +27,29 @@ struct evl_sem {
#define __SEM_UNINIT_MAGIC 0xed15ed15
#define EVL_SEM_INITIALIZER(__name, __clockfd, __initval) { \
#define EVL_SEM_ANY_INITIALIZER(__name, __clockfd, __initval) {\
.magic = __SEM_UNINIT_MAGIC, \
.uninit = { \
.uninit = { \
.name = (__name), \
.clockfd = (__clockfd), \
.initval = (__initval), \
} \
}
#define EVL_SEM_INITIALIZER(__name) { \
EVL_SEM_ANY_INITIALIZER(__name, EVL_CLOCK_MONOTONIC, 0)
#ifdef __cplusplus
extern "C" {
#endif
int evl_new_sem(struct evl_sem *sem,
int evl_new_sem_any(struct evl_sem *sem,
int clockfd, int initval,
const char *fmt, ...);
#define evl_new_sem(__sem, __fmt, __args...) \
evl_new_sem_any(__sem, EVL_CLOCK_MONOTONIC, 0, __fmt, ##__args)
int evl_close_sem(struct evl_sem *sem);
int evl_get_sem(struct evl_sem *sem);

View File

@ -12,6 +12,7 @@
#include <linux/types.h>
#include <uapi/evl/types.h>
#include <uapi/evl/monitor.h>
#include <uapi/evl/clock.h>
struct evl_sem {
unsigned int magic;
@ -31,23 +32,29 @@ struct evl_sem {
#define __SEM_UNINIT_MAGIC 0xed15ed15
#define EVL_SEM_INITIALIZER(__name, __clockfd, __initval) { \
#define EVL_SEM_ANY_INITIALIZER(__name, __clockfd, __initval) {\
.magic = __SEM_UNINIT_MAGIC, \
.uninit = { \
.uninit = { \
.name = (__name), \
.clockfd = (__clockfd), \
.initval = (__initval), \
} \
}
#define EVL_SEM_INITIALIZER(__name) { \
EVL_SEM_ANY_INITIALIZER(__name, EVL_CLOCK_MONOTONIC, 0)
#ifdef __cplusplus
extern "C" {
#endif
int evl_new_sem(struct evl_sem *sem,
int evl_new_sem_any(struct evl_sem *sem,
int clockfd, int initval,
const char *fmt, ...);
#define evl_new_sem(__sem, __fmt, __args...) \
evl_new_sem_any(__sem, EVL_CLOCK_MONOTONIC, 0, __fmt, ##__args)
int evl_open_sem(struct evl_sem *sem,
const char *fmt, ...);

View File

@ -27,7 +27,7 @@
#define __SEM_ACTIVE_MAGIC 0xcb13cb13
#define __SEM_DEAD_MAGIC 0
int evl_new_sem(struct evl_sem *sem, int clockfd, int initval,
int evl_new_sem_any(struct evl_sem *sem, int clockfd, int initval,
const char *fmt, ...)
{
struct evl_monitor_attrs attrs;
@ -124,7 +124,7 @@ static int check_sanity(struct evl_sem *sem)
int efd;
if (sem->magic == __SEM_UNINIT_MAGIC) {
efd = evl_new_sem(sem,
efd = evl_new_sem_any(sem,
sem->uninit.clockfd,
sem->uninit.initval,
sem->uninit.name);

View File

@ -21,10 +21,10 @@ int main(int argc, char *argv[])
__Tcall_assert(ret, evl_init());
name = get_unique_name(EVL_MONITOR_DEV, 0);
__Tcall_assert(sfd, evl_new_sem(&sem, EVL_CLOCK_MONOTONIC, 0, name));
__Tcall_assert(sfd, evl_new_sem(&sem, name));
name = get_unique_name(EVL_MONITOR_DEV, 0);
__Fcall_assert(sfd, evl_new_sem(&sem, EVL_CLOCK_MONOTONIC, 0, name));
__Fcall_assert(sfd, evl_new_sem(&sem, name));
__Texpr_assert(sfd == -EEXIST);
return 0;

View File

@ -102,10 +102,10 @@ int main(int argc, char *argv[])
__Tcall_assert(tfd, evl_attach_self("monitor-event:%d", getpid()));
name = get_unique_name(EVL_MONITOR_DEV, 0);
__Tcall_assert(sfd, evl_new_sem(&c.sem, EVL_CLOCK_MONOTONIC, 0, name));
__Tcall_assert(sfd, evl_new_sem(&c.sem, name));
name = get_unique_name(EVL_MONITOR_DEV, 1);
__Tcall_assert(sfd, evl_new_sem(&c.start, EVL_CLOCK_MONOTONIC, 0, name));
__Tcall_assert(sfd, evl_new_sem(&c.start, name));
name = get_unique_name(EVL_MONITOR_DEV, 2);
__Tcall_assert(evfd, evl_new_event(&c.event, EVL_CLOCK_MONOTONIC, name));

View File

@ -100,10 +100,10 @@ int main(int argc, char *argv[])
__Tcall_assert(tfd, evl_attach_self("monitor-flags:%d", getpid()));
name = get_unique_name(EVL_MONITOR_DEV, 0);
__Tcall_assert(sfd, evl_new_sem(&c.sem, EVL_CLOCK_MONOTONIC, 0, name));
__Tcall_assert(sfd, evl_new_sem(&c.sem, name));
name = get_unique_name(EVL_MONITOR_DEV, 1);
__Tcall_assert(sfd, evl_new_sem(&c.start, EVL_CLOCK_MONOTONIC, 0, name));
__Tcall_assert(sfd, evl_new_sem(&c.start, name));
name = get_unique_name(EVL_MONITOR_DEV, 2);
__Tcall_assert(ffd, evl_new_flags(&c.flags, name));

View File

@ -75,10 +75,10 @@ int main(int argc, char *argv[])
__Tcall_assert(gfd, evl_new_mutex(&c.lock, name));
name = get_unique_name(EVL_MONITOR_DEV, 1);
__Tcall_assert(sfd, evl_new_sem(&c.sem, EVL_CLOCK_MONOTONIC, 0, name));
__Tcall_assert(sfd, evl_new_sem(&c.sem, name));
name = get_unique_name(EVL_MONITOR_DEV, 2);
__Tcall_assert(sfd, evl_new_sem(&c.start, EVL_CLOCK_MONOTONIC, 0, name));
__Tcall_assert(sfd, evl_new_sem(&c.start, name));
new_thread(&contender, SCHED_FIFO, HIGH_PRIO,
pi_contend_timeout, &c);

View File

@ -81,10 +81,10 @@ int main(int argc, char *argv[])
EVL_CLOCK_MONOTONIC, MEDIUM_PRIO, name));
name = get_unique_name(EVL_MONITOR_DEV, 2);
__Tcall_assert(sfd, evl_new_sem(&c.sem, EVL_CLOCK_MONOTONIC, 0, name));
__Tcall_assert(sfd, evl_new_sem(&c.sem, name));
name = get_unique_name(EVL_MONITOR_DEV, 3);
__Tcall_assert(sfd, evl_new_sem(&c.start, EVL_CLOCK_MONOTONIC, 0, name));
__Tcall_assert(sfd, evl_new_sem(&c.start, name));
new_thread(&contender, SCHED_FIFO, HIGH_PRIO,
pi_contend_timeout, &c);

View File

@ -63,7 +63,7 @@ static void test_steal(bool do_steal)
__Tcall_assert(gfd, evl_new_mutex(&c.lock, name));
name = get_unique_name(EVL_MONITOR_DEV, 1);
__Tcall_assert(sfd, evl_new_sem(&c.start, EVL_CLOCK_MONOTONIC, 0, name));
__Tcall_assert(sfd, evl_new_sem(&c.start, name));
c.acquired = false;
new_thread(&contender, SCHED_FIFO, LOW_PRIO, victim, &c);

View File

@ -66,7 +66,7 @@ int main(int argc, char *argv[])
__Tcall_assert(tfd, evl_attach_self("poll-sem:%d", getpid()));
name = get_unique_name(EVL_MONITOR_DEV, 0);
__Tcall_assert(sfd, evl_new_sem(&sem, EVL_CLOCK_MONOTONIC, 0, name));
__Tcall_assert(sfd, evl_new_sem(&sem, name));
__Tcall_assert(pollfd_in, evl_new_poll());
__Tcall_assert(ret, evl_add_pollfd(pollfd_in, sfd, POLLIN));

View File

@ -43,9 +43,9 @@ int main(int argc, char *argv[])
__Tcall_assert(tfd, evl_attach_self("sem-close-unblock:%d", getpid()));
name = get_unique_name(EVL_MONITOR_DEV, 0);
__Tcall_assert(sfd, evl_new_sem(&c.sem, EVL_CLOCK_MONOTONIC, 0, name));
__Tcall_assert(sfd, evl_new_sem(&c.sem, name));
name = get_unique_name(EVL_MONITOR_DEV, 1);
__Tcall_assert(sfd, evl_new_sem(&c.start, EVL_CLOCK_MONOTONIC, 0, name));
__Tcall_assert(sfd, evl_new_sem(&c.start, name));
new_thread(&contender, SCHED_FIFO, 1, sem_contend, &c);
__Tcall_assert(ret, evl_get_sem(&c.start));

View File

@ -42,7 +42,7 @@ int main(int argc, char *argv[])
__Tcall_assert(tfd, evl_attach_self("sem-close-unblock:%d", getpid()));
name = get_unique_name(EVL_MONITOR_DEV, 0);
__Tcall_assert(sfd, evl_new_sem(&c.sem, EVL_CLOCK_MONOTONIC, 0, name));
__Tcall_assert(sfd, evl_new_sem(&c.sem, name));
new_thread(&contender, SCHED_FIFO, 1, sem_contend, &c);
pthread_join(contender, NULL);

View File

@ -38,7 +38,7 @@ int main(int argc, char *argv[])
__Tcall_assert(tfd, evl_attach_self("sem-close-unblock:%d", getpid()));
name = get_unique_name(EVL_MONITOR_DEV, 0);
__Tcall_assert(sfd, evl_new_sem(&c.sem, EVL_CLOCK_MONOTONIC, 0, name));
__Tcall_assert(sfd, evl_new_sem(&c.sem, name));
new_thread(&contender, SCHED_FIFO, 1, sem_contend, &c);
__Tcall_assert(ret, evl_get_sem(&c.sem));