
The ocf_async_lock may be used in atomic context, thus we need to replace synchronization primitives to non-sleeping variants. Signed-off-by: Robert Baldyga <robert.baldyga@intel.com>
51 lines
1.3 KiB
C
51 lines
1.3 KiB
C
/*
|
|
* Copyright(c) 2019 Intel Corporation
|
|
* SPDX-License-Identifier: BSD-3-Clause-Clear
|
|
*/
|
|
|
|
#ifndef __UTILS_ASYNC_LOCK_H__
|
|
#define __UTILS_ASYNC_LOCK_H__
|
|
|
|
#include "ocf_env.h"
|
|
|
|
struct ocf_async_lock {
|
|
struct list_head waiters;
|
|
env_spinlock waiters_lock;
|
|
uint32_t rd;
|
|
uint32_t wr;
|
|
uint32_t waiter_priv_size;
|
|
};
|
|
|
|
typedef struct ocf_async_lock *ocf_async_lock_t;
|
|
|
|
typedef struct ocf_async_lock_waiter *ocf_async_lock_waiter_t;
|
|
|
|
typedef void (*ocf_async_lock_end_t)(ocf_async_lock_waiter_t waiter, int error);
|
|
|
|
int ocf_async_lock_init(ocf_async_lock_t lock, uint32_t waiter_priv_size);
|
|
|
|
void ocf_async_lock_deinit(ocf_async_lock_t lock);
|
|
|
|
ocf_async_lock_waiter_t ocf_async_lock_new_waiter(ocf_async_lock_t lock,
|
|
ocf_async_lock_end_t cmpl);
|
|
|
|
ocf_async_lock_t ocf_async_lock_waiter_get_lock(ocf_async_lock_waiter_t waiter);
|
|
|
|
void *ocf_async_lock_waiter_get_priv(ocf_async_lock_waiter_t waiter);
|
|
|
|
void ocf_async_lock(ocf_async_lock_waiter_t waiter);
|
|
|
|
int ocf_async_trylock(struct ocf_async_lock *lock);
|
|
|
|
void ocf_async_unlock(struct ocf_async_lock *lock);
|
|
|
|
void ocf_async_read_lock(ocf_async_lock_waiter_t waiter);
|
|
|
|
int ocf_async_read_trylock(struct ocf_async_lock *lock);
|
|
|
|
void ocf_async_read_unlock(struct ocf_async_lock *lock);
|
|
|
|
bool ocf_async_is_locked(struct ocf_async_lock *lock);
|
|
|
|
#endif /* __UTILS_ASYNC_LOCK_H__ */
|