mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-11 09:18:05 +03:00
175 lines
4.0 KiB
Diff
175 lines
4.0 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Ali Mohammad Pur <ali.mpfard@gmail.com>
|
|
Date: Fri, 11 Feb 2022 16:37:54 +0330
|
|
Subject: [PATCH] Make coroutines a noop
|
|
|
|
Serenity doesn't have ucontext.
|
|
---
|
|
src/coroutine.c | 41 +++++++++++++++++++++++++++++++++++++++--
|
|
1 file changed, 39 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/src/coroutine.c b/src/coroutine.c
|
|
index 8497869..8215cfa 100644
|
|
--- a/src/coroutine.c
|
|
+++ b/src/coroutine.c
|
|
@@ -8,7 +8,7 @@
|
|
|
|
#if __APPLE__ && __MACH__
|
|
# include <sys/ucontext.h>
|
|
-#else
|
|
+#elif !defined(__serenity__)
|
|
# include <ucontext.h>
|
|
#endif
|
|
|
|
@@ -17,6 +17,7 @@
|
|
|
|
struct coroutine;
|
|
|
|
+#ifndef __serenity__
|
|
struct schedule {
|
|
char stack[STACK_SIZE];
|
|
ucontext_t main;
|
|
@@ -36,9 +37,13 @@ struct coroutine {
|
|
int status;
|
|
char* stack;
|
|
};
|
|
+#endif
|
|
|
|
struct coroutine* _co_new(struct schedule* S, coroutine_func func, void* ud)
|
|
{
|
|
+#ifdef __serenity__
|
|
+ return NULL;
|
|
+#else
|
|
struct coroutine* co = malloc(sizeof(*co));
|
|
co->func = func;
|
|
co->ud = ud;
|
|
@@ -48,16 +53,20 @@ struct coroutine* _co_new(struct schedule* S, coroutine_func func, void* ud)
|
|
co->status = COROUTINE_READY;
|
|
co->stack = NULL;
|
|
return co;
|
|
+#endif
|
|
}
|
|
|
|
void _co_delete(struct coroutine* co)
|
|
{
|
|
+#ifndef __serenity__
|
|
free(co->stack);
|
|
free(co);
|
|
+#endif
|
|
}
|
|
|
|
struct schedule* coroutine_open(void)
|
|
{
|
|
+#ifndef __serenity__
|
|
struct schedule* S = malloc(sizeof(*S));
|
|
S->nco = 0;
|
|
S->cap = DEFAULT_COROUTINE;
|
|
@@ -65,10 +74,14 @@ struct schedule* coroutine_open(void)
|
|
S->co = malloc(sizeof(struct coroutine*) * S->cap);
|
|
memset(S->co, 0, sizeof(struct coroutine*) * S->cap);
|
|
return S;
|
|
+#else
|
|
+ return NULL;
|
|
+#endif
|
|
}
|
|
|
|
void coroutine_close(struct schedule* S)
|
|
{
|
|
+#ifndef __serenity__
|
|
int i;
|
|
for (i = 0; i < S->cap; i++) {
|
|
struct coroutine* co = S->co[i];
|
|
@@ -79,10 +92,12 @@ void coroutine_close(struct schedule* S)
|
|
free(S->co);
|
|
S->co = NULL;
|
|
free(S);
|
|
+#endif
|
|
}
|
|
|
|
int coroutine_new(struct schedule* S, coroutine_func func, void* ud)
|
|
{
|
|
+#ifndef __serenity__
|
|
struct coroutine* co = _co_new(S, func, ud);
|
|
if (S->nco >= S->cap) {
|
|
int id = S->cap;
|
|
@@ -105,10 +120,14 @@ int coroutine_new(struct schedule* S, coroutine_func func, void* ud)
|
|
}
|
|
assert(0);
|
|
return -1;
|
|
+#else
|
|
+ return 0;
|
|
+#endif
|
|
}
|
|
|
|
static void mainfunc(uint32_t low32, uint32_t hi32)
|
|
{
|
|
+#ifndef __serenity__
|
|
uintptr_t ptr = (uintptr_t)low32 | ((uintptr_t)hi32 << 32);
|
|
struct schedule* S = (struct schedule*)ptr;
|
|
int id = S->running;
|
|
@@ -118,10 +137,12 @@ static void mainfunc(uint32_t low32, uint32_t hi32)
|
|
S->co[id] = NULL;
|
|
--S->nco;
|
|
S->running = -1;
|
|
+#endif
|
|
}
|
|
|
|
void coroutine_resume(struct schedule* S, int id)
|
|
{
|
|
+#ifndef __serenity__
|
|
assert(S->running == -1);
|
|
assert(id >= 0 && id < S->cap);
|
|
struct coroutine* C = S->co[id];
|
|
@@ -150,8 +171,10 @@ void coroutine_resume(struct schedule* S, int id)
|
|
default:
|
|
assert(0);
|
|
}
|
|
+#endif
|
|
}
|
|
|
|
+#ifndef __serenity__
|
|
static void _save_stack(struct coroutine* C, char* top)
|
|
{
|
|
char dummy = 0;
|
|
@@ -164,9 +187,11 @@ static void _save_stack(struct coroutine* C, char* top)
|
|
C->size = top - &dummy;
|
|
memcpy(C->stack, &dummy, C->size);
|
|
}
|
|
+#endif
|
|
|
|
void coroutine_yield(struct schedule* S)
|
|
{
|
|
+#ifndef __serenity__
|
|
int id = S->running;
|
|
assert(id >= 0);
|
|
struct coroutine* C = S->co[id];
|
|
@@ -175,15 +200,27 @@ void coroutine_yield(struct schedule* S)
|
|
C->status = COROUTINE_SUSPEND;
|
|
S->running = -1;
|
|
swapcontext(&C->ctx, &S->main);
|
|
+#endif
|
|
}
|
|
|
|
int coroutine_status(struct schedule* S, int id)
|
|
{
|
|
+#ifndef __serenity__
|
|
assert(id >= 0 && id < S->cap);
|
|
if (S->co[id] == NULL) {
|
|
return COROUTINE_DEAD;
|
|
}
|
|
return S->co[id]->status;
|
|
+#else
|
|
+ return COROUTINE_DEAD;
|
|
+#endif
|
|
}
|
|
|
|
-int coroutine_running(struct schedule* S) { return S->running; }
|
|
+int coroutine_running(struct schedule* S)
|
|
+{
|
|
+#ifndef __serenity__
|
|
+ return S->running;
|
|
+#else
|
|
+ return 0;
|
|
+#endif
|
|
+}
|