1*ab618543SJohn Levon /* 2*ab618543SJohn Levon * This file and its contents are supplied under the terms of the 3*ab618543SJohn Levon * Common Development and Distribution License ("CDDL"), version 1.0. 4*ab618543SJohn Levon * You may only use this file in accordance with the terms of version 5*ab618543SJohn Levon * 1.0 of the CDDL. 6*ab618543SJohn Levon * 7*ab618543SJohn Levon * A full copy of the text of the CDDL should have accompanied this 8*ab618543SJohn Levon * source. A copy of the CDDL is also available via the Internet at 9*ab618543SJohn Levon * http://www.illumos.org/license/CDDL. 10*ab618543SJohn Levon */ 11*ab618543SJohn Levon 12*ab618543SJohn Levon /* 13*ab618543SJohn Levon * Copyright 2018 Joyent, Inc. 14*ab618543SJohn Levon */ 15*ab618543SJohn Levon 16*ab618543SJohn Levon /* 17*ab618543SJohn Levon * All we're doing is constantly modifying a thread name while DTrace is 18*ab618543SJohn Levon * watching us, making sure we don't break. 19*ab618543SJohn Levon */ 20*ab618543SJohn Levon 21*ab618543SJohn Levon #include <sys/fcntl.h> 22*ab618543SJohn Levon #include <pthread.h> 23*ab618543SJohn Levon #include <stdlib.h> 24*ab618543SJohn Levon #include <stdio.h> 25*ab618543SJohn Levon 26*ab618543SJohn Levon #define NR_THREADS (100) 27*ab618543SJohn Levon #define RUNTIME (30) /* seconds */ 28*ab618543SJohn Levon 29*ab618543SJohn Levon static void 30*ab618543SJohn Levon random_ascii(char *buf, size_t bufsize) 31*ab618543SJohn Levon { 32*ab618543SJohn Levon char table[] = "abcdefghijklmnopqrstuvwxyz" 33*ab618543SJohn Levon "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ,.-#'?!"; 34*ab618543SJohn Levon size_t len = rand() % bufsize; 35*ab618543SJohn Levon 36*ab618543SJohn Levon bzero(buf, bufsize); 37*ab618543SJohn Levon 38*ab618543SJohn Levon for (size_t i = 0; i < len; i++) { 39*ab618543SJohn Levon buf[i] = table[rand() % (sizeof (table) - 1)]; 40*ab618543SJohn Levon } 41*ab618543SJohn Levon } 42*ab618543SJohn Levon 43*ab618543SJohn Levon static void 44*ab618543SJohn Levon busy() 45*ab618543SJohn Levon { 46*ab618543SJohn Levon struct timeval tv1; 47*ab618543SJohn Levon struct timeval tv2; 48*ab618543SJohn Levon 49*ab618543SJohn Levon if (gettimeofday(&tv1, NULL) != 0) 50*ab618543SJohn Levon abort(); 51*ab618543SJohn Levon 52*ab618543SJohn Levon for (;;) { 53*ab618543SJohn Levon static volatile int i; 54*ab618543SJohn Levon for (i = 0; i < 2000000; i++) 55*ab618543SJohn Levon ; 56*ab618543SJohn Levon 57*ab618543SJohn Levon if (gettimeofday(&tv2, NULL) != 0) 58*ab618543SJohn Levon abort(); 59*ab618543SJohn Levon 60*ab618543SJohn Levon /* janky, but we don't care */ 61*ab618543SJohn Levon if (tv2.tv_sec != tv1.tv_sec) 62*ab618543SJohn Levon return; 63*ab618543SJohn Levon } 64*ab618543SJohn Levon } 65*ab618543SJohn Levon 66*ab618543SJohn Levon static void * 67*ab618543SJohn Levon thread(void *arg) 68*ab618543SJohn Levon { 69*ab618543SJohn Levon char name[PTHREAD_MAX_NAMELEN_NP]; 70*ab618543SJohn Levon 71*ab618543SJohn Levon for (size_t i = 0; ; i++) { 72*ab618543SJohn Levon random_ascii(name, sizeof (name)); 73*ab618543SJohn Levon 74*ab618543SJohn Levon if ((i % 100) == 0) { 75*ab618543SJohn Levon if (pthread_setname_np(pthread_self(), NULL) != 0) 76*ab618543SJohn Levon abort(); 77*ab618543SJohn Levon } else { 78*ab618543SJohn Levon (void) pthread_setname_np(pthread_self(), name); 79*ab618543SJohn Levon } 80*ab618543SJohn Levon 81*ab618543SJohn Levon busy(); 82*ab618543SJohn Levon } 83*ab618543SJohn Levon 84*ab618543SJohn Levon return (NULL); 85*ab618543SJohn Levon } 86*ab618543SJohn Levon 87*ab618543SJohn Levon int 88*ab618543SJohn Levon main(int argc, char **argv) 89*ab618543SJohn Levon { 90*ab618543SJohn Levon pthread_t tids[NR_THREADS]; 91*ab618543SJohn Levon 92*ab618543SJohn Levon for (size_t i = 0; i < NR_THREADS; i++) { 93*ab618543SJohn Levon if (pthread_create(&tids[i], NULL, thread, NULL) != 0) 94*ab618543SJohn Levon exit(EXIT_FAILURE); 95*ab618543SJohn Levon } 96*ab618543SJohn Levon 97*ab618543SJohn Levon sleep(RUNTIME); 98*ab618543SJohn Levon exit(EXIT_SUCCESS); 99*ab618543SJohn Levon } 100