Index: libcfa/src/concurrency/coroutine.cfa
===================================================================
--- libcfa/src/concurrency/coroutine.cfa	(revision c46c9992236856235ca6f5779f33a32cc75195a5)
+++ libcfa/src/concurrency/coroutine.cfa	(revision df8ba61a560c37035667d49f8da03d295dd8b96e)
@@ -318,7 +318,12 @@
 void defaultResumeAtHandler( exception_t * except ) {
     __cfaehm_allocate_exception( except );
-    free( except );
     __cfaehm_begin_unwind( (void(*)(exception_t *))defaultTerminationHandler );
 }
+
+struct ehm_cleanup {
+	exception_t * ex;
+};
+
+void ^?{}( ehm_cleanup & this ) { free( this.ex ); }
 
 bool poll( coroutine$ * cor ) libcfa_public {
@@ -330,10 +335,8 @@
     // otherwise loop and throwResume all pending exceptions
     while ( nl_ex != 0p ){
-        exception_t * ex = nl_ex->the_exception;
+		ehm_cleanup ex_holder{ nl_ex->the_exception };
         free( nl_ex );
-        __cfaehm_throw_resume( ex, defaultResumeAtHandler );
+        __cfaehm_throw_resume( ex_holder.ex , defaultResumeAtHandler );
         
-        // only reached if resumption handled. other dealloc handled in defaultResumeAtHandler
-        free( ex );
         nl_ex = pop_ehm_head( cor );
     }
