Loading...
tests/malloc_msl.c /dev/null libmalloc-715.120.13
--- /dev/null
+++ libmalloc/libmalloc-715.120.13/tests/malloc_msl.c
@@ -0,0 +1,56 @@
+//
+//  malloc_msl.c
+//  libmalloc
+//
+//  Test for enabling malloc stack logging while concurrently adding other zones
+//
+
+#include <MallocStackLogging/MallocStackLogging.h>
+#include <darwintest.h>
+#include <malloc/malloc.h>
+
+#if TARGET_OS_WATCH
+#define N_ZONE_CREATION_THREADS 4
+#else // TARGET_OS_WATCH
+#define N_ZONE_CREATION_THREADS 8
+#endif // TARGET_OS_WATCH
+
+static void *
+msl_thread(void *arg)
+{
+	T_LOG("enable MSL");
+	bool enable = msl_turn_on_stack_logging(msl_mode_lite);
+	T_ASSERT_TRUE(enable, "msl_turn_on_stack_logging returned false");
+	usleep(500);
+	msl_turn_off_stack_logging();
+	usleep(500);
+
+	return NULL;
+}
+
+static void *
+zone_thread(void *arg)
+{
+	vm_size_t start_size = (vm_size_t)arg;
+	while (1) {
+		malloc_zone_t *zone = malloc_create_zone(start_size, 0);
+		malloc_destroy_zone(zone);
+	}
+	return NULL;
+}
+
+T_DECL(malloc_enable_msl_lite, "enable the malloc stack logging lite zone while constantly registering zones", T_META_TAG_VM_NOT_PREFERRED)
+{
+	pthread_t zone_threads[N_ZONE_CREATION_THREADS];
+	for (int i = 0; i < N_ZONE_CREATION_THREADS; i++) {
+		vm_size_t zone_start_size = 1000;
+		pthread_create(&zone_threads[i], NULL, zone_thread, (void *)zone_start_size);
+	}
+
+	usleep(50);
+
+	pthread_t msl;
+	pthread_create(&msl, NULL, msl_thread, NULL);
+	pthread_join(msl, NULL);
+	T_PASS("finished without crashing");
+}