Add new tests for aligned_alloc (RHEL-50101)
Resolves: RHEL-50101
This commit is contained in:
parent
0ecf9bed9b
commit
0d2a788a88
240
glibc-RHEL-50101-1.patch
Normal file
240
glibc-RHEL-50101-1.patch
Normal file
@ -0,0 +1,240 @@
|
||||
commit 3395157ff2b0657d70c36169156f67440205c8bf
|
||||
Author: Joe Simmons-Talbott <josimmon@redhat.com>
|
||||
Date: Tue May 14 14:36:50 2024 +0000
|
||||
|
||||
malloc: Improve aligned_alloc and calloc test coverage.
|
||||
|
||||
Add a DSO (malloc/tst-aligned_alloc-lib.so) that can be used during
|
||||
testing to interpose malloc with a call that randomly uses either
|
||||
aligned_alloc, __libc_malloc, or __libc_calloc in the place of malloc.
|
||||
Use LD_PRELOAD with the DSO to mirror malloc/tst-malloc.c testing as an
|
||||
example in malloc/tst-malloc-random.c. Add malloc/tst-aligned-alloc-random.c
|
||||
as another example that does a number of malloc calls with randomly sized,
|
||||
but limited to 0xffff, requests.
|
||||
|
||||
The intention is to be able to utilize existing malloc testing to ensure
|
||||
that similar allocation APIs are also exposed to the same rigors.
|
||||
|
||||
Reviewed-by: DJ Delorie <dj@redhat.com>
|
||||
|
||||
Conflicts:
|
||||
malloc/Makefile
|
||||
(usual tests conflict)
|
||||
|
||||
diff --git a/malloc/Makefile b/malloc/Makefile
|
||||
index cb4e027d28b179f0..e0fb433a15bad2c2 100644
|
||||
--- a/malloc/Makefile
|
||||
+++ b/malloc/Makefile
|
||||
@@ -44,6 +44,8 @@ tests := mallocbug tst-malloc tst-valloc tst-calloc tst-obstack \
|
||||
tst-safe-linking \
|
||||
tst-mallocalign1 \
|
||||
tst-malloc-alternate-path \
|
||||
+ tst-aligned-alloc-random \
|
||||
+ tst-malloc-random \
|
||||
|
||||
tests-static := \
|
||||
tst-interpose-static-nothread \
|
||||
@@ -123,6 +125,7 @@ extra-libs-others = $(extra-libs)
|
||||
|
||||
# Helper objects for some tests.
|
||||
extra-tests-objs += \
|
||||
+ tst-aligned_alloc-lib.so \
|
||||
tst-interpose-aux-nothread.o \
|
||||
tst-interpose-aux-thread.o \
|
||||
|
||||
@@ -130,6 +133,9 @@ test-extras = \
|
||||
tst-interpose-aux-nothread \
|
||||
tst-interpose-aux-thread \
|
||||
|
||||
+modules-names = \
|
||||
+ tst-aligned_alloc-lib
|
||||
+
|
||||
libmemusage-routines = memusage
|
||||
libmemusage-inhibit-o = $(filter-out .os,$(object-suffixes))
|
||||
|
||||
@@ -328,3 +334,9 @@ tst-mallocstate-malloc-check-ENV = LD_PRELOAD=$(objpfx)libc_malloc_debug.so
|
||||
# libc_malloc_debug.so.
|
||||
$(objpfx)tst-mallocstate: $(objpfx)libc_malloc_debug.so
|
||||
$(objpfx)tst-mallocstate-malloc-check: $(objpfx)libc_malloc_debug.so
|
||||
+
|
||||
+$(objpfx)tst-aligned-alloc-random.out: $(objpfx)tst-aligned_alloc-lib.so
|
||||
+$(objpfx)tst-malloc-random.out: $(objpfx)tst-aligned_alloc-lib.so
|
||||
+
|
||||
+tst-aligned-alloc-random-ENV = LD_PRELOAD=$(objpfx)tst-aligned_alloc-lib.so
|
||||
+tst-malloc-random-ENV = LD_PRELOAD=$(objpfx)tst-aligned_alloc-lib.so
|
||||
diff --git a/malloc/tst-aligned-alloc-random.c b/malloc/tst-aligned-alloc-random.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..f2825ce38f04e04e
|
||||
--- /dev/null
|
||||
+++ b/malloc/tst-aligned-alloc-random.c
|
||||
@@ -0,0 +1,43 @@
|
||||
+/* Test for randomized malloc that calls aligned_alloc
|
||||
+ Copyright (C) 2024 Free Software Foundation, Inc.
|
||||
+ This file is part of the GNU C Library.
|
||||
+
|
||||
+ The GNU C 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.1 of the License, or (at your option) any later version.
|
||||
+
|
||||
+ The GNU C 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 the GNU C Library; if not, see
|
||||
+ <https://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#include <stdlib.h>
|
||||
+#include <support/check.h>
|
||||
+#include <time.h>
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+ void *p1;
|
||||
+ int i;
|
||||
+
|
||||
+ srandom (time (NULL));
|
||||
+
|
||||
+ for (i = 0; i < 1024; i++)
|
||||
+ {
|
||||
+ size_t size = random () & 0xffff;
|
||||
+
|
||||
+ p1 = malloc (size);
|
||||
+ TEST_VERIFY (p1 != NULL);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+#include <support/test-driver.c>
|
||||
diff --git a/malloc/tst-aligned_alloc-lib.c b/malloc/tst-aligned_alloc-lib.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..0205df5acf6297a5
|
||||
--- /dev/null
|
||||
+++ b/malloc/tst-aligned_alloc-lib.c
|
||||
@@ -0,0 +1,72 @@
|
||||
+/* Module used for improved aligned_alloc testing.
|
||||
+ Copyright (C) 2024 Free Software Foundation, Inc.
|
||||
+ Copyright The GNU Toolchain Authors.
|
||||
+ This file is part of the GNU C Library.
|
||||
+
|
||||
+ The GNU C 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.1 of the
|
||||
+ License, or (at your option) any later version.
|
||||
+
|
||||
+ The GNU C 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 the GNU C Library; see the file COPYING.LIB. If
|
||||
+ not, see <https://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#include <array_length.h>
|
||||
+#include <libc-symbols.h>
|
||||
+#include <stdlib.h>
|
||||
+
|
||||
+extern void *__libc_malloc (size_t size);
|
||||
+extern void *__libc_calloc (size_t n, size_t size);
|
||||
+
|
||||
+int aligned_alloc_count = 0;
|
||||
+int libc_malloc_count = 0;
|
||||
+int libc_calloc_count = 0;
|
||||
+
|
||||
+/* Get a random alignment value. Biased towards the smaller values. Must be
|
||||
+ a power of 2. */
|
||||
+static size_t get_random_alignment (void)
|
||||
+{
|
||||
+ size_t aligns[] = {
|
||||
+ 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384
|
||||
+ };
|
||||
+
|
||||
+ return aligns[random () % array_length (aligns)];
|
||||
+}
|
||||
+
|
||||
+static void *get_random_alloc (size_t size)
|
||||
+{
|
||||
+ void *retval;
|
||||
+ size_t align;
|
||||
+
|
||||
+ switch (random() % 3)
|
||||
+ {
|
||||
+ case 1:
|
||||
+ align = get_random_alignment ();
|
||||
+ retval = aligned_alloc (align, size);
|
||||
+ aligned_alloc_count++;
|
||||
+ break;
|
||||
+ case 2:
|
||||
+ retval = __libc_calloc (1, size);
|
||||
+ libc_calloc_count++;
|
||||
+ break;
|
||||
+ default:
|
||||
+ retval = __libc_malloc (size);
|
||||
+ libc_malloc_count++;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ return retval;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+void * __random_malloc (size_t size)
|
||||
+{
|
||||
+ return get_random_alloc (size);
|
||||
+}
|
||||
+strong_alias (__random_malloc, malloc)
|
||||
diff --git a/malloc/tst-malloc-random.c b/malloc/tst-malloc-random.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..762b70c918cc6004
|
||||
--- /dev/null
|
||||
+++ b/malloc/tst-malloc-random.c
|
||||
@@ -0,0 +1,20 @@
|
||||
+/* Test malloc with random calls to aligned_alloc and calloc.
|
||||
+
|
||||
+ Copyright (C) 2024 Free Software Foundation, Inc.
|
||||
+ This file is part of the GNU C Library.
|
||||
+
|
||||
+ The GNU C 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.1 of the License, or (at your option) any later version.
|
||||
+
|
||||
+ The GNU C 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 the GNU C Library; if not, see
|
||||
+ <https://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#include "tst-malloc.c"
|
||||
diff --git a/malloc/tst-malloc.c b/malloc/tst-malloc.c
|
||||
index a587cbded66039fb..98be3ee254d75d4e 100644
|
||||
--- a/malloc/tst-malloc.c
|
||||
+++ b/malloc/tst-malloc.c
|
||||
@@ -19,7 +19,9 @@
|
||||
#include <errno.h>
|
||||
#include <malloc.h>
|
||||
#include <stdio.h>
|
||||
+#include <stdlib.h>
|
||||
#include <libc-diag.h>
|
||||
+#include <time.h>
|
||||
|
||||
static int errors = 0;
|
||||
|
||||
@@ -36,6 +38,8 @@ do_test (void)
|
||||
void *p, *q;
|
||||
int save;
|
||||
|
||||
+ srandom (time (NULL));
|
||||
+
|
||||
errno = 0;
|
||||
|
||||
DIAG_PUSH_NEEDS_COMMENT;
|
86
glibc-RHEL-50101-2.patch
Normal file
86
glibc-RHEL-50101-2.patch
Normal file
@ -0,0 +1,86 @@
|
||||
commit 9a27b566b2048f599048f2f4afe1cce06c4ef43d
|
||||
Author: Miguel Martín <mmartinv@redhat.com>
|
||||
Date: Tue Jul 16 17:14:56 2024 +0200
|
||||
|
||||
malloc: avoid global locks in tst-aligned_alloc-lib.c
|
||||
|
||||
Make sure the DSO used by aligned_alloc/calloc/malloc tests does not get
|
||||
a global lock on multithreaded tests.
|
||||
Reviewed-by: Arjun Shankar <arjun@redhat.com>
|
||||
|
||||
diff --git a/malloc/tst-aligned_alloc-lib.c b/malloc/tst-aligned_alloc-lib.c
|
||||
index 0205df5acf6297a5..9ef1f839c101a6ae 100644
|
||||
--- a/malloc/tst-aligned_alloc-lib.c
|
||||
+++ b/malloc/tst-aligned_alloc-lib.c
|
||||
@@ -17,37 +17,38 @@
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
-#include <array_length.h>
|
||||
#include <libc-symbols.h>
|
||||
#include <stdlib.h>
|
||||
+#include <time.h>
|
||||
|
||||
extern void *__libc_malloc (size_t size);
|
||||
extern void *__libc_calloc (size_t n, size_t size);
|
||||
|
||||
+__thread unsigned int seed = 0;
|
||||
+
|
||||
int aligned_alloc_count = 0;
|
||||
int libc_malloc_count = 0;
|
||||
int libc_calloc_count = 0;
|
||||
|
||||
-/* Get a random alignment value. Biased towards the smaller values. Must be
|
||||
- a power of 2. */
|
||||
-static size_t get_random_alignment (void)
|
||||
-{
|
||||
- size_t aligns[] = {
|
||||
- 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384
|
||||
- };
|
||||
-
|
||||
- return aligns[random () % array_length (aligns)];
|
||||
-}
|
||||
-
|
||||
-static void *get_random_alloc (size_t size)
|
||||
+static void *
|
||||
+get_random_alloc (size_t size)
|
||||
{
|
||||
void *retval;
|
||||
size_t align;
|
||||
+ struct timespec tp;
|
||||
+
|
||||
+ if (seed == 0)
|
||||
+ {
|
||||
+ clock_gettime (CLOCK_REALTIME, &tp);
|
||||
+ seed = tp.tv_nsec;
|
||||
+ }
|
||||
|
||||
- switch (random() % 3)
|
||||
- {
|
||||
+ switch (rand_r (&seed) % 3)
|
||||
+ {
|
||||
case 1:
|
||||
- align = get_random_alignment ();
|
||||
+ /* Get a random alignment value. Biased towards the smaller
|
||||
+ * values up to 16384. Must be a power of 2. */
|
||||
+ align = 1 << rand_r (&seed) % 15;
|
||||
retval = aligned_alloc (align, size);
|
||||
aligned_alloc_count++;
|
||||
break;
|
||||
@@ -59,13 +60,13 @@ static void *get_random_alloc (size_t size)
|
||||
retval = __libc_malloc (size);
|
||||
libc_malloc_count++;
|
||||
break;
|
||||
- }
|
||||
+ }
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
-
|
||||
-void * __random_malloc (size_t size)
|
||||
+void *
|
||||
+__random_malloc (size_t size)
|
||||
{
|
||||
return get_random_alloc (size);
|
||||
}
|
251
glibc-RHEL-50101-3.patch
Normal file
251
glibc-RHEL-50101-3.patch
Normal file
@ -0,0 +1,251 @@
|
||||
commit b0fbcb7d0051a68baf26b2aed51a8a31c34d68e5
|
||||
Author: Miguel Martín <mmartinv@redhat.com>
|
||||
Date: Tue Jul 16 17:14:57 2024 +0200
|
||||
|
||||
malloc: add multi-threaded tests for aligned_alloc/calloc/malloc
|
||||
|
||||
Improve aligned_alloc/calloc/malloc test coverage by adding
|
||||
multi-threaded tests with random memory allocations and with/without
|
||||
cross-thread memory deallocations.
|
||||
|
||||
Perform a number of memory allocation calls with random sizes limited
|
||||
to 0xffff.
|
||||
|
||||
Use the existing DSO ('malloc/tst-aligned_alloc-lib.c') to randomize
|
||||
allocator selection.
|
||||
|
||||
The multi-threaded allocation/deallocation is staged as described below:
|
||||
|
||||
- Stage 1: Half of the threads will be allocating memory and the
|
||||
other half will be waiting for them to finish the allocation.
|
||||
- Stage 2: Half of the threads will be allocating memory and the
|
||||
other half will be deallocating memory.
|
||||
- Stage 3: Half of the threads will be deallocating memory and the
|
||||
second half waiting on them to finish.
|
||||
|
||||
Add 'malloc/tst-aligned-alloc-random-thread.c' where each thread will
|
||||
deallocate only the memory that was previously allocated by itself.
|
||||
|
||||
Add 'malloc/tst-aligned-alloc-random-thread-cross.c' where each thread
|
||||
will deallocate memory that was previously allocated by another thread.
|
||||
|
||||
The intention is to be able to utilize existing malloc testing to ensure
|
||||
that similar allocation APIs are also exposed to the same rigors.
|
||||
Reviewed-by: Arjun Shankar <arjun@redhat.com>
|
||||
|
||||
Conflicts:
|
||||
malloc/Makefile
|
||||
(usual tests conflict)
|
||||
|
||||
diff --git a/malloc/Makefile b/malloc/Makefile
|
||||
index e0fb433a15bad2c2..9dc068f6b3a69caa 100644
|
||||
--- a/malloc/Makefile
|
||||
+++ b/malloc/Makefile
|
||||
@@ -46,6 +46,8 @@ tests := mallocbug tst-malloc tst-valloc tst-calloc tst-obstack \
|
||||
tst-malloc-alternate-path \
|
||||
tst-aligned-alloc-random \
|
||||
tst-malloc-random \
|
||||
+ tst-aligned-alloc-random-thread \
|
||||
+ tst-aligned-alloc-random-thread-cross \
|
||||
|
||||
tests-static := \
|
||||
tst-interpose-static-nothread \
|
||||
@@ -96,7 +98,9 @@ tests-exclude-mcheck = tst-mallocstate \
|
||||
tst-malloc-thread-fail \
|
||||
tst-malloc-usable-tunables \
|
||||
tst-malloc_info \
|
||||
- tst-compathooks-off tst-compathooks-on
|
||||
+ tst-compathooks-off tst-compathooks-on \
|
||||
+ tst-aligned-alloc-random-thread \
|
||||
+ tst-aligned-alloc-random-thread-cross \
|
||||
|
||||
tests-mcheck = $(filter-out $(tests-exclude-mcheck) $(tests-static), $(tests))
|
||||
endif
|
||||
@@ -336,7 +340,11 @@ $(objpfx)tst-mallocstate: $(objpfx)libc_malloc_debug.so
|
||||
$(objpfx)tst-mallocstate-malloc-check: $(objpfx)libc_malloc_debug.so
|
||||
|
||||
$(objpfx)tst-aligned-alloc-random.out: $(objpfx)tst-aligned_alloc-lib.so
|
||||
+$(objpfx)tst-aligned-alloc-random-thread.out: $(objpfx)tst-aligned_alloc-lib.so
|
||||
+$(objpfx)tst-aligned-alloc-random-thread-cross.out: $(objpfx)tst-aligned_alloc-lib.so
|
||||
$(objpfx)tst-malloc-random.out: $(objpfx)tst-aligned_alloc-lib.so
|
||||
|
||||
tst-aligned-alloc-random-ENV = LD_PRELOAD=$(objpfx)tst-aligned_alloc-lib.so
|
||||
+tst-aligned-alloc-random-thread-ENV = LD_PRELOAD=$(objpfx)tst-aligned_alloc-lib.so
|
||||
+tst-aligned-alloc-random-thread-cross-ENV = LD_PRELOAD=$(objpfx)tst-aligned_alloc-lib.so
|
||||
tst-malloc-random-ENV = LD_PRELOAD=$(objpfx)tst-aligned_alloc-lib.so
|
||||
diff --git a/malloc/tst-aligned-alloc-random-thread-cross.c b/malloc/tst-aligned-alloc-random-thread-cross.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..360ecc56ee7c8c06
|
||||
--- /dev/null
|
||||
+++ b/malloc/tst-aligned-alloc-random-thread-cross.c
|
||||
@@ -0,0 +1,19 @@
|
||||
+/* multi-threaded memory allocation and cross-thread deallocation test.
|
||||
+ Copyright (C) 2024 Free Software Foundation, Inc.
|
||||
+ This file is part of the GNU C Library.
|
||||
+
|
||||
+ The GNU C 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.1 of the
|
||||
+ License, or (at your option) any later version.
|
||||
+
|
||||
+ The GNU C 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 the GNU C Library; see the file COPYING.LIB. If
|
||||
+ not, see <https://www.gnu.org/licenses/>. */
|
||||
+#define CROSS_THREAD_DEALLOC
|
||||
+#include "tst-aligned-alloc-random-thread.c"
|
||||
diff --git a/malloc/tst-aligned-alloc-random-thread.c b/malloc/tst-aligned-alloc-random-thread.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..e95f79250abec85e
|
||||
--- /dev/null
|
||||
+++ b/malloc/tst-aligned-alloc-random-thread.c
|
||||
@@ -0,0 +1,145 @@
|
||||
+/* multi-threaded memory allocation/deallocation test.
|
||||
+ Copyright (C) 2024 Free Software Foundation, Inc.
|
||||
+ This file is part of the GNU C Library.
|
||||
+
|
||||
+ The GNU C 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.1 of the
|
||||
+ License, or (at your option) any later version.
|
||||
+
|
||||
+ The GNU C 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 the GNU C Library; see the file COPYING.LIB. If
|
||||
+ not, see <https://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#include <stdio.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <string.h>
|
||||
+#include <support/check.h>
|
||||
+#include <support/support.h>
|
||||
+#include <support/xthread.h>
|
||||
+#include <support/test-driver.h>
|
||||
+#include <sys/sysinfo.h>
|
||||
+#include <unistd.h>
|
||||
+
|
||||
+#ifndef ITERATIONS
|
||||
+# define ITERATIONS 16
|
||||
+#endif
|
||||
+
|
||||
+#ifndef NUM_THREADS
|
||||
+# define NUM_THREADS 8
|
||||
+#endif
|
||||
+
|
||||
+#ifndef NUM_ALLOCATIONS
|
||||
+# define NUM_ALLOCATIONS 2048
|
||||
+#endif
|
||||
+
|
||||
+static pthread_barrier_t barrier;
|
||||
+
|
||||
+__thread unsigned int seed;
|
||||
+
|
||||
+typedef struct
|
||||
+{
|
||||
+ int id;
|
||||
+ pthread_t thread;
|
||||
+} thread;
|
||||
+
|
||||
+thread threads[NUM_THREADS];
|
||||
+
|
||||
+void *allocations[NUM_THREADS][NUM_ALLOCATIONS];
|
||||
+
|
||||
+void
|
||||
+run_thread_dealloc (int id)
|
||||
+{
|
||||
+ for (int i = 0; i < NUM_ALLOCATIONS; i++)
|
||||
+ {
|
||||
+ free (allocations[id][i]);
|
||||
+ allocations[id][i] = NULL;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+run_thread_alloc (int id)
|
||||
+{
|
||||
+ size_t msb, size;
|
||||
+ for (int i = 0; i < NUM_ALLOCATIONS; i++)
|
||||
+ {
|
||||
+ msb = 1 << rand_r (&seed) % 16;
|
||||
+ size = msb + rand_r (&seed) % msb;
|
||||
+ allocations[id][i] = malloc (size);
|
||||
+ TEST_VERIFY_EXIT (allocations[id][i] != NULL);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+void *
|
||||
+run_allocations (void *arg)
|
||||
+{
|
||||
+ int id = *((int *) arg);
|
||||
+ seed = time (NULL) + id;
|
||||
+
|
||||
+ /* Stage 1: First half o the threads allocating memory and the second
|
||||
+ * half waiting for them to finish
|
||||
+ */
|
||||
+ if (id < NUM_THREADS / 2)
|
||||
+ run_thread_alloc (id);
|
||||
+
|
||||
+ xpthread_barrier_wait (&barrier);
|
||||
+
|
||||
+ /* Stage 2: Half of the threads allocationg memory and the other
|
||||
+ * half deallocating:
|
||||
+ * - In the non cross-thread dealloc scenario the first half will be
|
||||
+ * deallocating the memory allocated by themselves in stage 1 and the
|
||||
+ * second half will be allocating memory.
|
||||
+ * - In the cross-thread dealloc scenario the first half will continue
|
||||
+ * to allocate memory and the second half will deallocate the memory
|
||||
+ * allocated by the first half in stage 1.
|
||||
+ */
|
||||
+ if (id < NUM_THREADS / 2)
|
||||
+#ifndef CROSS_THREAD_DEALLOC
|
||||
+ run_thread_dealloc (id);
|
||||
+#else
|
||||
+ run_thread_alloc (id + NUM_THREADS / 2);
|
||||
+#endif
|
||||
+ else
|
||||
+#ifndef CROSS_THREAD_DEALLOC
|
||||
+ run_thread_alloc (id);
|
||||
+#else
|
||||
+ run_thread_dealloc (id - NUM_THREADS / 2);
|
||||
+#endif
|
||||
+
|
||||
+ xpthread_barrier_wait (&barrier);
|
||||
+
|
||||
+ // Stage 3: Second half of the threads deallocating and the first half
|
||||
+ // waiting for them to finish.
|
||||
+ if (id >= NUM_THREADS / 2)
|
||||
+ run_thread_dealloc (id);
|
||||
+
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+ xpthread_barrier_init (&barrier, NULL, NUM_THREADS);
|
||||
+
|
||||
+ for (int i = 0; i < ITERATIONS; i++)
|
||||
+ {
|
||||
+ for (int t = 0; t < NUM_THREADS; t++)
|
||||
+ {
|
||||
+ threads[t].id = t;
|
||||
+ threads[t].thread
|
||||
+ = xpthread_create (NULL, run_allocations, &threads[t].id);
|
||||
+ }
|
||||
+
|
||||
+ for (int t = 0; t < NUM_THREADS; t++)
|
||||
+ xpthread_join (threads[t].thread);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#include <support/test-driver.c>
|
@ -157,7 +157,7 @@ end \
|
||||
Summary: The GNU libc libraries
|
||||
Name: glibc
|
||||
Version: %{glibcversion}
|
||||
Release: 118%{?dist}
|
||||
Release: 119%{?dist}
|
||||
|
||||
# In general, GPLv2+ is used by programs, LGPLv2+ is used for
|
||||
# libraries.
|
||||
@ -844,6 +844,9 @@ Patch605: glibc-RHEL-25257-1.patch
|
||||
Patch606: glibc-RHEL-25257-2.patch
|
||||
Patch607: glibc-RHEL-46741-1.patch
|
||||
Patch608: glibc-RHEL-46741-2.patch
|
||||
Patch609: glibc-RHEL-50101-1.patch
|
||||
Patch610: glibc-RHEL-50101-2.patch
|
||||
Patch611: glibc-RHEL-50101-3.patch
|
||||
|
||||
##############################################################################
|
||||
# Continued list of core "glibc" package information:
|
||||
@ -3003,6 +3006,9 @@ update_gconv_modules_cache ()
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Tue Aug 06 2024 Arjun Shankar <arjun@redhat.com> - 2.34-119
|
||||
- Add new tests for aligned_alloc (RHEL-50101)
|
||||
|
||||
* Tue Aug 06 2024 Arjun Shankar <arjun@redhat.com> - 2.34-118
|
||||
- manual: Improve documentation of putc, putwc, getc, and getwc (RHEL-46741)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user