xref: /illumos-gate/usr/src/cmd/dtrace/test/tst/common/threadname/tst.threadname.c (revision ab618543cc6fc4bc273c077ef5d247961cdb29d4)
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