winpthreads: tests: add tests for `pthread_mutexattr_*` functions Signed-off-by: Kirill Makurin <maiddaisuki@outlook.com> Signed-off-by: LIU Hao <lh_mouse@126.com>
diff --git a/mingw-w64-libraries/winpthreads/tests/Makefile.am b/mingw-w64-libraries/winpthreads/tests/Makefile.am index 785da97..8087899 100644 --- a/mingw-w64-libraries/winpthreads/tests/Makefile.am +++ b/mingw-w64-libraries/winpthreads/tests/Makefile.am
@@ -110,6 +110,10 @@ pthread_misc/stress1 \ pthread_misc/valid1 \ pthread_misc/valid2 \ + pthread_mutex/attr-prioceiling \ + pthread_mutex/attr-protocol \ + pthread_mutex/attr-pshared \ + pthread_mutex/attr-type \ pthread_mutex/default-basic \ pthread_mutex/default-lock-recursive \ pthread_mutex/default-static \
diff --git a/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-prioceiling.c b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-prioceiling.c new file mode 100644 index 0000000..789b87e --- /dev/null +++ b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-prioceiling.c
@@ -0,0 +1,63 @@ +/* + Copyright (c) 2026 mingw-w64 project + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#include "test.h" + +/** + * Test Summary: + * + * Test functions `pthread_mutexattr_setprioceiling` and + * `pthread_mutexattr_getprioceiling`. + */ + +static void DoTest (int value, int expectedValue, int expectedReturn1, int expectedReturn2) { + pthread_mutexattr_t mutexAttr; + pthread_mutex_t mutex; + + assert (pthread_mutexattr_init (&mutexAttr) == 0); + assert (pthread_mutexattr_setprioceiling (&mutexAttr, value) == expectedReturn1); + assert (pthread_mutexattr_getprioceiling (&mutexAttr, &value) == 0); + assert (value == expectedValue); + assert (pthread_mutex_init (&mutex, &mutexAttr) == expectedReturn2); + if (expectedReturn2 == 0) { + assert (pthread_mutex_destroy (&mutex) == 0); + } + assert (pthread_mutexattr_destroy (&mutexAttr) == 0); +} + +int main (void) { + /** + * Any valid `THRAED_PRIORITY_*` value can be set for prioceiling attribute. + * + * Currently, it has no effect; POSIX realtime extensions are not implemented. + */ + for (int value = THREAD_PRIORITY_IDLE; value <= THREAD_PRIORITY_TIME_CRITICAL; ++value) { + DoTest (value, value, 0, 0); + } + + /** + * Try setting an invalid value; default attribute value must be used. + */ + DoTest (0xFF, THREAD_PRIORITY_NORMAL, EINVAL, 0); + + return 0; +}
diff --git a/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-protocol.c b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-protocol.c new file mode 100644 index 0000000..d1c0b00 --- /dev/null +++ b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-protocol.c
@@ -0,0 +1,65 @@ +/* + Copyright (c) 2026 mingw-w64 project + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#include "test.h" + +/** + * Test Summary: + * + * Test functions `pthread_mutexattr_setprotocol` and + * `pthread_mutexattr_getprotocol`. + */ + +static void DoTest (int value, int expectedValue, int expectedReturn1, int expectedReturn2) { + pthread_mutexattr_t mutexAttr; + pthread_mutex_t mutex; + + assert (pthread_mutexattr_init (&mutexAttr) == 0); + assert (pthread_mutexattr_setprotocol (&mutexAttr, value) == expectedReturn1); + assert (pthread_mutexattr_getprotocol (&mutexAttr, &value) == 0); + assert (value == expectedValue); + assert (pthread_mutex_init (&mutex, &mutexAttr) == expectedReturn2); + if (expectedReturn2 == 0) { + assert (pthread_mutex_destroy (&mutex) == 0); + } + assert (pthread_mutexattr_destroy (&mutexAttr) == 0); +} + +int main (void) { + /** + * Currently winpthreads only supports `PTHREAD_PRIO_NONE`. + */ + DoTest (PTHREAD_PRIO_NONE, PTHREAD_PRIO_NONE, 0, 0); + + /** + * POSIX realtime extensions are not implemented. + */ + DoTest (PTHREAD_PRIO_INHERIT, PTHREAD_PRIO_NONE, ENOTSUP, 0); + DoTest (PTHREAD_PRIO_PROTECT, PTHREAD_PRIO_NONE, ENOTSUP, 0); + + /** + * Try setting an invalid value; default attribute value must be used. + */ + DoTest (0xFF, PTHREAD_PRIO_NONE, EINVAL, 0); + + return 0; +}
diff --git a/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-pshared.c b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-pshared.c new file mode 100644 index 0000000..f7937f0 --- /dev/null +++ b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-pshared.c
@@ -0,0 +1,60 @@ +/* + Copyright (c) 2026 mingw-w64 project + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#include "test.h" + +/** + * Test Summary: + * + * Test functions `pthread_mutexattr_setpshared` and + * `pthread_mutexattr_getpshared`. + */ + +static void DoTest (int value, int expectedValue, int expectedReturn1, int expectedReturn2) { + pthread_mutexattr_t mutexAttr; + pthread_mutex_t mutex; + + assert (pthread_mutexattr_init (&mutexAttr) == 0); + assert (pthread_mutexattr_setpshared (&mutexAttr, value) == expectedReturn1); + assert (pthread_mutexattr_getpshared (&mutexAttr, &value) == 0); + assert (value == expectedValue); + assert (pthread_mutex_init (&mutex, &mutexAttr) == expectedReturn2); + if (expectedReturn2 == 0) { + assert (pthread_mutex_destroy (&mutex) == 0); + } + assert (pthread_mutexattr_destroy (&mutexAttr) == 0); +} + +int main (void) { + /** + * Currently winpthreads only supports `PTHREAD_PROCESS_PRIVATE`. + */ + DoTest (PTHREAD_PROCESS_PRIVATE, PTHREAD_PROCESS_PRIVATE, 0, 0); + DoTest (PTHREAD_PROCESS_SHARED, PTHREAD_PROCESS_SHARED, 0, ENOSYS); + + /** + * Try setting an invalid value; default attribute value must be used. + */ + DoTest (0xFF, PTHREAD_PROCESS_PRIVATE, EINVAL, 0); + + return 0; +}
diff --git a/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-type.c b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-type.c new file mode 100644 index 0000000..16fa713 --- /dev/null +++ b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/attr-type.c
@@ -0,0 +1,65 @@ +/* + Copyright (c) 2026 mingw-w64 project + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#include "test.h" + +/** + * Test Summary: + * + * Test functions `pthread_mutexattr_settype` and `pthread_mutexattr_gettype`. + */ + +static void DoTest (int value, int expectedValue, int expectedReturn1, int expectedReturn2) { + pthread_mutexattr_t mutexAttr; + pthread_mutex_t mutex; + + assert (pthread_mutexattr_init (&mutexAttr) == 0); + assert (pthread_mutexattr_settype (&mutexAttr, value) == expectedReturn1); + assert (pthread_mutexattr_gettype (&mutexAttr, &value) == 0); + assert (value == expectedValue); + assert (pthread_mutex_init (&mutex, &mutexAttr) == expectedReturn2); + if (expectedReturn2 == 0) { + assert (pthread_mutex_destroy (&mutex) == 0); + } + assert (pthread_mutexattr_destroy (&mutexAttr) == 0); +} + +int main (void) { + /** + * Default mutex type is `PTHREAD_MUTEX_NORMAL`. + */ + DoTest (PTHREAD_MUTEX_DEFAULT, PTHREAD_MUTEX_NORMAL, 0, 0); + + /** + * Mutex types defined by POSIX. + */ + DoTest (PTHREAD_MUTEX_NORMAL, PTHREAD_MUTEX_NORMAL, 0, 0); + DoTest (PTHREAD_MUTEX_ERRORCHECK, PTHREAD_MUTEX_ERRORCHECK, 0, 0); + DoTest (PTHREAD_MUTEX_RECURSIVE, PTHREAD_MUTEX_RECURSIVE, 0, 0); + + /** + * Try setting an invalid value; default attribute value must be used. + */ + DoTest (0xFF, PTHREAD_MUTEX_NORMAL, EINVAL, 0); + + return 0; +}