xref: /haiku/src/tests/system/libroot/posix/thread_local_test.cpp (revision a44af2ec16c64ea229a66d6ce0123d646110a2cc)
1 /*
2  * Copyright 2021, Jérôme Duval, jerome.duval@gmail.com.
3  * Distributed under the terms of the MIT License.
4  */
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <unistd.h>
8 #include <pthread.h>
9 #include <thread>
10 
11 #define CYCLES 2
12 
13 
14 class MyClass
15 {
16 public:
MyClass()17 	MyClass() { i=0; printf("MyClass() called() %p\n", this); }
~MyClass()18 	~MyClass() { printf("~MyClass() called() %d %p\n", i, this); }
19 
Touch()20 	void Touch() { i++; printf("Touch() called() %d %p\n", i, this); }
21 
22 private:
23 	int j;
24 	int i;
25 };
26 
27 thread_local MyClass myClass1;
28 thread_local MyClass myClass2;
29 
threadFn(void * id_ptr)30 void* threadFn(void* id_ptr)
31 {
32 	int thread_id = *(int*)id_ptr;
33 
34 	for (int i = 0; i < CYCLES; ++i) {
35 		int wait_sec = 1;
36 		sleep(wait_sec);
37 		myClass1.Touch();
38 		myClass2.Touch();
39 	}
40 
41 	return NULL;
42 }
43 
44 
thread_local_test(int count)45 int thread_local_test(int count)
46 {
47 	pthread_t ids[count];
48 	int short_ids[count];
49 
50 	srand(time(NULL));
51 
52 	for (int i = 0; i < count; i++) {
53 		short_ids[i] = i;
54 		pthread_create(&ids[i], NULL, threadFn, &short_ids[i]);
55 	}
56 
57 	for (int i = 0; i < count; i++)
58 		pthread_join(ids[i], NULL);
59 
60 	return 0;
61 }
62 
63 
main()64 int main()
65 {
66 	thread_local_test(1);
67 }
68