fix: timewait

This commit is contained in:
xsren 2024-09-12 09:34:53 +08:00
parent e226898e17
commit dca6b21e88
2 changed files with 22 additions and 15 deletions

View File

@ -114,7 +114,7 @@ int32_t tsem_destroy(tsem_t* sem) {
int32_t tsem_init(tsem_t *psem, int flags, unsigned int count) {
*psem = dispatch_semaphore_create(count);
if (*psem == NULL) return TAO_SYTAOS_SYSTEM_ERROR(errno);
if (*psem == NULL) return TAOS_SYSTEM_ERROR(errno);
return 0;
}
@ -250,16 +250,15 @@ int32_t tsem_timewait(tsem_t* sem, int64_t ms) {
ts.tv_sec += ts.tv_nsec / 1000000000;
ts.tv_nsec %= 1000000000;
while ((ret = sem_timedwait(sem, &ts)) == -1 && errno == EINTR) {
continue;
}
if(ETIMEDOUT == errno) {
return TSDB_CODE_TIMEOUT_ERROR;
}
if (-1 == ret) {
terrno = TAOS_SYSTEM_ERROR(errno);
return terrno;
while ((ret = sem_timedwait(sem, &ts)) == -1) {
if(errno == EINTR) {
continue;
} else if(errno == ETIMEDOUT) {
return TSDB_CODE_TIMEOUT_ERROR;
} else {
terrno = TAOS_SYSTEM_ERROR(errno);
return terrno;
}
}
return 0;

View File

@ -59,18 +59,26 @@ TEST(osSemaphoreTests, Destroy) {
TEST(osSemaphoreTests, WaitTime0) {
tsem_t sem;
(void)tsem_init(&sem, 0, 0);
EXPECT_NE(tsem_timewait(&sem, 1000), 0);
EXPECT_EQ(tsem_timewait(&sem, 1000), TSDB_CODE_TIMEOUT_ERROR);
(void)tsem_destroy(&sem);
}
TEST(osSemaphoreTests, WaitTime1) {
tsem_t sem;
(void)tsem_init(&sem, 0, 1);
EXPECT_EQ(tsem_timewait(&sem, 1000), 0);
EXPECT_NE(tsem_timewait(&sem, 1000), 0);
EXPECT_EQ(tsem_timewait(&sem, 10000), 0);
EXPECT_EQ(tsem_timewait(&sem, 1000), TSDB_CODE_TIMEOUT_ERROR);
(void)tsem_destroy(&sem);
}
TEST(osSemaphoreTests, WaitTime2) {
tsem2_t sem;
(void)tsem2_init(&sem, 0, 1);
EXPECT_EQ(tsem2_timewait(&sem, 10000), 0);
EXPECT_EQ(tsem2_timewait(&sem, 1000), TSDB_CODE_TIMEOUT_ERROR);
(void)tsem2_destroy(&sem);
}
TEST(osSemaphoreTests, WaitAndPost) {
tsem_t sem;
int result = tsem_init(&sem, 0, 0);
@ -217,7 +225,7 @@ TEST(osSemaphoreTests, Performance4_1) {
(void)tsem_post(&sem);
}).detach();
(void)tsem_timewait(&sem, 1000);
EXPECT_EQ(tsem_timewait(&sem, 1000),0);
(void)tsem_destroy(&sem);
}