Ruby 2.7.7p221 (2022-11-24 revision 168ec2b1e5ad0e4688e963d9de019557c78feed9)
Context.h
Go to the documentation of this file.
1/*
2 * This file is part of the "Coroutine" project and released under the MIT License.
3 *
4 * Created by Samuel Williams on 3/11/2018.
5 * Copyright, 2018, by Samuel Williams. All rights reserved.
6*/
7
8#pragma once
9
10#include <assert.h>
11#include <string.h>
12
13#define COROUTINE __attribute__((noreturn, fastcall)) void
14#define COROUTINE_LIMITED_ADDRESS_SPACE
15
17
19{
20 void **stack_pointer;
21};
22
23typedef COROUTINE(* coroutine_start)(struct coroutine_context *from, struct coroutine_context *self) __attribute__((fastcall));
24
25static inline void coroutine_initialize_main(struct coroutine_context * context) {
26 context->stack_pointer = NULL;
27}
28
29static inline void coroutine_initialize(
30 struct coroutine_context *context,
31 coroutine_start start,
32 void *stack,
33 size_t size
34) {
35 assert(start && stack && size >= 1024);
36
37 // Stack grows down. Force 16-byte alignment.
38 char * top = (char*)stack + size;
39 context->stack_pointer = (void**)((uintptr_t)top & ~0xF);
40
41 *--context->stack_pointer = NULL;
42 *--context->stack_pointer = (void*)start;
43
45 memset(context->stack_pointer, 0, sizeof(void*) * COROUTINE_REGISTERS);
46}
47
48struct coroutine_context * coroutine_transfer(struct coroutine_context * current, struct coroutine_context * target) __attribute__((fastcall));
49
50static inline void coroutine_destroy(struct coroutine_context * context)
51{
52 context->stack_pointer = NULL;
53}
COROUTINE(* coroutine_start)(struct coroutine_context *from, struct coroutine_context *self)
Definition: Context.h:22
struct coroutine_context * coroutine_transfer(struct coroutine_context *current, struct coroutine_context *target)
Definition: Context.c:136
@ COROUTINE_REGISTERS
Definition: Context.h:15
unsigned int top
Definition: nkf.c:4323
#define NULL
void * memset(void *, int, size_t)
unsigned int size
__uintptr_t uintptr_t
#define assert
rb_control_frame_t * __attribute__((__fastcall__)) *rb_insn_func_t)(rb_execution_context_t *
struct coroutine_context * from
Definition: Context.h:37
void ** stack_pointer
Definition: Context.h:19
void * stack
Definition: Context.h:29
#define COROUTINE
Definition: Context.h:13