-
Notifications
You must be signed in to change notification settings - Fork 0
/
tq_list_nosync.c
111 lines (88 loc) · 2.11 KB
/
tq_list_nosync.c
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#ifndef QDBG
#define QDBG 0
#endif
#define Q_LINKEDlist_nosync 1
struct tq_list_nosync {
tq_t basic;
ptask_t *head, *tail;
/*
* head -> <old>
* v
* ...
* v
* tail -> <new>
*/
};
static tq_t *
tq_list_nosync_create(size_t capa)
{
struct tq_list_nosync *queue = xmalloc(sizeof(struct tq_list_nosync));
memset(queue, 0, sizeof(struct tq_list_nosync));
queue->head = queue->tail = 0;
return &queue->basic;
}
static void
tq_list_nosync_free(tq_t *tq)
{
struct tq_list_nosync *queue = (struct tq_list_nosync *)tq;
xfree(queue);
}
static int
tq_list_nosync_enq(tq_t *tq, ptask_t *task)
{
struct tq_list_nosync *queue = (struct tq_list_nosync *)tq;
if (QDBG) fprintf(stderr, "enq - q: %p, num: %d, task: %p\n", queue, queue->basic.num, task);
task->next = 0;
if (queue->tail == 0) {
queue->head = task;
queue->tail = task;
}
else {
queue->tail->next = task;
queue->tail = task;
}
/* profiling */
#if PTASK_PROFILE
if (queue->basic.max_num < queue->basic.num) {
queue->basic.max_num = queue->basic.num;
}
#endif
// tq_list_nosync_show(queue, task);
return 1;
}
static ptask_t *
tq_list_nosync_deq(tq_t *tq)
{
struct tq_list_nosync *queue = (struct tq_list_nosync *)tq;
if (queue->head) {
ptask_t *task;
task = queue->head;
if (task) {
if (QDBG) fprintf(stderr, "deq - q: %p, num: %d, task: %p\n", queue, queue->basic.num, task);
queue->head = task->next;
if (task->next == 0) {
queue->tail = 0;
}
queue->basic.num--;
return task;
}
}
if (QDBG) fprintf(stderr, "deq - q: %p, num: %d, empty\n", queue, queue->basic.num);
return 0;
}
static ptask_t *
tq_list_nosync_steal(tq_t *tq)
{
struct tq_list_nosync *queue = (struct tq_list_nosync *)tq;
ptask_t *task = 0;
queue = 0;
return task;
}
static void
tq_list_nosync_wait(tq_t *tq)
{
struct tq_list_nosync *queue = (struct tq_list_nosync *)tq;
if (QDBG) fprintf(stderr, "wait - q: %p, num: %d\n", queue, queue->basic.num);
sched_yield();
}
DEFINE_TQ_SET(list_nosync);