Changeset f07e037 for src/libcfa/concurrency/monitor.c
- Timestamp:
- Feb 23, 2017, 4:24:35 PM (7 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, 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:
- 3bb51e1
- Parents:
- 485fdcf
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/monitor.c
r485fdcf rf07e037 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 // monitor.c -- 9 // 10 // Author : Thierry Delisle 11 // Created On : Thd Feb 23 12:27:26 2017 12 // Last Modified By : Thierry Delisle 13 // Last Modified On : -- 14 // Update Count : 0 15 // 16 17 #include "monitor" 18 19 #include "kernel_private.h" 20 21 void enter(monitor * this) { 22 lock( &this->lock ); 23 thread * thrd = this_thread(); 24 25 assert( this->entry_queue.tail != NULL ); 26 27 if( this->holder ) { 28 append( &this->entry_queue, thrd ); 29 ScheduleInternal( &this->lock ); 30 return; 31 } 32 else { 33 this->holder = thrd; 34 } 35 36 assert( this->entry_queue.tail != NULL ); 37 38 unlock( &this->lock ); 39 } 40 41 void leave(monitor * this) { 42 lock( &this->lock ); 43 44 assert( this->entry_queue.tail != NULL ); 45 46 thread * thrd = this_thread(); 47 assert( thrd == this->holder ); 48 49 this->holder = pop_head( &this->entry_queue ); 50 51 assert( this->entry_queue.tail != NULL ); 52 53 unlock( &this->lock ); 54 if( this->holder ) ScheduleThread( this->holder ); 55 }
Note: See TracChangeset
for help on using the changeset viewer.