Ignore:
Timestamp:
Feb 23, 2017, 4:24:35 PM (6 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
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:
3bb51e1
Parents:
485fdcf
Message:

Basic monitor implementation

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
     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 TracChangeset for help on using the changeset viewer.