semaphore test
This commit is contained in:
parent
f6134b42d7
commit
a24817e85c
|
@ -33,6 +33,17 @@ int tsem_timewait(tsem_t *sim, int64_t milis);
|
||||||
int tsem_post(tsem_t *sem);
|
int tsem_post(tsem_t *sem);
|
||||||
int tsem_destroy(tsem_t *sem);
|
int tsem_destroy(tsem_t *sem);
|
||||||
|
|
||||||
|
#elif defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#define tsem_t HANDLE
|
||||||
|
|
||||||
|
int tsem_init(tsem_t *sem, int pshared, unsigned int value);
|
||||||
|
int tsem_wait(tsem_t *sem);
|
||||||
|
int tsem_timewait(tsem_t *sim, int64_t milis);
|
||||||
|
int tsem_post(tsem_t *sem);
|
||||||
|
int tsem_destroy(tsem_t *sem);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define tsem_t sem_t
|
#define tsem_t sem_t
|
||||||
|
|
|
@ -68,37 +68,34 @@ int32_t taosGetAppName(char* name, int32_t* len) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tsem_wait(tsem_t* sem) {
|
int32_t tsem_wait(tsem_t* sem) {
|
||||||
int ret = 0;
|
return WaitForSingleObject(*sem, INFINITE);
|
||||||
do {
|
|
||||||
ret = sem_wait(sem);
|
|
||||||
} while (ret != 0 && errno == EINTR);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tsem_timewait(tsem_t* sem, int64_t ms) {
|
int32_t tsem_timewait(tsem_t* sem, int64_t timeout_ms) {
|
||||||
struct timespec ts;
|
DWORD result = WaitForSingleObject(*sem, timeout_ms);
|
||||||
taosClockGetTime(0, &ts);
|
if (result == WAIT_OBJECT_0) {
|
||||||
|
return 0; // Semaphore acquired
|
||||||
|
} else if (result == WAIT_TIMEOUT) {
|
||||||
|
return -1; // Timeout reached
|
||||||
|
} else {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ts.tv_nsec += ms * 1000000;
|
// Inter-process sharing is not currently supported. The pshared parameter is invalid.
|
||||||
ts.tv_sec += ts.tv_nsec / 1000000000;
|
int tsem_init(tsem_t* sem, int pshared, unsigned int value) {
|
||||||
ts.tv_nsec %= 1000000000;
|
*sem = CreateSemaphore(NULL, value, LONG_MAX, NULL);
|
||||||
int rc;
|
return (*sem != NULL) ? 0 : -1;
|
||||||
while ((rc = sem_timedwait(sem, &ts)) == -1 && errno == EINTR) continue;
|
}
|
||||||
return rc;
|
|
||||||
/* This should have timed out */
|
int tsem_post(tsem_t* sem) {
|
||||||
// ASSERT(errno == ETIMEDOUT);
|
if (ReleaseSemaphore(*sem, 1, NULL)) return 0;
|
||||||
// ASSERT(rc != 0);
|
return -1;
|
||||||
// GetSystemTimeAsFileTime(&ft_after);
|
}
|
||||||
// // We specified a non-zero wait. Time must advance.
|
|
||||||
// if (ft_before.dwLowDateTime == ft_after.dwLowDateTime && ft_before.dwHighDateTime == ft_after.dwHighDateTime)
|
int tsem_destroy(tsem_t* sem) {
|
||||||
// {
|
if (CloseHandle(*sem)) return 0;
|
||||||
// printf("nanoseconds: %d, rc: %d, code:0x%x. before filetime: %d, %d; after filetime: %d, %d\n",
|
return -1;
|
||||||
// nanosecs, rc, errno,
|
|
||||||
// (int)ft_before.dwLowDateTime, (int)ft_before.dwHighDateTime,
|
|
||||||
// (int)ft_after.dwLowDateTime, (int)ft_after.dwHighDateTime);
|
|
||||||
// printf("time must advance during sem_timedwait.");
|
|
||||||
// return 1;
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(_TD_DARWIN_64)
|
#elif defined(_TD_DARWIN_64)
|
||||||
|
|
|
@ -77,4 +77,11 @@ target_link_libraries(osAtomicTests os util gtest_main)
|
||||||
add_test(
|
add_test(
|
||||||
NAME osAtomicTests
|
NAME osAtomicTests
|
||||||
COMMAND osAtomicTests
|
COMMAND osAtomicTests
|
||||||
)
|
)
|
||||||
|
|
||||||
|
add_executable(osSemaphoreTests "osSemaphoreTests.cpp")
|
||||||
|
target_link_libraries(osSemaphoreTests os util gtest_main)
|
||||||
|
add_test(
|
||||||
|
NAME osSemaphoreTests
|
||||||
|
COMMAND osSemaphoreTests
|
||||||
|
)
|
||||||
|
|
|
@ -0,0 +1,107 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <xsren@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <thread>
|
||||||
|
#include "os.h"
|
||||||
|
#include "tlog.h"
|
||||||
|
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wwrite-strings"
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-variable"
|
||||||
|
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||||
|
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||||
|
#pragma GCC diagnostic ignored "-Wformat"
|
||||||
|
#pragma GCC diagnostic ignored "-Wint-to-pointer-cast"
|
||||||
|
#pragma GCC diagnostic ignored "-Wpointer-arith"
|
||||||
|
|
||||||
|
TEST(osSemaphoreTests, InitAndDestroy) {
|
||||||
|
tsem_t sem;
|
||||||
|
int result = tsem_init(&sem, 0, 1);
|
||||||
|
EXPECT_EQ(result, 0);
|
||||||
|
|
||||||
|
result = tsem_destroy(&sem);
|
||||||
|
EXPECT_EQ(result, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(osSemaphoreTests, Destroy) {
|
||||||
|
tsem_t sem;
|
||||||
|
int result = tsem_init(&sem, 0, 1);
|
||||||
|
EXPECT_EQ(result, 0);
|
||||||
|
|
||||||
|
result = tsem_destroy(&sem);
|
||||||
|
EXPECT_EQ(result, 0);
|
||||||
|
result = tsem_destroy(&sem);
|
||||||
|
EXPECT_NE(result, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TEST(osSemaphoreTests, Wait) {
|
||||||
|
// tsem_t sem;
|
||||||
|
// tsem_init(&sem, 0, 0);
|
||||||
|
// ASSERT_EQ(tsem_wait(&sem), -1);
|
||||||
|
// tsem_destroy(&sem);
|
||||||
|
// }
|
||||||
|
|
||||||
|
TEST(osSemaphoreTests, WaitTime0) {
|
||||||
|
tsem_t sem;
|
||||||
|
tsem_init(&sem, 0, 0);
|
||||||
|
EXPECT_NE(tsem_timewait(&sem, 1000), 0);
|
||||||
|
tsem_destroy(&sem);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(osSemaphoreTests, WaitTime1) {
|
||||||
|
tsem_t sem;
|
||||||
|
tsem_init(&sem, 0, 1);
|
||||||
|
EXPECT_EQ(tsem_timewait(&sem, 1000), 0);
|
||||||
|
EXPECT_NE(tsem_timewait(&sem, 1000), 0);
|
||||||
|
tsem_destroy(&sem);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEST(osSemaphoreTests, WaitAndPost) {
|
||||||
|
tsem_t sem;
|
||||||
|
int result = tsem_init(&sem, 0, 0);
|
||||||
|
EXPECT_EQ(result, 0);
|
||||||
|
|
||||||
|
std::thread([&sem]() {
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||||
|
tsem_post(&sem);
|
||||||
|
}).detach();
|
||||||
|
|
||||||
|
result = tsem_wait(&sem);
|
||||||
|
EXPECT_EQ(result, 0);
|
||||||
|
|
||||||
|
result = tsem_destroy(&sem);
|
||||||
|
EXPECT_EQ(result, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEST(osSemaphoreTests, TimedWait) {
|
||||||
|
tsem_t sem;
|
||||||
|
int result = tsem_init(&sem, 0, 0);
|
||||||
|
EXPECT_EQ(result, 0);
|
||||||
|
|
||||||
|
std::thread([&sem]() {
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||||
|
tsem_post(&sem);
|
||||||
|
}).detach();
|
||||||
|
|
||||||
|
result = tsem_timewait(&sem, 1000);
|
||||||
|
EXPECT_EQ(result, 0);
|
||||||
|
|
||||||
|
result = tsem_destroy(&sem);
|
||||||
|
EXPECT_EQ(result, 0);
|
||||||
|
}
|
Loading…
Reference in New Issue