Add BH_ThreadSleep, fix Timespec.h

This commit is contained in:
2025-09-21 21:20:31 +03:00
parent 8064ec2aff
commit 9bd2007023
8 changed files with 75 additions and 9 deletions

View File

@@ -58,6 +58,15 @@ Upon completion of the thread, the resources of the I<thread> are freed.
Returns 0 on success, otherwise an error code.
=head2 BH_ThreadSleep
void BH_ThreadSleep(uint32_t timeout)
Makes thread sleep for the specified amount of time.
The I<timeout> parameter specifies the waiting time in milliseconds.
=head2 BH_MutexNew
BH_Mutex *BH_MutexNew(void);

View File

@@ -57,6 +57,15 @@ I<callback> и данными I<data>.
В случае успеха возвращает 0, иначе код ошибки.
=head2 BH_ThreadSleep
void BH_ThreadSleep(uint32_t timeout)
Останавливает выполнения потока на указнный промежуток времени.
Параметр I<timeout> задаёт время ожидания в миллисекундах.
=head2 BH_MutexNew
BH_Mutex *BH_MutexNew(void);

View File

@@ -27,6 +27,9 @@ int BH_ThreadJoin(BH_Thread *thread);
int BH_ThreadDetach(BH_Thread *thread);
void BH_ThreadSleep(uint32_t timeout);
BH_Mutex *BH_MutexNew(void);

View File

@@ -27,3 +27,9 @@ int BH_ThreadDetach(BH_Thread *thread)
return BH_NOIMPL;
}
void BH_ThreadSleep(uint32_t timeout)
{
BH_UNUSED(timeout);
}

View File

@@ -2,6 +2,7 @@
#include <limits.h>
#include <stdlib.h>
#include <errno.h>
struct BH_ThreadContext
@@ -95,3 +96,21 @@ int BH_ThreadDetach(BH_Thread *thread)
free(thread);
return BH_OK;
}
void BH_ThreadSleep(uint32_t timeout)
{
struct timespec ts;
int result;
/* We don't care about nanoseconds */
ts.tv_sec = timeout / 1000;
ts.tv_nsec = (timeout % 1000) * 1000000;
do
{
result = nanosleep(&ts, &ts);
if (errno != EINTR)
break;
} while (result);
}

View File

@@ -6,6 +6,7 @@
#include <BH/Thread.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
static int convertToTimespec(struct timespec *ts,
@@ -13,16 +14,16 @@ static int convertToTimespec(struct timespec *ts,
{
#if (_POSIX_TIMERS > 0) || defined(BH_USE_CLOCK_GETTIME)
if (clock_gettime(CLOCK_REALTIME, ts))
return BH_ERROR;
#else
struct timeval tv;
if (gettimeofday(&tv, NULL))
return BH_ERROR;
ts->tv_sec = tv.tv_sec;
ts->tv_nsec = tv.tv_usec * 1000;
#endif
{
struct timeval tv;
if (gettimeofday(&tv, NULL))
return BH_ERROR;
ts->tv_sec = tv.tv_sec;
ts->tv_nsec = tv.tv_usec * 1000;
}
/* Calculate absoulute time for timed wait */
ts->tv_sec += timeout / 1000;

View File

@@ -87,3 +87,9 @@ int BH_ThreadDetach(BH_Thread *thread)
return BH_OK;
}
void BH_ThreadSleep(uint32_t timeout)
{
Sleep(timeout);
}

View File

@@ -3,6 +3,18 @@
#include <time.h>
BH_UNIT_TEST(Sleep)
{
time_t start;
start = time(NULL);
BH_ThreadSleep(5000);
BH_VERIFY(time(NULL) - start >= 5);
return 0;
}
BH_UNIT_TEST(Mutex)
{
BH_Mutex *mutex;
@@ -102,6 +114,7 @@ int main(int argc, char **argv)
(void)argc;
(void)argv;
BH_UNIT_ADD(Sleep);
BH_UNIT_ADD(Mutex);
BH_UNIT_ADD(Semaphore);
BH_UNIT_ADD(Condition);