35 lines
641 B
GDScript3
35 lines
641 B
GDScript3
|
|
class_name ReadWriteLock
|
||
|
|
|
||
|
|
var _w_lock : Lock
|
||
|
|
var _num_r_lock : Lock
|
||
|
|
var _num_r : int
|
||
|
|
|
||
|
|
func _init():
|
||
|
|
self._w_lock = Lock.new()
|
||
|
|
self._num_r_lock = Lock.new()
|
||
|
|
self._num_r = 0
|
||
|
|
|
||
|
|
func r_lock():
|
||
|
|
self._num_r_lock.lock()
|
||
|
|
self._num_r += 1
|
||
|
|
if self._num_r == 1:
|
||
|
|
self._w_lock.lock()
|
||
|
|
self._num_r_lock.unlock()
|
||
|
|
|
||
|
|
func r_unlock():
|
||
|
|
if self._num_r <= 0:
|
||
|
|
LockNotAquiredError.new(
|
||
|
|
"Read-Write-Lock was released but nobody aquired it!").throw()
|
||
|
|
return
|
||
|
|
self._num_r_lock.lock()
|
||
|
|
self._num_r -= 1
|
||
|
|
if self._num_r == 0:
|
||
|
|
self._w_lock.unlock()
|
||
|
|
self._num_r_lock.unlock()
|
||
|
|
|
||
|
|
func w_lock():
|
||
|
|
self._w_lock.lock()
|
||
|
|
|
||
|
|
func w_unlock():
|
||
|
|
self._w_lock.unlock()
|