source: libcfa/src/concurrency/locks.hfa @ ea837e94

ADTarm-ehast-experimentalenumforall-pointer-decayjacob/cs343-translationnew-ast-unique-exprpthread-emulationqualifiedEnum
Last change on this file since ea837e94 was f19497c, checked in by Thierry Delisle <tdelisle@…>, 4 years ago

Fixed missing try_lock in locks based on 'blocking_lock'

  • Property mode set to 100644
File size: 5.2 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2021 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// locks.hfa -- PUBLIC
8// Runtime locks that used with the runtime thread system.
9//
10// Author           : Colby Alexander Parsons
11// Created On       : Thu Jan 21 19:46:50 2021
12// Last Modified By :
13// Last Modified On :
14// Update Count     :
15//
16
17#pragma once
18
19#include <stdbool.h>
20
21#include "bits/weakso_locks.hfa"
22
23#include "time_t.hfa"
24#include "time.hfa"
25
26//----------
27struct single_acquisition_lock {
28        inline blocking_lock;
29};
30
31static inline void  ?{}( single_acquisition_lock & this ) {((blocking_lock &)this){ false, false };}
32static inline void ^?{}( single_acquisition_lock & this ) {}
33static inline void   lock      ( single_acquisition_lock & this ) { lock    ( (blocking_lock &)this ); }
34static inline void   try_lock  ( single_acquisition_lock & this ) { try_lock( (blocking_lock &)this ); }
35static inline void   unlock    ( single_acquisition_lock & this ) { unlock  ( (blocking_lock &)this ); }
36static inline void   on_wait   ( single_acquisition_lock & this ) { on_wait ( (blocking_lock &)this ); }
37static inline void   on_notify ( single_acquisition_lock & this, struct $thread * t ) { on_notify( (blocking_lock &)this, t ); }
38static inline void   set_recursion_count( single_acquisition_lock & this, size_t recursion ) { set_recursion_count( (blocking_lock &)this, recursion ); }
39static inline size_t get_recursion_count( single_acquisition_lock & this ) { return get_recursion_count( (blocking_lock &)this ); }
40
41//----------
42struct owner_lock {
43        inline blocking_lock;
44};
45
46static inline void  ?{}( owner_lock & this ) {((blocking_lock &)this){ true, true };}
47static inline void ^?{}( owner_lock & this ) {}
48static inline void   lock     ( owner_lock & this ) { lock    ( (blocking_lock &)this ); }
49static inline void   try_lock ( owner_lock & this ) { try_lock( (blocking_lock &)this ); }
50static inline void   unlock   ( owner_lock & this ) { unlock  ( (blocking_lock &)this ); }
51static inline void   on_wait  ( owner_lock & this ) { on_wait ( (blocking_lock &)this ); }
52static inline void   on_notify( owner_lock & this, struct $thread * t ) { on_notify( (blocking_lock &)this, t ); }
53static inline void   set_recursion_count( owner_lock & this, size_t recursion ) { set_recursion_count( (blocking_lock &)this, recursion ); }
54static inline size_t get_recursion_count( owner_lock & this ) { return get_recursion_count( (blocking_lock &)this ); }
55
56//-----------------------------------------------------------------------------
57// is_blocking_lock
58trait is_blocking_lock(L & | sized(L)) {
59        // For synchronization locks to use when acquiring
60        void on_notify( L &, struct $thread * );
61
62        // For synchronization locks to use when releasing
63        void on_wait( L & );
64
65        // to get recursion count for cond lock to reset after waking
66        size_t get_recursion_count( L & );
67
68        // to set recursion count after getting signalled;
69        void set_recursion_count( L &, size_t recursion );
70};
71
72//-----------------------------------------------------------------------------
73// info_thread
74// the info thread is a wrapper around a thread used
75// to store extra data for use in the condition variable
76forall(L & | is_blocking_lock(L)) {
77        struct info_thread;
78
79        // for use by sequence
80        info_thread(L) *& Back( info_thread(L) * this );
81        info_thread(L) *& Next( info_thread(L) * this );
82}
83
84//-----------------------------------------------------------------------------
85// Synchronization Locks
86forall(L & | is_blocking_lock(L)) {
87        struct condition_variable {
88                // Spin lock used for mutual exclusion
89                __spinlock_t lock;
90
91                // List of blocked threads
92                Sequence( info_thread(L) ) blocked_threads;
93
94                // Count of current blocked threads
95                int count;
96        };
97
98        void  ?{}( condition_variable(L) & this );
99        void ^?{}( condition_variable(L) & this );
100
101        bool notify_one( condition_variable(L) & this );
102        bool notify_all( condition_variable(L) & this );
103
104        uintptr_t front( condition_variable(L) & this );
105
106        bool empty  ( condition_variable(L) & this );
107        int  counter( condition_variable(L) & this );
108
109        void wait( condition_variable(L) & this );
110        void wait( condition_variable(L) & this, uintptr_t info );
111        bool wait( condition_variable(L) & this, Duration duration );
112        bool wait( condition_variable(L) & this, uintptr_t info, Duration duration );
113        bool wait( condition_variable(L) & this, Time time );
114        bool wait( condition_variable(L) & this, uintptr_t info, Time time );
115
116        void wait( condition_variable(L) & this, L & l );
117        void wait( condition_variable(L) & this, L & l, uintptr_t info );
118        bool wait( condition_variable(L) & this, L & l, Duration duration );
119        bool wait( condition_variable(L) & this, L & l, uintptr_t info, Duration duration );
120        bool wait( condition_variable(L) & this, L & l, Time time );
121        bool wait( condition_variable(L) & this, L & l, uintptr_t info, Time time );
122}
123
124//-----------------------------------------------------------------------------
125// Semaphore
126struct semaphore {
127        __spinlock_t lock;
128        int count;
129        __queue_t($thread) waiting;
130};
131
132void  ?{}(semaphore & this, int count = 1);
133void ^?{}(semaphore & this);
134bool   P (semaphore & this);
135bool   V (semaphore & this);
136bool   V (semaphore & this, unsigned count);
Note: See TracBrowser for help on using the repository browser.