xref: /aosp_15_r20/external/kotlinx.atomicfu/atomicfu/src/nativeInterop/cinterop/interop.def (revision 68017707106cb9da9fed635c150bc497c09c160f)
1---
2#include <stdio.h>
3#include <stdlib.h>
4#include <pthread.h>
5
6typedef struct lock_support {
7    volatile int locked;
8    pthread_mutex_t mutex;
9    pthread_cond_t cond;
10} lock_support_t;
11
12typedef struct mutex_node {
13    lock_support_t* mutex;
14    struct mutex_node* next;
15} mutex_node_t;
16
17lock_support_t* lock_support_init() {
18    lock_support_t * ls = (lock_support_t *) malloc(sizeof(lock_support_t));
19    ls->locked = 0;
20    pthread_mutex_init(&ls->mutex, NULL);
21    pthread_cond_init(&ls->cond, NULL);
22    return ls;
23}
24
25mutex_node_t* mutex_node_init(mutex_node_t* mutexNode) {
26    mutexNode->mutex = lock_support_init();
27    mutexNode->next = NULL;
28    return mutexNode;
29}
30
31void lock(lock_support_t* ls) {
32    pthread_mutex_lock(&ls->mutex);
33    while (ls->locked == 1) { // wait till locked are available
34        pthread_cond_wait(&ls->cond, &ls->mutex);
35    }
36    ls->locked = 1;
37    pthread_mutex_unlock(&ls->mutex);
38}
39
40void unlock(lock_support_t* ls) {
41    pthread_mutex_lock(&ls->mutex);
42    ls->locked = 0;
43    pthread_cond_broadcast(&ls->cond);
44    pthread_mutex_unlock(&ls->mutex);
45}