Newer
Older
minerva / Ports / citron / patches / 0002-Make-fiber-a-noop.patch
@minerva minerva on 13 Jul 3 KB Initial commit
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Ali Mohammad Pur <ali.mpfard@gmail.com>
Date: Fri, 11 Feb 2022 16:32:42 +0330
Subject: [PATCH] Make fiber a noop

Minerva doesn't have ucontext.
---
 src/fiber.c | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/fiber.c b/src/fiber.c
index e8a99f15443dbf21c3d2944df2eb99fb18723f3a..23afae64c68105146badce7e65d5802082ed5de8 100644
--- a/src/fiber.c
+++ b/src/fiber.c
@@ -49,6 +49,7 @@ extern int waitForAllFibers();
 #endif
 /* <HEADER */
 
+#ifndef __minerva__
 #include <malloc.h>
 #include <ucontext.h>
 
@@ -76,21 +77,25 @@ static int numFibers = 0;
 
 // The "main" execution context
 static ucontext_t mainContext;
+#endif
 
 // Sets all the fibers to be initially inactive
 void initFibers()
 {
+#ifndef __minerva__
     int i;
     for (i = 0; i < MAX_FIBERS; ++i) {
         fiberList[i].active = 0;
     }
 
     return;
+#endif
 }
 
 // Switches from a fiber to main or from main to a fiber
 void fiberYield()
 {
+#ifndef __minerva__
     // If we are in a fiber, switch to the main process
     if (inFiber) {
         // Switch to the main context
@@ -129,6 +134,7 @@ void fiberYield()
             fiberList[numFibers].active = 0;
         }
     }
+#endif
     return;
 }
 
@@ -137,16 +143,21 @@ void fiberYield()
 // context of execution.
 static void fiberStart(ctr_object* block)
 {
+#ifndef __minerva__
     fiberList[currentFiber].active = 1;
     ctr_block_run_here(block, NULL, block);
     fiberList[currentFiber].active = 0;
 
     // Yield control, but because active == 0, this will free the fiber
     fiberYield();
+#endif
 }
 
 int spawnFiber(ctr_object* block)
 {
+#ifdef __minerva__
+    return 0;
+#else
     if (numFibers == MAX_FIBERS)
         return LF_MAXFIBERS;
 
@@ -171,10 +182,12 @@ int spawnFiber(ctr_object* block)
     ++numFibers;
 
     return LF_NOERROR;
+#endif
 }
 
 int waitForAllFibers()
 {
+#ifndef __minerva__
     int fibersRemaining = 0;
 
     // If we are in a fiber, wait for all the *other* fibers to quit
@@ -187,12 +200,14 @@ int waitForAllFibers()
     // Execute the fibers until they quit
     while (numFibers > fibersRemaining)
         fiberYield();
+#endif
 
     return LF_NOERROR;
 }
 
 int waitForFiber(int id)
 {
+#ifndef __minerva__
     int fibersRemaining = id;
 
     // If we are in a fiber, wait for all the *other* fibers to quit
@@ -205,15 +220,18 @@ int waitForFiber(int id)
     // Execute the fibers until they quit
     while (numFibers > fibersRemaining)
         fiberYield();
+#endif
 
     return LF_NOERROR;
 }
 
 int yieldNTimes(int n)
 {
+#ifndef __minerva__
     while (--n != 0) {
         fiberYield();
     }
+#endif
     return LF_NOERROR;
 }
 
@@ -258,7 +276,7 @@ ctr_object* ctr_fiber_spawn(ctr_object* myself, ctr_argument* argumentList)
     int fiber = spawnFiber(argumentList->object);
     ctr_internal_object_add_property(
         fiberObj, ctr_build_string_from_cstring("fiberId"),
-        ctr_build_number_from_float(numFibers), CTR_CATEGORY_PRIVATE_PROPERTY);
+        ctr_build_number_from_float(0), CTR_CATEGORY_PRIVATE_PROPERTY);
     return fiberObj;
 }
 
@@ -381,7 +399,7 @@ void ctr_fiber_begin_init()
         CtrStdFiber, ctr_build_string_from_cstring("unpack:"), &ctr_fiber_assign);
     ctr_internal_object_add_property(
         CtrStdFiber, ctr_build_string_from_cstring("fiberId"),
-        ctr_build_number_from_float(numFibers), CTR_CATEGORY_PRIVATE_PROPERTY);
+        ctr_build_number_from_float(0), CTR_CATEGORY_PRIVATE_PROPERTY);
     CtrStdFiber->info.sticky = 1;
 
     ctr_internal_object_add_property(