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
random_ascii(char * buf,size_t bufsize)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
busy()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 *
thread(void * arg)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
main(int argc,char ** argv)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