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:
parent
5af05a5020
commit
a7a084ea15
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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, ...);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Reference in New Issue