Ignore:
Timestamp:
Jul 6, 2023, 4:51:42 PM (12 months ago)
Author:
caparsons <caparson@…>
Branches:
master
Children:
bef2245
Parents:
b4d2b3b
Message:

added support for non-local exceptions

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/coroutine.hfa

    rb4d2b3b r2fe64ba  
    1919#include "invoke.h"
    2020#include "../exception.hfa"
     21
     22//-----------------------------------------------------------------------------
     23// Type used to store and queue nonlocal exceptions on coroutines
     24struct nonlocal_exception {
     25    exception_t * the_exception;
     26    nonlocal_exception * next;
     27};
     28static inline void ?{} ( nonlocal_exception & this, exception_t * ex ) with(this) {
     29    the_exception = ex;
     30    next = 0p;
     31}
     32
     33static inline nonlocal_exception *& get_next( nonlocal_exception & this ) __attribute__((const)) {
     34    return this.next;
     35}
    2136
    2237//-----------------------------------------------------------------------------
     
    203218}
    204219
     220// non local ehm routines
     221forall(T & | is_coroutine(T)) {
     222    void enable_ehm( T & cor );
     223    void disable_ehm( T & cor );
     224    bool poll( T & cor );
     225    bool checked_poll( T & cor );
     226}
     227
     228// trait for exceptions able to be resumed at another coroutine
     229forall(exceptT &, T & | is_coroutine(T))
     230trait ehm_resume_at { void $throwResume(exceptT &); };
     231
     232forall(exceptT &, T & | ehm_resume_at( exceptT, T ))
     233void resumeAt( T & receiver, exceptT & ex );
     234
    205235// Local Variables: //
    206236// mode: c //
Note: See TracChangeset for help on using the changeset viewer.