Changeset c3e510b


Ignore:
Timestamp:
Aug 7, 2023, 12:35:53 PM (16 months ago)
Author:
caparsons <caparson@…>
Branches:
master
Children:
27f2bef
Parents:
ff7f6d07
Message:

added support for resuming at resumer, added test for support and cleaned up uneeded include in pingpong exception test

Files:
2 added
3 edited

Legend:

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

    rff7f6d07 rc3e510b  
    325325    // poll iff nonlocal ehm is enabled
    326326    bool checked_poll( T & cor ) libcfa_public { return get_coroutine( cor )->ehm_state.ehm_enabled ? poll( cor ) : false; }
     327
     328    coroutine$ * resumer( T & cor ) libcfa_public { return get_coroutine( cor )->last; }
    327329}
    328330
     
    338340}
    339341
     342forall(exceptT & | { void $throwResume(exceptT &); })
     343void resumeAt( coroutine$ * receiver, exceptT & ex ) libcfa_public {
     344    nonlocal_exception * nl_ex = alloc();
     345    (*nl_ex){ (exception_t *)&ex };
     346    lock( receiver->ehm_state.buffer_lock __cfaabi_dbg_ctx2 );
     347    append( receiver->ehm_state.ehm_buffer, nl_ex );
     348    unlock( receiver->ehm_state.buffer_lock );
     349}
     350
    340351// Local Variables: //
    341352// mode: c //
  • libcfa/src/concurrency/coroutine.hfa

    rff7f6d07 rc3e510b  
    218218}
    219219
    220 // non local ehm routines
     220// non local ehm and coroutine utility routines
    221221forall(T & | is_coroutine(T)) {
    222222    void enable_ehm( T & cor );
     
    224224    bool poll( T & cor );
    225225    bool checked_poll( T & cor );
     226    coroutine$ * resumer( T & cor );
    226227}
    227228
     
    230231trait ehm_resume_at { void $throwResume(exceptT &); };
    231232
     233// general resumeAt
    232234forall(exceptT &, T & | ehm_resume_at( exceptT, T ))
    233235void resumeAt( T & receiver, exceptT & ex );
     236
     237// resumeAt for underlying coroutine$ type
     238forall(exceptT & | { void $throwResume(exceptT &); })
     239void resumeAt( coroutine$ * receiver, exceptT & ex );
    234240
    235241// Local Variables: //
  • tests/exceptions/pingpong_nonlocal.cfa

    rff7f6d07 rc3e510b  
    11#include <fstream.hfa>
    22#include <thread.hfa>
    3 #include <fstream.hfa>
    43#include <mutex_stmt.hfa>
    54
Note: See TracChangeset for help on using the changeset viewer.