winpthreads: tests: split pthread_mutex/mutex4.c

Move test for each mutex type to a separate file.

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 395b598..0fe236b 100644
--- a/mingw-w64-libraries/winpthreads/tests/Makefile.am
+++ b/mingw-w64-libraries/winpthreads/tests/Makefile.am
@@ -121,6 +121,9 @@
 	pthread_mutex/mutex3e      \
 	pthread_mutex/mutex3r      \
 	pthread_mutex/mutex4       \
+	pthread_mutex/mutex4e      \
+	pthread_mutex/mutex4n      \
+	pthread_mutex/mutex4r      \
 	pthread_mutex/mutex5       \
 	pthread_mutex/mutex6       \
 	pthread_mutex/mutex6e      \
diff --git a/mingw-w64-libraries/winpthreads/tests/pthread_mutex/mutex4.c b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/mutex4.c
index 74cec84..33755d3 100644
--- a/mingw-w64-libraries/winpthreads/tests/pthread_mutex/mutex4.c
+++ b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/mutex4.c
@@ -7,8 +7,9 @@
  *      Pthreads-win32 - POSIX Threads Library for Win32
  *      Copyright(C) 1998 John E. Bossom
  *      Copyright(C) 1999,2005 Pthreads-win32 contributors
+ *      Copyright(C) 2026 mingw-w64 project
  *
- *      Contact Email: rpj@callisto.canberra.edu.au
+ *      Contact Email: mingw-w64-public@lists.sourceforge.net
  *
  *      The current list of contributors is contained
  *      in the file CONTRIBUTORS included with the source
@@ -88,45 +89,5 @@
   assert(pthread_mutex_unlock(&mutex1) == 0);
   assert(wasHere == 2);
 
-  wasHere = 0;
-  assert(pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_NORMAL) == 0);
-  assert(pthread_mutex_destroy(&mutex1) == 0);
-  assert(pthread_mutex_init(&mutex1, &ma) == 0);
-  assert(pthread_mutex_lock(&mutex1) == 0);
-  /*
-   * NORMAL (fast) mutexes don't check ownership.
-   */
-  assert(pthread_create(&t, NULL, unlocker, (void *) 0) == 0);
-  assert(pthread_join(t, NULL) == 0);
-  /**
-   * POSIX states that calling `pthread_mutex_unlock` on NORMAL mutex that is
-   * not owned by the calling thread is undefined behavior.
-   *
-   * Our implementation for NORMAL mutexes does not check ownership at all,
-   * so call to `pthread_mutex_unlock` on a valid NORMAL mutex always succeeds.
-   */
-  assert(pthread_mutex_unlock(&mutex1) == 0);
-  assert(wasHere == 2);
-
-  wasHere = 0;
-  assert(pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_ERRORCHECK) == 0);
-  assert(pthread_mutex_destroy(&mutex1) == 0);
-  assert(pthread_mutex_init(&mutex1, &ma) == 0);
-  assert(pthread_mutex_lock(&mutex1) == 0);
-  assert(pthread_create(&t, NULL, unlocker, (void *) EPERM) == 0);
-  assert(pthread_join(t, NULL) == 0);
-  assert(pthread_mutex_unlock(&mutex1) == 0);
-  assert(wasHere == 2);
-
-  wasHere = 0;
-  assert(pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_RECURSIVE) == 0);
-  assert(pthread_mutex_destroy(&mutex1) == 0);
-  assert(pthread_mutex_init(&mutex1, &ma) == 0);
-  assert(pthread_mutex_lock(&mutex1) == 0);
-  assert(pthread_create(&t, NULL, unlocker, (void *) EPERM) == 0);
-  assert(pthread_join(t, NULL) == 0);
-  assert(pthread_mutex_unlock(&mutex1) == 0);
-  assert(wasHere == 2);
-
   return 0;
 }
