source: libcfa/src/concurrency/locks.hfa @ 44f09ea

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

blocking_lock & multiple_acquisition_lock can now be used without libcfa-thread.
Doing so will have all functions be no-ops for these locks.
If libcfa-thread is linked in, these locks will behave as proper user-level locking.

  • Property mode set to 100644
File size: 5.0 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   unlock    ( single_acquisition_lock & this ) { unlock ( (blocking_lock &)this ); }
35static inline void   on_wait   ( single_acquisition_lock & this ) { on_wait( (blocking_lock &)this ); }
36static inline void   on_notify ( single_acquisition_lock & this, struct $thread * t ) { on_notify( (blocking_lock &)this, t ); }
37static inline void   set_recursion_count( single_acquisition_lock & this, size_t recursion ) { set_recursion_count( (blocking_lock &)this, recursion ); }
38static inline size_t get_recursion_count( single_acquisition_lock & this ) { return get_recursion_count( (blocking_lock &)this ); }
39
40//----------
41struct owner_lock {
42        inline blocking_lock;
43};
44
45static inline void  ?{}( owner_lock & this ) {((blocking_lock &)this){ true, true };}
46static inline void ^?{}( owner_lock & this ) {}
47static inline void   lock     ( owner_lock & this ) { lock   ( (blocking_lock &)this ); }
48static inline void   unlock   ( owner_lock & this ) { unlock ( (blocking_lock &)this ); }
49static inline void   on_wait  ( owner_lock & this ) { on_wait( (blocking_lock &)this ); }
50static inline void   on_notify( owner_lock & this, struct $thread * t ) { on_notify( (blocking_lock &)this, t ); }
51static inline void   set_recursion_count( owner_lock & this, size_t recursion ) { set_recursion_count( (blocking_lock &)this, recursion ); }
52static inline size_t get_recursion_count( owner_lock & this ) { return get_recursion_count( (blocking_lock &)this ); }
53
54//-----------------------------------------------------------------------------
55// is_blocking_lock
56trait is_blocking_lock(L & | sized(L)) {
57        // For synchronization locks to use when acquiring
58        void on_notify( L &, struct $thread * );
59
60        // For synchronization locks to use when releasing
61        void on_wait( L & );
62
63        // to get recursion count for cond lock to reset after waking
64        size_t get_recursion_count( L & );
65
66        // to set recursion count after getting signalled;
67        void set_recursion_count( L &, size_t recursion );
68};
69
70//-----------------------------------------------------------------------------
71// info_thread
72// the info thread is a wrapper around a thread used
73// to store extra data for use in the condition variable
74forall(L & | is_blocking_lock(L)) {
75        struct info_thread;
76
77        // for use by sequence
78        info_thread(L) *& Back( info_thread(L) * this );
79        info_thread(L) *& Next( info_thread(L) * this );
80}
81
82//-----------------------------------------------------------------------------
83// Synchronization Locks
84forall(L & | is_blocking_lock(L)) {
85        struct condition_variable {
86                // Spin lock used for mutual exclusion
87                __spinlock_t lock;
88
89                // List of blocked threads
90                Sequence( info_thread(L) ) blocked_threads;
91
92                // Count of current blocked threads
93                int count;
94        };
95
96        void  ?{}( condition_variable(L) & this );
97        void ^?{}( condition_variable(L) & this );
98
99        bool notify_one( condition_variable(L) & this );
100        bool notify_all( condition_variable(L) & this );
101
102        uintptr_t front( condition_variable(L) & this );
103
104        bool empty  ( condition_variable(L) & this );
105        int  counter( condition_variable(L) & this );
106
107        void wait( condition_variable(L) & this );
108        void wait( condition_variable(L) & this, uintptr_t info );
109        bool wait( condition_variable(L) & this, Duration duration );
110        bool wait( condition_variable(L) & this, uintptr_t info, Duration duration );
111        bool wait( condition_variable(L) & this, Time time );
112        bool wait( condition_variable(L) & this, uintptr_t info, Time time );
113
114        void wait( condition_variable(L) & this, L & l );
115        void wait( condition_variable(L) & this, L & l, uintptr_t info );
116        bool wait( condition_variable(L) & this, L & l, Duration duration );
117        bool wait( condition_variable(L) & this, L & l, uintptr_t info, Duration duration );
118        bool wait( condition_variable(L) & this, L & l, Time time );
119        bool wait( condition_variable(L) & this, L & l, uintptr_t info, Time time );
120}
121
122//-----------------------------------------------------------------------------
123// Semaphore
124struct semaphore {
125        __spinlock_t lock;
126        int count;
127        __queue_t($thread) waiting;
128};
129
130void  ?{}(semaphore & this, int count = 1);
131void ^?{}(semaphore & this);
132bool   P (semaphore & this);
133bool   V (semaphore & this);
134bool   V (semaphore & this, unsigned count);
Note: See TracBrowser for help on using the repository browser.