|
|
|
@ -3,38 +3,25 @@
@@ -3,38 +3,25 @@
|
|
|
|
|
|
|
|
|
|
using namespace Empty; |
|
|
|
|
|
|
|
|
|
EmptySemaphore::EmptySemaphore() : |
|
|
|
|
_owner(NULL), |
|
|
|
|
_k(NULL) |
|
|
|
|
{} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool EmptySemaphore::get(void* owner) { |
|
|
|
|
if (_owner == NULL) { |
|
|
|
|
_owner = owner; |
|
|
|
|
bool EmptySemaphore::give() { |
|
|
|
|
if (_taken) { |
|
|
|
|
_taken = false; |
|
|
|
|
return true; |
|
|
|
|
} else { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool EmptySemaphore::release(void* owner) { |
|
|
|
|
if (_owner == NULL || _owner != owner) { |
|
|
|
|
return false; |
|
|
|
|
} else { |
|
|
|
|
_owner = NULL; |
|
|
|
|
if (_k){ |
|
|
|
|
_k(); |
|
|
|
|
_k = NULL; |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
bool EmptySemaphore::take(uint32_t timeout_ms) { |
|
|
|
|
return take_nonblocking(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool EmptySemaphore::call_on_release(void* caller, AP_HAL::Proc k) { |
|
|
|
|
/* idk what semantics randy was looking for here, honestly.
|
|
|
|
|
* seems like a bad idea. */ |
|
|
|
|
_k = k; |
|
|
|
|
return true; |
|
|
|
|
bool EmptySemaphore::take_nonblocking() { |
|
|
|
|
/* No syncronisation primitives to garuntee this is correct */ |
|
|
|
|
if (!_taken) { |
|
|
|
|
_taken = true; |
|
|
|
|
return true; |
|
|
|
|
} else { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|