source: src/libcfa/concurrency/threads @ c5cb6130

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsdeferred_resndemanglerenumforall-pointer-decayjacob/cs343-translationjenkins-sandboxnew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newwith_gc
Last change on this file since c5cb6130 was 78b3f52, checked in by Thierry Delisle <tdelisle@…>, 8 years ago

Ugly but working coroutines

  • Property mode set to 100644
File size: 2.0 KB
Line 
1//                              -*- Mode: CFA -*-
2//
3// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
4//
5// The contents of this file are covered under the licence agreement in the
6// file "LICENCE" distributed with Cforall.
7//
8// threads --
9//
10// Author           : Thierry Delisle
11// Created On       : Mon Nov 28 12:27:26 2016
12// Last Modified By : Thierry Delisle
13// Last Modified On : Mon Nov 28 12:27:26 2016
14// Update Count     : 0
15//
16
17#ifndef __THREADS_H__
18#define __THREADS_H__
19
20#include <stdbool.h>
21
22extern "C" {
23      struct coVtable {
24            void (*main)(void*);
25            struct coroutine* (*this_coroutine)(void*);
26      };
27
28      struct coStack_t {
29            unsigned int size;          // size of stack
30            void *storage;                      // pointer to stack
31            void *limit;                        // stack grows towards stack limit
32            void *base;                         // base of stack
33            void *context;                      // address of cfa_context_t
34            void *top;                          // address of top of storage
35            bool userStack;     
36      };
37
38
39      enum coroutine_state { Start, Inactive, Active, Halt };
40
41      struct coroutine {
42            coStack_t stack;
43            const char *name;                   // textual name for coroutine/task, initialized by uC++ generated code
44            int errno_;                         // copy of global UNIX variable errno
45            coroutine_state state;            // current execution status for coroutine
46            bool notHalted;                     // indicate if execuation state is not halted
47
48            coroutine *starter;         // first coroutine to resume this one
49            coroutine *last;                    // last coroutine to resume this one
50      };
51}
52
53void ?{}(coStack_t* this);
54
55void ?{}(coroutine* this);
56
57trait coroutine_t(dtype T) {
58      coroutine* this_coroutine(T* this);
59      void co_main(T* this);
60      coVtable* vtable(T* this);
61};
62
63forall(dtype T | coroutine_t(T))
64void start(T* cor);
65
66void suspend(void);
67
68forall(dtype T | coroutine_t(T))
69void resume(T* cor);
70
71#endif //__THREADS_H__
72
73// Local Variables: //
74// mode: c //
75// tab-width: 4 //
76// End: //
Note: See TracBrowser for help on using the repository browser.