/* * This file and its contents are supplied under the terms of the * Common Development and Distribution License ("CDDL"), version 1.0. * You may only use this file in accordance with the terms of version * 1.0 of the CDDL. * * A full copy of the text of the CDDL should have accompanied this * source. A copy of the CDDL is also available via the Internet at * http://www.illumos.org/license/CDDL. */ /* * Copyright 2018 Joyent, Inc. */ /* * All we're doing is constantly modifying a thread name while DTrace is * watching us, making sure we don't break. */ #include #include #include #include #define NR_THREADS (100) #define RUNTIME (30) /* seconds */ static void random_ascii(char *buf, size_t bufsize) { char table[] = "abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ,.-#'?!"; size_t len = rand() % bufsize; bzero(buf, bufsize); for (size_t i = 0; i < len; i++) { buf[i] = table[rand() % (sizeof (table) - 1)]; } } static void busy() { struct timeval tv1; struct timeval tv2; if (gettimeofday(&tv1, NULL) != 0) abort(); for (;;) { static volatile int i; for (i = 0; i < 2000000; i++) ; if (gettimeofday(&tv2, NULL) != 0) abort(); /* janky, but we don't care */ if (tv2.tv_sec != tv1.tv_sec) return; } } static void * thread(void *arg) { char name[PTHREAD_MAX_NAMELEN_NP]; for (size_t i = 0; ; i++) { random_ascii(name, sizeof (name)); if ((i % 100) == 0) { if (pthread_setname_np(pthread_self(), NULL) != 0) abort(); } else { (void) pthread_setname_np(pthread_self(), name); } busy(); } return (NULL); } int main(int argc, char **argv) { pthread_t tids[NR_THREADS]; for (size_t i = 0; i < NR_THREADS; i++) { if (pthread_create(&tids[i], NULL, thread, NULL) != 0) exit(EXIT_FAILURE); } sleep(RUNTIME); exit(EXIT_SUCCESS); }