summaryrefslogtreecommitdiff
path: root/regress/lib/libpthread/name/name.c
blob: 3a102047e56c92fd6870247eed773710b809b1a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/*	$NetBSD: name.c,v 1.2 2003/02/27 15:18:41 hannken Exp $	*/

#include <assert.h>
#include <err.h>
#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

void *threadfunc(void *arg);

#define	NAME_TOO_LONG	"12345678901234567890123456789012"	/* 32 chars */
#define	NAME_JUST_RIGHT	"1234567890123456789012345678901"	/* 31 chars */

#define	CONST_NAME	"xyzzy"
char non_const_name[] = CONST_NAME;

int
main(int argc, char *argv[])
{
	pthread_t thr, self = pthread_self();
	pthread_attr_t attr;
	char retname[32];
	int ret;

	pthread_attr_init(&attr);
	assert(0 == pthread_attr_getname_np(&attr, retname, sizeof(retname),
	    NULL));
	assert(retname[0] == '\0');
	assert(EINVAL == pthread_attr_setname_np(&attr, NAME_TOO_LONG, NULL));
	assert(0 == pthread_attr_setname_np(&attr, "%s", NAME_JUST_RIGHT));

	strcpy(retname, "foo");
	assert(0 == pthread_getname_np(self, retname, sizeof(retname)));
	assert(retname[0] == '\0');

	ret = pthread_create(&thr, &attr, threadfunc, NULL);
	if (ret != 0)
		err(1, "pthread_create");

	ret = pthread_join(thr, NULL);
	if (ret != 0)
		err(1, "pthread_join");

	assert(ESRCH == pthread_getname_np(thr, retname, sizeof(retname)));

	return 0;
}

void *
threadfunc(void *arg)
{
	pthread_t self = pthread_self();
	char retname[32];

	assert(0 == pthread_getname_np(self, retname, sizeof(retname)));
	assert(0 == strcmp(retname, NAME_JUST_RIGHT));

	assert(0 == pthread_setname_np(self, non_const_name, NULL));
	memset(non_const_name, 0, sizeof(non_const_name));
	assert(0 == pthread_getname_np(self, retname, sizeof(retname)));
	assert(0 == strcmp(retname, CONST_NAME));

	return NULL;
}