23 volatile unsigned int regs[64];
45 printf(
"async_thread started (VM:%d)!\n",
getVmID(meta));
48 read(
reg_fd, &buff,
sizeof(buff));
56 pthread_mutex_unlock(&(compl->
mutex));
60 printf(
"async_thread stoped (VM:%d)!\n",
getVmID(meta));
79 fprintf(stderr,
"Attempted to use ivshmem synchronization on non-"
103 fprintf(stderr,
"Failed to open shm_file: %s\n",
shm_file);
107 meta->
regs = mmap(meta->
regs, 256, PROT_READ | PROT_WRITE,
110 fprintf(stderr,
"Ivshmem regs mapped at %p\n", meta->
regs);
113 fprintf(stderr,
"Failed to spawn async_thread\n");
120 completion->
meta = meta;
122 pthread_mutexattr_init(&(completion->
attr));
123 pthread_mutexattr_setpshared(&(completion->
attr), PTHREAD_PROCESS_SHARED);
124 pthread_mutex_init(&(completion->
mutex), &(completion->
attr));
126 pthread_mutex_lock(&(completion->
mutex));
137 if (pthread_mutex_trylock(&(completion->
mutex))) {
141 pthread_mutex_lock(&(completion->
mutex));
163 int val = __sync_fetch_and_add(&(sem->
value), 1);
176 }
while ( (val = __sync_fetch_and_add(&(sem->
value), -1)) );
183 int val = sem->
value;
186 if (__sync_bool_compare_and_swap(&(sem->
value), val - 1, val)) {
241 printf(
"Waiting for async_thread to exit!\n");
242 pthread_join(meta->
thread, 0);
243 munmap(meta->
regs, 256);
#define arch_alloc_free(ALLOC, MEM)
void * arch_alloc_allocate(arch_alloc_s *alloc, size_t size)
struct utils_list_node utils_list_node_s
#define utils_list_for_each_safe(list, itr, tmp)
int utils_config_get_str(char *path, const char *key, char *value, size_t value_size, const char *def_val)
void utils_config_free_path(char *path)
int utils_config_get_bool(char *path, const char *key, int *value, int def_val)
char * utils_config_alloc_path(const char *path)
utils_list_node_s * utils_list_del(utils_list_s *list, utils_list_node_s *node)
void utils_list_node_init(utils_list_node_s *node, void *owner)
utils_list_s * utils_list_init(void *mem)
void utils_list_add(utils_list_s *list, utils_list_node_s *node)
#define utils_spinlock_lock(V)
#define utils_spinlock_init(V)
#define utils_spinlock_unlock(V)
volatile unsigned int regs[64]
volatile size_t completed
utils_list_node_s outstanding
utils_spinlock pending_lock
utils_list_s pending_list
async_semaphore_s semaphore
struct utils_list_node * next
void async_semaphore_inc(async_semaphore_s *sem)
void async_condition_wait(async_condition_s *cond)
void async_semaphore_init(async_meta_s *meta, async_semaphore_s *sem)
int async_semaphore_value(async_semaphore_s *sem)
void async_condition_unlock(async_condition_s *cond)
void async_condition_notify(async_condition_s *cond)
unsigned int getVmID(async_meta_s *meta)
void async_semaphore_dec(async_semaphore_s *sem)
void _add_completion(async_meta_s *meta, async_completion_s *completion)
void * async_thread(void *data)
void async_meta_init_once(async_meta_s *meta, arch_alloc_s *alloc)
void wakeupVm(async_meta_s *meta, unsigned int vm_id)
void async_completion_init(async_meta_s *meta, async_completion_s *completion)
void async_condition_init(async_meta_s *meta, async_condition_s *cond)
void async_completion_complete(async_completion_s *completion)
void async_meta_init_always(async_meta_s *meta)
int async_completion_check(async_completion_s *completion)
void async_completion_wait(async_completion_s *completion)
void async_condition_lock(async_condition_s *cond)
void async_meta_exit(async_meta_s *meta)