diff --git a/mingw-w64-libraries/winpthreads/tests/pthread_mutex/mutex4e.c b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/mutex4e.c
new file mode 100644
index 0000000..cc04eca
--- /dev/null
+++ b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/mutex4e.c
@@ -0,0 +1,78 @@
+/*
+ *      Pthreads-win32 - POSIX Threads Library for Win32
+ *      Copyright(C) 1998 John E. Bossom
+ *      Copyright(C) 1999,2005 Pthreads-win32 contributors
+ *      Copyright(C) 2026 mingw-w64 project
+ *
+ *      Contact Email: mingw-w64-public@lists.sourceforge.net
+ *
+ *      The current list of contributors is contained
+ *      in the file CONTRIBUTORS included with the source
+ *      code distribution. The list can also be seen at the
+ *      following World Wide Web location:
+ *      http://sources.redhat.com/pthreads-win32/contributors.html
+ *
+ *      This library is free software; you can redistribute it and/or
+ *      modify it under the terms of the GNU Lesser General Public
+ *      License as published by the Free Software Foundation; either
+ *      version 2 of the License, or (at your option) any later version.
+ *
+ *      This library 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.  See the GNU
+ *      Lesser General Public License for more details.
+ *
+ *      You should have received a copy of the GNU Lesser General Public
+ *      License along with this library in the file COPYING.LIB;
+ *      if not, write to the Free Software Foundation, Inc.,
+ *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ * --------------------------------------------------------------------------
+ *
+ * Thread A locks mutex - thread B tries to unlock.
+ *
+ * Depends on API functions:
+ *  pthread_mutex_lock()
+ *  pthread_mutex_trylock()
+ *  pthread_mutex_unlock()
+ */
+
+#include "test.h"
+
+static int wasHere = 0;
+
+static pthread_mutex_t mutex1;
+
+void *unlocker(void *arg)
+{
+  int expectedResult = (int) (size_t) arg;
+  int h;
+
+  wasHere++;
+  h = pthread_mutex_unlock(&mutex1);
+  printf("*** %d==%d\n\n", h, expectedResult);
+  fflush(stdout);
+  assert(h == expectedResult);
+  wasHere++;
+
+  return NULL;
+}
+
+int main(void)
+{
+  pthread_t t;
+  pthread_mutexattr_t ma;
+
+  assert(pthread_mutexattr_init(&ma) == 0);
+
+  wasHere = 0;
+  assert(pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_ERRORCHECK) == 0);
+  assert(pthread_mutex_init(&mutex1, &ma) == 0);
+  assert(pthread_mutex_lock(&mutex1) == 0);
+  assert(pthread_create(&t, NULL, unlocker, (void *) EPERM) == 0);
+  assert(pthread_join(t, NULL) == 0);
+  assert(pthread_mutex_unlock(&mutex1) == 0);
+  assert(wasHere == 2);
+
+  return 0;
+}
diff --git a/mingw-w64-libraries/winpthreads/tests/pthread_mutex/mutex4n.c b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/mutex4n.c
new file mode 100644
index 0000000..f3933e1
--- /dev/null
+++ b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/mutex4n.c
@@ -0,0 +1,88 @@
+/*
+ *      Pthreads-win32 - POSIX Threads Library for Win32
+ *      Copyright(C) 1998 John E. Bossom
+ *      Copyright(C) 1999,2005 Pthreads-win32 contributors
+ *      Copyright(C) 2026 mingw-w64 project
+ *
+ *      Contact Email: mingw-w64-public@lists.sourceforge.net
+ *
+ *      The current list of contributors is contained
+ *      in the file CONTRIBUTORS included with the source
+ *      code distribution. The list can also be seen at the
+ *      following World Wide Web location:
+ *      http://sources.redhat.com/pthreads-win32/contributors.html
+ *
+ *      This library is free software; you can redistribute it and/or
+ *      modify it under the terms of the GNU Lesser General Public
+ *      License as published by the Free Software Foundation; either
+ *      version 2 of the License, or (at your option) any later version.
+ *
+ *      This library 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.  See the GNU
+ *      Lesser General Public License for more details.
+ *
+ *      You should have received a copy of the GNU Lesser General Public
+ *      License along with this library in the file COPYING.LIB;
+ *      if not, write to the Free Software Foundation, Inc.,
+ *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ * --------------------------------------------------------------------------
+ *
+ * Thread A locks mutex - thread B tries to unlock.
+ *
+ * Depends on API functions:
+ *  pthread_mutex_lock()
+ *  pthread_mutex_trylock()
+ *  pthread_mutex_unlock()
+ */
+
+#include "test.h"
+
+static int wasHere = 0;
+
+static pthread_mutex_t mutex1;
+
+void *unlocker(void *arg)
+{
+  int expectedResult = (int) (size_t) arg;
+  int h;
+
+  wasHere++;
+  h = pthread_mutex_unlock(&mutex1);
+  printf("*** %d==%d\n\n", h, expectedResult);
+  fflush(stdout);
+  assert(h == expectedResult);
+  wasHere++;
+
+  return NULL;
+}
+
+int main(void)
+{
+  pthread_t t;
+  pthread_mutexattr_t ma;
+
+  assert(pthread_mutexattr_init(&ma) == 0);
+
+  wasHere = 0;
+  assert(pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_NORMAL) == 0);
+  assert(pthread_mutex_init(&mutex1, &ma) == 0);
+  assert(pthread_mutex_lock(&mutex1) == 0);
+  /*
+   * NORMAL (fast) mutexes don't check ownership.
+   */
+  assert(pthread_create(&t, NULL, unlocker, (void *) 0) == 0);
+  assert(pthread_join(t, NULL) == 0);
+  /**
+   * POSIX states that calling `pthread_mutex_unlock` on NORMAL mutex that is
+   * not owned by the calling thread is undefined behavior.
+   *
+   * Our implementation for NORMAL mutexes does not check ownership at all,
+   * so call to `pthread_mutex_unlock` on a valid NORMAL mutex always succeeds.
+   */
+  assert(pthread_mutex_unlock(&mutex1) == 0);
+  assert(wasHere == 2);
+
+  return 0;
+}
diff --git a/mingw-w64-libraries/winpthreads/tests/pthread_mutex/mutex4r.c b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/mutex4r.c
new file mode 100644
index 0000000..291652f
--- /dev/null
+++ b/mingw-w64-libraries/winpthreads/tests/pthread_mutex/mutex4r.c
@@ -0,0 +1,78 @@
+/*
+ *      Pthreads-win32 - POSIX Threads Library for Win32
+ *      Copyright(C) 1998 John E. Bossom
+ *      Copyright(C) 1999,2005 Pthreads-win32 contributors
+ *      Copyright(C) 2026 mingw-w64 project
+ *
+ *      Contact Email: mingw-w64-public@lists.sourceforge.net
+ *
+ *      The current list of contributors is contained
+ *      in the file CONTRIBUTORS included with the source
+ *      code distribution. The list can also be seen at the
+ *      following World Wide Web location:
+ *      http://sources.redhat.com/pthreads-win32/contributors.html
+ *
+ *      This library is free software; you can redistribute it and/or
+ *      modify it under the terms of the GNU Lesser General Public
+ *      License as published by the Free Software Foundation; either
+ *      version 2 of the License, or (at your option) any later version.
+ *
+ *      This library 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.  See the GNU
+ *      Lesser General Public License for more details.
+ *
+ *      You should have received a copy of the GNU Lesser General Public
+ *      License along with this library in the file COPYING.LIB;
+ *      if not, write to the Free Software Foundation, Inc.,
+ *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ * --------------------------------------------------------------------------
+ *
+ * Thread A locks mutex - thread B tries to unlock.
+ *
+ * Depends on API functions:
+ *  pthread_mutex_lock()
+ *  pthread_mutex_trylock()
+ *  pthread_mutex_unlock()
+ */
+
+#include "test.h"
+
+static int wasHere = 0;
+
+static pthread_mutex_t mutex1;
+
+void *unlocker(void *arg)
+{
+  int expectedResult = (int) (size_t) arg;
+  int h;
+
+  wasHere++;
+  h = pthread_mutex_unlock(&mutex1);
+  printf("*** %d==%d\n\n", h, expectedResult);
+  fflush(stdout);
+  assert(h == expectedResult);
+  wasHere++;
+
+  return NULL;
+}
+
+int main(void)
+{
+  pthread_t t;
+  pthread_mutexattr_t ma;
+
+  assert(pthread_mutexattr_init(&ma) == 0);
+
+  wasHere = 0;
+  assert(pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_RECURSIVE) == 0);
+  assert(pthread_mutex_init(&mutex1, &ma) == 0);
+  assert(pthread_mutex_lock(&mutex1) == 0);
+  assert(pthread_create(&t, NULL, unlocker, (void *) EPERM) == 0);
+  assert(pthread_join(t, NULL) == 0);
+  assert(pthread_mutex_unlock(&mutex1) == 0);
+  assert(wasHere == 2);
+
+  return 0;
+}