blob: a516f8269ff205c813e89852edf9bed571bb7a7d [file]
// Copyright 2026 The Emscripten Authors. All rights reserved.
// Emscripten is available under two separate licenses, the MIT license and the
// University of Illinois/NCSA Open Source License. Both these licenses can be
// found in the LICENSE file.
#define _GNU_SOURCE
#include <assert.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
void* thread_main_default(void* arg) {
pthread_attr_t attr;
size_t guard_size = 0;
assert(pthread_getattr_np(pthread_self(), &attr) == 0);
assert(pthread_attr_getguardsize(&attr, &guard_size) == 0);
printf("default guard_size: %zu\n", guard_size);
assert(guard_size == 8192);
return NULL;
}
void* thread_main_custom(void* arg) {
pthread_attr_t attr;
size_t guard_size = 0;
assert(pthread_getattr_np(pthread_self(), &attr) == 0);
assert(pthread_attr_getguardsize(&attr, &guard_size) == 0);
printf("custom guard_size: %zu\n", guard_size);
assert(guard_size == 16384);
return NULL;
}
void* thread_main_zero(void* arg) {
pthread_attr_t attr;
size_t guard_size = 0;
assert(pthread_getattr_np(pthread_self(), &attr) == 0);
assert(pthread_attr_getguardsize(&attr, &guard_size) == 0);
printf("zero guard_size: %zu\n", guard_size);
assert(guard_size == 0);
return NULL;
}
int main() {
pthread_t t1, t2, t3;
pthread_attr_t attr;
assert(pthread_create(&t1, NULL, thread_main_default, NULL) == 0);
assert(pthread_join(t1, NULL) == 0);
assert(pthread_attr_init(&attr) == 0);
assert(pthread_attr_setguardsize(&attr, 16384) == 0);
assert(pthread_create(&t2, &attr, thread_main_custom, NULL) == 0);
assert(pthread_join(t2, NULL) == 0);
assert(pthread_attr_destroy(&attr) == 0);
assert(pthread_attr_init(&attr) == 0);
assert(pthread_attr_setguardsize(&attr, 0) == 0);
assert(pthread_create(&t3, &attr, thread_main_zero, NULL) == 0);
assert(pthread_join(t3, NULL) == 0);
assert(pthread_attr_destroy(&attr) == 0);
printf("done\n");
return 0;
}