Changeset c529a24 for doc/working/exception/impl
- Timestamp:
- Jun 16, 2017, 4:36:00 PM (6 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 365d553c
- Parents:
- 0892b1b
- Location:
- doc/working/exception/impl
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/working/exception/impl/exception.c
r0892b1b rc529a24 44 44 __throw_terminate(except); 45 45 // TODO: Default handler for resumption. 46 } 47 48 /* QUESTION: Could interupts interact with exception handling? 49 Ex. could an context switch stop execution, and we get an exception when we 50 come back? Is so resumption has to go: 51 + create node (init next and handler) 52 + prepare cleanup (add a cleanup hook with the ..._cleaup function) 53 also the cleanup has to be the next node, not just a pop from the list. 54 + push node on the list (change the existing node) 55 Which if an exception can come from anywhere, might just be required to ensure 56 the list is valid. 57 58 void __try_resume_setup(struct __try_resume_node * node, 59 bool (*handler)(exception except) { 60 node->next = shared_stack.top_resume; 61 node->try_to_handle = handler; 62 shared_stack.top_resume = node; 63 }*/ 64 65 // We have a single cleanup function 66 void __try_resume_cleanup(struct __try_resume_node * node) { 67 shared_stack.top_resume = node->next; 46 68 } 47 69 -
doc/working/exception/impl/exception.h
r0892b1b rc529a24 6 6 7 7 8 // These might be given simpler names and made public.9 8 void __throw_terminate(exception except) __attribute__((noreturn)); 10 9 void __rethrow_terminate(void) __attribute__((noreturn)); … … 20 19 }; 21 20 21 void __try_resume_cleanup(struct __try_resume_node * node); 22 22 23 struct __cleanup_hook {}; 23 24 … … 27 28 * and threads means that... well I'm going to get it working ignoring those 28 29 * first, then get it working with concurrency. 30 * Eventually there should be some global name that just gets you the right 31 * data block. 29 32 */ 30 33 struct shared_stack_t { 31 //struct lock lock;32 34 struct __try_resume_node * top_resume; 33 35 struct __try_resume_node * current_resume; -
doc/working/exception/impl/test-main.c
r0892b1b rc529a24 6 6 #include <stdbool.h> 7 7 8 // Translation Helpers: 9 #define CLEANUP(function) \ 10 struct __cleanup_hook __hidden_hook __attribute__((cleanup(function))) 11 12 #define SET_UP_RESUME_NODE(handler_function) \ 13 struct __try_resume_node node \ 14 __attribute__((cleanup(__try_resume_node_delete))); \ 15 __try_resume_node_new(&node, handler_function) 16 8 // Helps with manual translation. It may or may not get folded into the 9 // header, that depends on how it interacts with concurancy. 17 10 void __try_resume_node_new(struct __try_resume_node * node, 18 11 _Bool (*handler)(exception except)) { … … 20 13 shared_stack.top_resume = node; 21 14 node->try_to_handle = handler; 22 }23 24 void __try_resume_node_delete(struct __try_resume_node * node) {25 shared_stack.top_resume = node->next;26 15 } 27 16 … … 122 111 } 123 112 struct __try_resume_node node 124 __attribute__((cleanup(__try_resume_ node_delete)));113 __attribute__((cleanup(__try_resume_cleanup))); 125 114 __try_resume_node_new(&node, beta_handle1); 126 115 { … … 144 133 } 145 134 struct __try_resume_node node 146 __attribute__((cleanup(__try_resume_ node_delete)));135 __attribute__((cleanup(__try_resume_cleanup))); 147 136 __try_resume_node_new(&node, alpha_handle1); 148 137 { … … 260 249 } 261 250 struct __try_resume_node node 262 __attribute__((cleanup(__try_resume_ node_delete)));251 __attribute__((cleanup(__try_resume_cleanup))); 263 252 __try_resume_node_new(&node, fn_handle1); 264 253 { … … 279 268 } 280 269 struct __try_resume_node node 281 __attribute__((cleanup(__try_resume_ node_delete)));270 __attribute__((cleanup(__try_resume_cleanup))); 282 271 __try_resume_node_new(&node, fn_handle1); 283 272 { … … 349 338 } 350 339 struct __try_resume_node node 351 __attribute__((cleanup(__try_resume_ node_delete)));340 __attribute__((cleanup(__try_resume_cleanup))); 352 341 __try_resume_node_new(&node, reresume_handle1); 353 342 { … … 361 350 } 362 351 struct __try_resume_node node 363 __attribute__((cleanup(__try_resume_ node_delete)));352 __attribute__((cleanup(__try_resume_cleanup))); 364 353 __try_resume_node_new(&node, reresume_handle2); 365 354 { … … 409 398 } 410 399 struct __try_resume_node node 411 __attribute__((cleanup(__try_resume_ node_delete)));400 __attribute__((cleanup(__try_resume_cleanup))); 412 401 __try_resume_node_new(&node, foe_handle1); 413 402 { … … 456 445 } 457 446 struct __try_resume_node node 458 __attribute__((cleanup(__try_resume_ node_delete)));447 __attribute__((cleanup(__try_resume_cleanup))); 459 448 __try_resume_node_new(&node, fee_handle1); 460 449 {
Note: See TracChangeset
for help on using the changeset viewer.