mirror of https://github.com/ARMmbed/mbed-os.git
Add Semaphore::wait_until
Given the 64-bit timebase, add wait_until to Semaphore. Naming is based on Thread::wait_until. pthreads uses "timedwait", but that's not a good fit against our existing wait() - pthreads only has an absolute-time wait, not relative.pull/5419/head
parent
cd573a603f
commit
2b77caa32c
|
|
@ -20,6 +20,7 @@
|
||||||
* SOFTWARE.
|
* SOFTWARE.
|
||||||
*/
|
*/
|
||||||
#include "rtos/Semaphore.h"
|
#include "rtos/Semaphore.h"
|
||||||
|
#include "rtos/Kernel.h"
|
||||||
#include "platform/mbed_assert.h"
|
#include "platform/mbed_assert.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
@ -57,6 +58,20 @@ int32_t Semaphore::wait(uint32_t millisec) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t Semaphore::wait_until(uint64_t millisec) {
|
||||||
|
uint64_t now = Kernel::get_ms_count();
|
||||||
|
uint32_t timeout;
|
||||||
|
|
||||||
|
if (now >= millisec) {
|
||||||
|
return wait(0);
|
||||||
|
} else if (millisec - now >= osWaitForever) {
|
||||||
|
// API permits early return
|
||||||
|
return wait(osWaitForever - 1);
|
||||||
|
} else {
|
||||||
|
return wait(millisec - now);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
osStatus Semaphore::release(void) {
|
osStatus Semaphore::release(void) {
|
||||||
return osSemaphoreRelease(_id);
|
return osSemaphoreRelease(_id);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -67,6 +67,18 @@ public:
|
||||||
*/
|
*/
|
||||||
int32_t wait(uint32_t millisec=osWaitForever);
|
int32_t wait(uint32_t millisec=osWaitForever);
|
||||||
|
|
||||||
|
/** Wait until a Semaphore resource becomes available.
|
||||||
|
@param millisec absolute timeout time, referenced to Kernel::get_ms_count()
|
||||||
|
@return number of available tokens, before taking one; or -1 in case of incorrect parameters
|
||||||
|
@note the underlying RTOS may have a limit to the maximum wait time
|
||||||
|
due to internal 32-bit computations, but this is guaranteed to work if the
|
||||||
|
wait is <= 0x7fffffff milliseconds (~24 days). If the limit is exceeded,
|
||||||
|
the acquire attempt will time out earlier than specified.
|
||||||
|
|
||||||
|
@note You cannot call this function from ISR context.
|
||||||
|
*/
|
||||||
|
int32_t wait_until(uint64_t millisec);
|
||||||
|
|
||||||
/** Release a Semaphore resource that was obtain with Semaphore::wait.
|
/** Release a Semaphore resource that was obtain with Semaphore::wait.
|
||||||
@return status code that indicates the execution status of the function:
|
@return status code that indicates the execution status of the function:
|
||||||
@a osOK the token has been correctly released.
|
@a osOK the token has been correctly released.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue