source: src/libcfa/concurrency/monitor.c @ f07e037

aaron-thesisarm-ehcleanup-dtorsdeferred_resndemanglerenumforall-pointer-decayjacob/cs343-translationjenkins-sandboxnew-astnew-ast-unique-exprnew-envno_listpersistent-indexerresolv-newwith_gc
Last change on this file since f07e037 was f07e037, checked in by Thierry Delisle <tdelisle@…>, 5 years ago

Basic monitor implementation

  • Property mode set to 100644
File size: 1.1 KB
Line 
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
21void 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
41void 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 TracBrowser for help on using the repository browser.