PokerUnicorn
Loading...
Searching...
No Matches
eventloop.h
Go to the documentation of this file.
1/*
2 * PokerUnicorn Server
3 * This project uses test network, NO real coin or NO real money involved.
4 * Copyright (C) 2023, Oğuzhan Eroğlu <meowingcate@gmail.com> (https://meowingcat.io)
5 * Licensed under GPLv3 License
6 * See LICENSE for more info
7 */
8
9/*
10 * Beware of the following:
11 * * If you are accessing/modifing a task, it is ok to do that in task functions.
12 * But if you are accessing/modifing a task in another thread, you should use
13 * `task->eventloop->mutex`.
14 * * Some of eventloop module functions are thread-safe, some are not.
15 * The ones that are provided as API are thread-safe, internal ones are not.
16 * Internal non-thread-safe ones are used in thread-safe functions.
17 * * Task functions are NOT called between `task->eventloop->mutex` lock/unlock.
18 */
19
20#pragma once
21
27#include <stdbool.h>
28#include <pthread.h>
29
30#include "sugar.h"
31#include "ref.h"
32#include "uniqid.h"
33
34static int tasks_count;
35
36typedef struct pkrsrv_eventloop pkrsrv_eventloop_t;
37
38typedef struct pkrsrv_eventloop_tasks pkrsrv_eventloop_tasks_t;
39typedef struct pkrsrv_eventloop_task pkrsrv_eventloop_task_t;
40
41typedef void (*pkrsrv_eventloop_task_func_t)(pkrsrv_eventloop_task_t* task);
42
50 pthread_mutex_t mutex;
51 pthread_cond_t cond;
53 pkrsrv_eventloop_tasks_t* tasks;
54};
55
63 LISTIFY(pkrsrv_eventloop_task_t*);
64};
65
85
91pkrsrv_eventloop_t* pkrsrv_eventloop_new();
96void pkrsrv_eventloop_free(pkrsrv_eventloop_t* eventloop);
101void pkrsrv_eventloop_run(pkrsrv_eventloop_t* eventloop);
106void pkrsrv_eventloop_stop(pkrsrv_eventloop_t* eventloop);
107
112pkrsrv_eventloop_task_t* pkrsrv_eventloop_task_new(pkrsrv_eventloop_t* eventloop, pkrsrv_eventloop_task_func_t fn, void* params);
117void pkrsrv_eventloop_task_free(pkrsrv_eventloop_task_t* task);
122void pkrsrv_eventloop_task_run(pkrsrv_eventloop_task_t* task);
123
128pkrsrv_eventloop_tasks_t* pkrsrv_eventloop_tasks_new();
133void pkrsrv_eventloop_tasks_free(pkrsrv_eventloop_tasks_t* tasks);
138void pkrsrv_eventloop_tasks_push(pkrsrv_eventloop_tasks_t* tasks, pkrsrv_eventloop_task_t* task);
143void pkrsrv_eventloop_tasks_prepend(pkrsrv_eventloop_tasks_t* tasks, pkrsrv_eventloop_task_t* task);
148void pkrsrv_eventloop_tasks_remove(pkrsrv_eventloop_tasks_t* tasks, pkrsrv_eventloop_task_t* task);
153pkrsrv_eventloop_task_t* pkrsrv_eventloop_tasks_pop(pkrsrv_eventloop_tasks_t* tasks);
154
160pkrsrv_eventloop_task_t* pkrsrv_eventloop_call(pkrsrv_eventloop_t* eventloop, pkrsrv_eventloop_task_func_t fn, void* params);
166pkrsrv_eventloop_task_t* pkrsrv_eventloop_call_after(pkrsrv_eventloop_t* eventloop, pkrsrv_eventloop_task_func_t func, void* params, int delay);
172pkrsrv_eventloop_task_t* pkrsrv_eventloop_call_immediate(pkrsrv_eventloop_t* eventloop, pkrsrv_eventloop_task_func_t func, void* params);
178pkrsrv_eventloop_task_t* pkrsrv_eventloop_call_immediate_after(pkrsrv_eventloop_t* eventloop, pkrsrv_eventloop_task_func_t func, void* params, int delay);
179
185void pkrsrv_eventloop_task_call(pkrsrv_eventloop_t* eventloop, pkrsrv_eventloop_task_t* task);
191void pkrsrv_eventloop_task_call_after(pkrsrv_eventloop_t* eventloop, pkrsrv_eventloop_task_t* task, int delay);
197void pkrsrv_eventloop_task_call_immediate(pkrsrv_eventloop_t* eventloop, pkrsrv_eventloop_task_t* task);
203void pkrsrv_eventloop_task_call_immediate_after(pkrsrv_eventloop_t* eventloop, pkrsrv_eventloop_task_t* task, int delay);
204
210void pkrsrv_eventloop_task_cancel(pkrsrv_eventloop_task_t* task);
void(* pkrsrv_eventloop_task_func_t)(pkrsrv_eventloop_task_t *task)
Definition eventloop.h:41
bool is_popped
Definition eventloop.h:81
bool is_queued
Definition eventloop.h:80
bool is_running
Definition eventloop.h:52
pkrsrv_uniqid_uuid_t id
Definition eventloop.h:74
bool is_called
Definition eventloop.h:82
pkrsrv_eventloop_tasks_t * tasks
Definition eventloop.h:53
pkrsrv_eventloop_task_func_t func
Definition eventloop.h:76
pthread_mutex_t mutex
Definition eventloop.h:50
int delay
Definition eventloop.h:78
pthread_t delay_thread
Definition eventloop.h:77
pthread_cond_t cond
Definition eventloop.h:51
pkrsrv_eventloop_t * eventloop
Definition eventloop.h:75
bool is_cancelled
Definition eventloop.h:83
void * params
Definition eventloop.h:79
void pkrsrv_eventloop_task_call_immediate(pkrsrv_eventloop_t *eventloop, pkrsrv_eventloop_task_t *task)
void pkrsrv_eventloop_tasks_free(pkrsrv_eventloop_tasks_t *tasks)
void pkrsrv_eventloop_free(pkrsrv_eventloop_t *eventloop)
pkrsrv_eventloop_t * pkrsrv_eventloop_new()
void pkrsrv_eventloop_tasks_prepend(pkrsrv_eventloop_tasks_t *tasks, pkrsrv_eventloop_task_t *task)
void pkrsrv_eventloop_tasks_remove(pkrsrv_eventloop_tasks_t *tasks, pkrsrv_eventloop_task_t *task)
void pkrsrv_eventloop_task_free(pkrsrv_eventloop_task_t *task)
void pkrsrv_eventloop_run(pkrsrv_eventloop_t *eventloop)
pkrsrv_eventloop_task_t * pkrsrv_eventloop_call_immediate_after(pkrsrv_eventloop_t *eventloop, pkrsrv_eventloop_task_func_t func, void *params, int delay)
pkrsrv_eventloop_tasks_t * pkrsrv_eventloop_tasks_new()
pkrsrv_eventloop_task_t * pkrsrv_eventloop_call_after(pkrsrv_eventloop_t *eventloop, pkrsrv_eventloop_task_func_t func, void *params, int delay)
void pkrsrv_eventloop_task_call(pkrsrv_eventloop_t *eventloop, pkrsrv_eventloop_task_t *task)
void pkrsrv_eventloop_stop(pkrsrv_eventloop_t *eventloop)
pkrsrv_eventloop_task_t * pkrsrv_eventloop_tasks_pop(pkrsrv_eventloop_tasks_t *tasks)
void pkrsrv_eventloop_tasks_push(pkrsrv_eventloop_tasks_t *tasks, pkrsrv_eventloop_task_t *task)
pkrsrv_eventloop_task_t * pkrsrv_eventloop_task_new(pkrsrv_eventloop_t *eventloop, pkrsrv_eventloop_task_func_t fn, void *params)
pkrsrv_eventloop_task_t * pkrsrv_eventloop_call_immediate(pkrsrv_eventloop_t *eventloop, pkrsrv_eventloop_task_func_t func, void *params)
void pkrsrv_eventloop_task_run(pkrsrv_eventloop_task_t *task)
void pkrsrv_eventloop_task_call_immediate_after(pkrsrv_eventloop_t *eventloop, pkrsrv_eventloop_task_t *task, int delay)
void pkrsrv_eventloop_task_call_after(pkrsrv_eventloop_t *eventloop, pkrsrv_eventloop_task_t *task, int delay)
pkrsrv_eventloop_task_t * pkrsrv_eventloop_call(pkrsrv_eventloop_t *eventloop, pkrsrv_eventloop_task_func_t fn, void *params)
Definition eventloop.h:48
Definition eventloop.h:71
Definition eventloop.h:61
#define PKRSRV_REF_COUNTEDIFY()
Makes a structure reference-counted.
Definition ref.h:70
#define LISTIFY(type)
Definition sugar.h:38
#define ITEMIFY(type)
Definition sugar.h:44
Definition uniqid.h:24