source: libcfa/src/concurrency/locks.hfa@ 9e27f69

ADT arm-eh ast-experimental enum forall-pointer-decay jacob/cs343-translation new-ast-unique-expr pthread-emulation qualifiedEnum
Last change on this file since 9e27f69 was f19497c, checked in by Thierry Delisle <tdelisle@…>, 5 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.