]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.1.0/test/src/abstraction_thread_start.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.1.0 / test / src / abstraction_thread_start.c
1 #include "internal.h"
2
3
4
5
6
7 /****************************************************************************/
8 #if (defined _WIN32 && defined _MSC_VER && !defined WIN_KERNEL_BUILD)
9
10   /* TRD : any Windows (user-mode) on any CPU with the Microsoft C compiler
11
12            _WIN32             indicates 64-bit or 32-bit Windows
13            _MSC_VER           indicates Microsoft C compiler
14            !WIN_KERNEL_BUILD  indicates Windows user-mode
15   */
16
17   int abstraction_thread_start( thread_state_t *thread_state, unsigned int cpu, thread_function_t thread_function, void *thread_user_state )
18   {
19     int
20       rv = 0;
21
22     DWORD
23       thread_id;
24
25     DWORD_PTR
26       affinity_mask,
27       result;
28
29     assert( thread_state != NULL );
30     // TRD : cpu can be any value in its range
31     assert( thread_function != NULL );
32     // TRD : thread_user_state can be NULL
33
34     affinity_mask = (DWORD_PTR) (1 << cpu);
35
36     *thread_state = CreateThread( NULL, 0, thread_function, thread_user_state, NO_FLAGS, &thread_id );
37
38     result = SetThreadAffinityMask( *thread_state, affinity_mask );
39
40     if( *thread_state != NULL and result != 0 )
41       rv = 1;
42
43     return( rv );
44   }
45
46 #endif
47
48
49
50
51
52 /****************************************************************************/
53 #if (defined _WIN32 && defined _MSC_VER && defined WIN_KERNEL_BUILD)
54
55   /* TRD : any Windows on any CPU with the Microsoft C compiler
56
57            _WIN32            indicates 64-bit or 32-bit Windows
58            _MSC_VER          indicates Microsoft C compiler
59            WIN_KERNEL_BUILD  indicates Windows kernel
60   */
61
62   int abstraction_thread_start( thread_state_t *thread_state, unsigned int cpu, thread_function_t thread_function, void *thread_user_state )
63   {
64     int
65       rv = 0;
66
67     KAFFINITY
68       affinity_mask
69
70     NTSTATUS
71       nts_create,
72       nts_affinity;
73
74     assert( thread_state != NULL );
75     // TRD : cpu can be any value in its range
76     assert( thread_function != NULL );
77     // TRD : thread_user_state can be NULL
78
79     affinity_mask = 1 << cpu;
80
81     nts_create = PsCreateSystemThread( thread_state, THREAD_ALL_ACCESS, NULL, NULL, NULL, thread_function, thread_user_state );
82
83     nts_affinity = ZwSetInformationThread( thread_state, ThreadAffinityMask, &affinity_mask, sizeof(KAFFINITY) );
84
85     if( nts_create == STATUS_SUCCESS and nts_affinity == STATUS_SUCCESS )
86       rv = 1;
87
88     return( rv );
89   }
90
91 #endif
92
93
94
95
96
97 /****************************************************************************/
98 #if (defined __unix__)
99
100   /* TRD : any UNIX on any CPU with any compiler
101
102            I assumed pthreads is available on any UNIX.
103
104            __unix__   indicates Solaris, Linux, HPUX, etc
105   */
106
107   int abstraction_thread_start( thread_state_t *thread_state, unsigned int cpu, thread_function_t thread_function, void *thread_user_state )
108   {
109     int
110       rv = 0,
111       rv_create;
112
113     pthread_attr_t
114       attr;
115
116     cpu_set_t
117       cpuset;
118
119     assert( thread_state != NULL );
120     // TRD : cpu can be any value in its range
121     assert( thread_function != NULL );
122     // TRD : thread_user_state can be NULL
123
124     pthread_attr_init( &attr );
125
126     CPU_ZERO( &cpuset );
127     CPU_SET( cpu, &cpuset );
128     pthread_attr_setaffinity_np( &attr, sizeof(cpuset), &cpuset );
129
130     rv_create = pthread_create( thread_state, &attr, thread_function, thread_user_state );
131
132     if( rv_create == 0 )
133       rv = 1;
134
135     pthread_attr_destroy( &attr );
136
137     return( rv );
138   }
139
140 #endif
141