Await_sync.RwlockA poisonable and freezable multiple readers, single writer lock.
module Capsule := Capsule.Expertval create :
?padded:bool @ local ->
('k Capsule.Key.t @ unique ->
'k t) @ local @@ portablecreate k creates a new reader-writer lock for the capsule 'k associated with k, consuming the key itself.
The optional padded argument specifies whether to pad the data structure to avoid false sharing. See Atomic.make for a longer explanation.
Accesswith_access_shared w t ~f acquires t for reading, runs f with shared access to the associated capsule, then releases t. If t is locked for writing then uses w to wait until it is unlocked.
with_access_shared_freezing w t ~f is with_access_shared w t ~f, but freezes t if f raises an uncaught exception.
with_access_shared_or_cancel w c t ~f is Completed (with_access_shared w t ~f) if c is not canceled, otherwise it is Canceled.
with_access_shared_or_cancel_freezing w c t ~f is with_access_shared_or_cancel w c t ~f, but freezes t if f raises an uncaught exception.
val with_access :
'a 'k. Await_kernel.Await.t @ local ->
('k t @ local ->
(f:
('k Capsule.Access.t -> 'a @ unique once portable contended) @ local once portable ->
'a @ unique once portable contended) @ local) @ local @@ portablewith_access w t ~f acquires t for writing, runs f within the associated capsule, then releases t. If t is locked then uses w to wait until it is unlocked.
val with_access_poisoning :
'a 'k. Await_kernel.Await.t @ local ->
('k t @ local ->
(f:
('k Capsule.Access.t -> 'a @ unique once portable contended) @ local once portable ->
'a @ unique once portable contended) @ local) @ local @@ portablewith_access_poisoning w t ~f is with_access w t ~f, but poisons t if f raises an uncaught exception.
val with_access_or_cancel :
'a 'k. Await_kernel.Await.t @ local ->
(Await_kernel.Cancellation.t @ local ->
('k t @ local ->
(f:
('k Capsule.Access.t -> 'a @ unique once portable contended) @ local once portable ->
'a Await_kernel.Or_canceled.t @ unique once portable contended) @ local) @ local) @ local @@ portablewith_access_or_cancel w c t ~f is Completed (with_access w t ~f) if c is not canceled, otherwise it is Canceled.
val with_access_or_cancel_poisoning :
'a 'k. Await_kernel.Await.t @ local ->
(Await_kernel.Cancellation.t @ local ->
('k t @ local ->
(f:
('k Capsule.Access.t -> 'a @ unique once portable contended) @ local once portable ->
'a Await_kernel.Or_canceled.t @ unique once portable contended) @ local) @ local) @ local @@ portablewith_access_or_cancel_poisoning w c t ~f is with_access_or_cancel w c t ~f, but poisons t if f raises an uncaught exception.
Password.Shared by readerswith_password_shared w t ~f acquires t, runs f with permission to access the associated capsule, then releases t. If t is locked then uses w to wait until it is unlocked.
with_password_shared_freezing w t ~f is with_password_shared w t ~f, but freezes t if f raises an uncaught exception.
with_password_shared_or_cancel w c t ~f is Completed (with_password_shared w t ~f) if c is not canceled, otherwise it is Canceled.
with_password_shared_or_cancel_freezing w c t ~f is with_password_shared_or_cancel w t ~f, but freezes t if f raises an uncaught exception.
Password for a writerval with_password :
'a 'k. Await_kernel.Await.t @ local ->
('k t @ local ->
(f:('k Capsule.Password.t @ local -> 'a @ unique) @ local once ->
'a @ unique) @ local) @ local @@ portablewith_password w t ~f acquires t, runs f with permission to access the associated capsule, then releases t. If t is locked then uses w to wait until it is unlocked.
val with_password_poisoning :
'a 'k. Await_kernel.Await.t @ local ->
('k t @ local ->
(f:('k Capsule.Password.t @ local -> 'a @ unique) @ local once ->
'a @ unique) @ local) @ local @@ portablewith_password_poisoning w t ~f is with_password w t ~f, but poisons t if f raises an uncaught exception.
val with_password_or_cancel :
'a 'k. Await_kernel.Await.t @ local ->
(Await_kernel.Cancellation.t @ local ->
('k t @ local ->
(f:('k Capsule.Password.t @ local -> 'a @ unique) @ local once ->
'a Await_kernel.Or_canceled.t @ unique) @ local) @ local) @ local @@ portablewith_password_or_cancel w c t ~f is Completed (with_password w t ~f) if c is not canceled, otherwise it is Canceled.
val with_password_or_cancel_poisoning :
'a 'k. Await_kernel.Await.t @ local ->
(Await_kernel.Cancellation.t @ local ->
('k t @ local ->
(f:('k Capsule.Password.t @ local -> 'a @ unique) @ local once ->
'a Await_kernel.Or_canceled.t @ unique) @ local) @ local) @ local @@ portablewith_password_or_cancel_poisoning w c t ~f is with_password_or_cancel w c t ~f, but poisons t if f raises an uncaught exception.
Keywith_key_shared w t ~f locks t for reading and runs f, providing it an aliased key for 'k. If t is locked for writing, then with_key_shared uses w to wait until it is only locked for reading.
with_key_shared_freezing w t ~f is with_key_shared w t ~f, but freezes t if f raises an uncaught exception.
with_key_shared_or_cancel w c t ~f is Completed (with_key_shared w t ~f) if c is not canceled, otherwise it is Canceled
with_key_shared_or_cancel_freezing w c t ~f is with_key_shared_or_cancel w c t ~f, but freezes t if f raises an uncaught exception.
val with_key :
'a 'k. Await_kernel.Await.t @ local ->
('k t @ local ->
(f:
('k Capsule.Key.t @ unique -> #('a * 'k Capsule.Key.t) @ unique once) @ local once ->
'a @ unique once) @ local) @ localwith_key w t ~f locks t for writing and runs f, providing it a key for 'k uniquely. If t is locked for reading or writing, then with_key uses w to wait until it is unlocked.
val with_key_poisoning :
'a 'k. Await_kernel.Await.t @ local ->
('k t @ local ->
(f:
('k Capsule.Key.t @ unique -> #('a * 'k Capsule.Key.t) @ unique once) @ local once ->
'a @ unique once) @ local) @ localwith_key_poisoning w t ~f is with_key w t ~f, but poisons t if f raises an uncaught exception.
val with_key_or_cancel :
'a 'k. Await_kernel.Await.t @ local ->
(Await_kernel.Cancellation.t @ local ->
('k t @ local ->
(f:
('k Capsule.Key.t @ unique -> #('a * 'k Capsule.Key.t) @ unique once) @ local once ->
'a Await_kernel.Or_canceled.t @ unique once) @ local) @ local) @ localwith_key_or_cancel w c t ~f is Completed (with_key w t ~f) if c is not canceled, otherwise it is Canceled
val with_key_or_cancel_poisoning :
'a 'k. Await_kernel.Await.t @ local ->
(Await_kernel.Cancellation.t @ local ->
('k t @ local ->
(f:
('k Capsule.Key.t @ unique -> #('a * 'k Capsule.Key.t) @ unique once) @ local once ->
'a Await_kernel.Or_canceled.t @ unique once) @ local) @ local) @ localwith_key_or_cancel_poisoning w c t ~f is with_key_or_cancel w c t ~f, but poisons t if f raises an uncaught exception.
Conditionmodule Condition : sig ... endCondition variable for waiting for changes to state protected by a lock.
val poison :
'k t @ local ->
('k Capsule.Key.t @ unique ->
'k Capsule.Key.t @ unique) @ local @@ portablepoison t key poisons the rwlock associated with the key.
Note that poisoning a rwlock does not signal waiters on associated condition variables.
acquire_shared w t acquires t for reading and returns a Shared_guard.t for the lock. If t is already locked for writing, acquire_shared uses w to block until it is only locked for reading.
acquire_shared_or_cancel w c t is Completed (acquire_shared w t) if c is not canceled, otherwise it is Canceled.
module Guard : sig ... endval acquire :
Await_kernel.Await.t @ local ->
('k t ->
'k Guard.t @ unique) @ local @@ portableacquire w t acquires t for writing and returns a Write_guard.t for the lock. If t is already locked for reading or writing, acquire uses w to block until it is unlocked.
val acquire_or_cancel :
Await_kernel.Await.t @ local ->
(Await_kernel.Cancellation.t @ local ->
('k t ->
'k Guard.t Await_kernel.Or_canceled.t @ unique) @ local) @ local @@ portableacquire_or_cancel w c t is Completed (acquire w t) if c is not canceled, otherwise it is Canceled.
val is_poisoned : 'k t @ local -> bool @@ portableis_poisoned t is true if the reader-writer lock t is poisoned.
val is_frozen : 'k t @ local -> bool @@ portableis_frozen t is true if the reader-writer lock t is frozen.