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