aboutsummaryrefslogtreecommitdiff
path: root/nptl
diff options
context:
space:
mode:
Diffstat (limited to 'nptl')
-rw-r--r--nptl/tst-tls3-malloc.c156
1 files changed, 3 insertions, 153 deletions
diff --git a/nptl/tst-tls3-malloc.c b/nptl/tst-tls3-malloc.c
index 8a580fa..719ab28 100644
--- a/nptl/tst-tls3-malloc.c
+++ b/nptl/tst-tls3-malloc.c
@@ -17,6 +17,7 @@
<http://www.gnu.org/licenses/>. */
/* Reuse the test. */
+#define STACK_SIZE_MB 5
#include "tst-tls3.c"
/* Increase the thread stack size to 10 MiB, so that some thread
@@ -26,156 +27,5 @@ static long stack_size_in_mb = 10;
#include <sys/mman.h>
-/* Interpose a minimal malloc implementation. This implementation
- deliberately interposes just a restricted set of symbols, to detect
- if the TLS code bypasses the interposed malloc. */
-
-/* Lock to guard malloc internals. */
-static pthread_mutex_t malloc_lock = PTHREAD_MUTEX_INITIALIZER;
-
-/* Information about an allocation chunk. */
-struct malloc_chunk
-{
- /* Start of the allocation. */
- void *start;
- /* Size of the allocation. */
- size_t size;
-};
-
-enum { malloc_chunk_count = 1000 };
-static struct malloc_chunk chunks[malloc_chunk_count];
-
-/* Lock the malloc lock. */
-static void
-xlock (void)
-{
- int ret = pthread_mutex_lock (&malloc_lock);
- if (ret != 0)
- {
- errno = ret;
- printf ("error: pthread_mutex_lock: %m\n");
- _exit (1);
- }
-}
-
-/* Unlock the malloc lock. */
-static void
-xunlock (void)
-{
- int ret = pthread_mutex_unlock (&malloc_lock);
- if (ret != 0)
- {
- errno = ret;
- printf ("error: pthread_mutex_unlock: %m\n");
- _exit (1);
- }
-}
-
-/* Internal malloc without locking and registration. */
-static void *
-malloc_internal (size_t size)
-{
- void *result = mmap (NULL, size, PROT_READ | PROT_WRITE,
- MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
- if (result == MAP_FAILED)
- {
- printf ("error: mmap: %m\n");
- _exit (1);
- }
- return result;
-}
-
-void *
-malloc (size_t size)
-{
- if (size == 0)
- size = 1;
- xlock ();
- void *result = malloc_internal (size);
- for (int i = 0; i < malloc_chunk_count; ++i)
- if (chunks[i].start == NULL)
- {
- chunks[i].start = result;
- chunks[i].size = size;
- xunlock ();
- return result;
- }
- xunlock ();
- printf ("error: no place to store chunk pointer\n");
- _exit (1);
-}
-
-void *
-calloc (size_t a, size_t b)
-{
- if (b != 0 && a > SIZE_MAX / b)
- return NULL;
- /* malloc uses mmap, which provides zeroed memory. */
- return malloc (a * b);
-}
-
-static void
-xunmap (void *ptr, size_t size)
-{
- int ret = munmap (ptr, size);
- if (ret < 0)
- {
- printf ("error: munmap (%p, %zu) failed: %m\n", ptr, size);
- _exit (1);
- }
-}
-
-void
-free (void *ptr)
-{
- if (ptr == NULL)
- return;
-
- xlock ();
- for (int i = 0; i < malloc_chunk_count; ++i)
- if (chunks[i].start == ptr)
- {
- xunmap (ptr, chunks[i].size);
- chunks[i] = (struct malloc_chunk) {};
- xunlock ();
- return;
- }
- xunlock ();
- printf ("error: tried to free non-allocated pointer %p\n", ptr);
- _exit (1);
-}
-
-void *
-realloc (void *old, size_t size)
-{
- if (old != NULL)
- {
- xlock ();
- for (int i = 0; i < malloc_chunk_count; ++i)
- if (chunks[i].start == old)
- {
- size_t old_size = chunks[i].size;
- void *result;
- if (old_size < size)
- {
- result = malloc_internal (size);
- /* Reuse the slot for the new allocation. */
- memcpy (result, old, old_size);
- xunmap (old, old_size);
- chunks[i].start = result;
- chunks[i].size = size;
- }
- else
- /* Old size is not smaller, so reuse the old
- allocation. */
- result = old;
- xunlock ();
- return result;
- }
- xunlock ();
- printf ("error: tried to realloc non-allocated pointer %p\n", old);
- _exit (1);
- }
- else
- return malloc (size);
-}
+#define INTERPOSE_THREADS 1
+#include "../malloc/tst-interpose-aux.c"