From 4cb5e21ba809672b635d18c3750c2e1c4ee599a9 Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Sun, 30 Jun 2024 02:26:06 -0700 Subject: [PATCH] Introduce pthread_decimate_np() api This is useful with CheckForMemoryLeaks(). --- libc/thread/pthread_decimate_np.c | 37 +++++++++++++++++++++++++++++++ libc/thread/thread.h | 1 + 2 files changed, 38 insertions(+) create mode 100644 libc/thread/pthread_decimate_np.c diff --git a/libc/thread/pthread_decimate_np.c b/libc/thread/pthread_decimate_np.c new file mode 100644 index 000000000..a6bc591cf --- /dev/null +++ b/libc/thread/pthread_decimate_np.c @@ -0,0 +1,37 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│ vi: set et ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi │ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2024 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/thread/posixthread.internal.h" +#include "libc/thread/thread.h" + +/** + * Garbage collects POSIX threads runtime. + * + * Let's say you want to run a memory leak detector. You can say: + * + * while (!pthread_orphan_np()) + * pthread_decimate_np(); + * + * To wait until all threads have exited. + * + * @return 0 on success, or errno on error + */ +int pthread_decimate_np(void) { + _pthread_decimate(); + return 0; +} diff --git a/libc/thread/thread.h b/libc/thread/thread.h index 76f372b49..a0eaf0167 100644 --- a/libc/thread/thread.h +++ b/libc/thread/thread.h @@ -166,6 +166,7 @@ int pthread_mutexattr_setpshared(pthread_mutexattr_t *, int) libcesque paramsnon int pthread_mutexattr_settype(pthread_mutexattr_t *, int) libcesque paramsnonnull(); int pthread_once(pthread_once_t *, void (*)(void)) paramsnonnull(); int pthread_orphan_np(void) libcesque; +int pthread_decimate_np(void) libcesque; int pthread_rwlock_destroy(pthread_rwlock_t *) libcesque paramsnonnull(); int pthread_rwlock_init(pthread_rwlock_t *, const pthread_rwlockattr_t *) libcesque paramsnonnull((1)); int pthread_rwlock_rdlock(pthread_rwlock_t *) libcesque paramsnonnull();