1 #ifndef __TTUNER_H__
2 #define __TTUNER_H__
3 
4 #include <windows.h>
5 #include <stddef.h>	// offsetof
6 
7 struct list_node {
8 	struct list_node*	prev;
9 	struct list_node*	next;
10 };
11 
list_init(struct list_node * node)12 static __inline void list_init(struct list_node* node)
13 {
14 	node->next = node;
15 	node->prev = node;
16 }
17 
list_empty(const struct list_node * node)18 static __inline int list_empty(const struct list_node* node)
19 {
20 	return node->next == node;
21 }
22 
list_erase(struct list_node * node)23 static __inline void list_erase(struct list_node* node)
24 {
25 	node->prev->next = node->next;
26 	node->next->prev = node->prev;
27 	list_init(node);
28 }
29 
list_insert_after(struct list_node * node,struct list_node * node2)30 static __inline void list_insert_after(struct list_node* node, struct list_node* node2)
31 {
32 	node->next = node2->next;
33 	node->prev = node2;
34 	node2->next->prev = node;
35 	node2->next = node;
36 }
37 
list_insert_before(struct list_node * node,struct list_node * node2)38 static __inline void list_insert_before(struct list_node* node, struct list_node* node2)
39 {
40 	node->next = node2;
41 	node->prev = node2->prev;
42 	node2->prev->next = node;
43 	node2->prev = node;
44 }
45 
46 #define list_for_each(item, head, type, member)					\
47 	for (item = list_item((head)->next, type, member);			\
48 			&(item->member) != head;				\
49 			item = list_item(item->member.next, type, member))
50 
51 #define list_for_each_backward(item, head, type, member)			\
52 	for (item = list_item((head)->prev, type, member);			\
53 			&(item->member) != head;				\
54 			item = list_item(item->member.prev, type, member))
55 
56 #define list_item(node, type, member)						\
57 	((type*)((const unsigned char*)(node) - offsetof(type, member)))
58 
59 
60 /* exception to let debugger know the name of the thread. */
61 #define MSVC_EXCEPTION		0x406d1388
62 
63 typedef struct tagTHREADNAME_INFO {
64 	DWORD	dwType;		// Must be 0x1000.
65 	LPCSTR	szName;		// Pointer to name (in user addr space).
66 	DWORD	dwThreadID;	// Thread ID (-1=caller thread).
67 	DWORD	dwFlags;	// Reserved for future use, must be zero.
68 } THREADNAME_INFO;
69 
70 
71 struct thread_info {
72 	struct list_node	link;
73 	BOOL			worker;
74 	DWORD			id;
75 	HANDLE			h;
76 	DWORD			affinity;
77 };
78 
79 #endif
80