#pragma once

typedef osEventFlagsId_t FuriApiLock;

#define API_LOCK_EVENT (1U << 0)

#define API_LOCK_INIT_LOCKED() osEventFlagsNew(NULL);

#define API_LOCK_WAIT_UNTIL_UNLOCK(_lock) \
    osEventFlagsWait(_lock, API_LOCK_EVENT, osFlagsWaitAny, osWaitForever);

#define API_LOCK_FREE(_lock) osEventFlagsDelete(_lock);

#define API_LOCK_UNLOCK(_lock) osEventFlagsSet(_lock, API_LOCK_EVENT);

#define API_LOCK_WAIT_UNTIL_UNLOCK_AND_FREE(_lock) \
    API_LOCK_WAIT_UNTIL_UNLOCK(_lock);             \
    API_LOCK_FREE(_lock);