aos/include/aos/thread_sync.h
Daniel Schwyn 6d444bf552 Main handout
Signed-off-by: Daniel Schwyn <daniel.schwyn@inf.ethz.ch>
2022-03-03 14:57:51 +01:00

86 lines
2.1 KiB
C

/**
* \file
* \brief Thread synchronization definitions.
*/
/*
* Copyright (c) 2011, ETH Zurich.
* All rights reserved.
*
* This file is distributed under the terms in the attached LICENSE file.
* If you do not find this file, copies can be found by writing to:
* ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
*/
#ifndef LIBBARRELFISH_THREAD_SYNC_H
#define LIBBARRELFISH_THREAD_SYNC_H
#include <stdint.h>
#include <limits.h> // for INT_MAX
#include <barrelfish_kpi/spinlocks_arch.h>
/// A thread of execution
struct thread;
struct thread_mutex {
volatile int locked;
struct thread *queue;
spinlock_t lock;
struct thread *holder;
};
#ifndef __cplusplus
# define THREAD_MUTEX_INITIALIZER \
{ .locked = 0, .queue = NULL, .lock = 0, .holder = NULL }
#else
# define THREAD_MUTEX_INITIALIZER \
{ 0, (struct thread *)NULL, 0, (struct thread *)NULL }
#endif
struct thread_cond {
struct thread *queue;
spinlock_t lock;
};
#ifndef __cplusplus
# define THREAD_COND_INITIALIZER \
{ .queue = NULL, .lock = 0 }
#else
# define THREAD_COND_INITIALIZER \
{ (struct thread *)NULL, 0 }
#endif
struct thread_sem {
volatile unsigned int value;
struct thread *queue;
spinlock_t lock;
};
#ifndef __cplusplus
# define THREAD_SEM_INITIALIZER \
{ .value = 0, .queue = NULL, .lock = 0 }
#else
# define THREAD_SEM_INITIALIZER \
{ 0, (struct thread *)NULL, 0 }
#endif
typedef int thread_once_t;
#define THREAD_ONCE_INIT INT_MAX
struct thread_barrier {
uint64_t count;
uint64_t max_count;
struct thread_sem mutex;
struct thread_sem barrier;
struct thread_sem reset;
};
#ifndef __cplusplus
# define THREAD_BARRIER_INITIALIZER \
{ .count = 0, .max_count 0, .mutex = NULL, \
.barrier = NULL, .reset = NULL }
#else
# define THREAD_BARRIER_INITIALIZER \
{ 0, 0, (struct thread_sem *) NULL, \
(struct thread_sem *) NULL, (struct thread_sem *) NULL }
#endif
#endif