diff options
Diffstat (limited to 'tests/stdio_ext_test.cpp')
-rw-r--r-- | tests/stdio_ext_test.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/tests/stdio_ext_test.cpp b/tests/stdio_ext_test.cpp index c95cbbdd5..78725675d 100644 --- a/tests/stdio_ext_test.cpp +++ b/tests/stdio_ext_test.cpp @@ -30,6 +30,7 @@ #include <locale.h> #include "TemporaryFile.h" +#include "utils.h" TEST(stdio_ext, __fbufsize) { FILE* fp = fopen("/proc/version", "r"); @@ -140,3 +141,24 @@ TEST(stdio_ext, __fsetlocking) { ASSERT_EQ(FSETLOCKING_INTERNAL, __fsetlocking(fp, FSETLOCKING_QUERY)); fclose(fp); } + +static void LockingByCallerHelper(std::atomic<pid_t>* pid) { + *pid = gettid(); + flockfile(stdout); + funlockfile(stdout); +} + +TEST(stdio_ext, __fsetlocking_BYCALLER) { + // Check if users can use flockfile/funlockfile to protect stdio operations. + int old_state = __fsetlocking(stdout, FSETLOCKING_BYCALLER); + flockfile(stdout); + pthread_t thread; + std::atomic<pid_t> pid(0); + ASSERT_EQ(0, pthread_create(&thread, nullptr, + reinterpret_cast<void* (*)(void*)>(LockingByCallerHelper), &pid)); + WaitUntilThreadSleep(pid); + funlockfile(stdout); + + ASSERT_EQ(0, pthread_join(thread, nullptr)); + __fsetlocking(stdout, old_state); +} |