46
|
1 #include <stdio.h>
|
|
2 #include <stdlib.h>
|
|
3 #include "HTaskInfo.h"
|
|
4
|
|
5 HTaskInfo::HTaskInfo(void)
|
|
6 :htaskPool(NULL), freeHTask(NULL) {}
|
|
7
|
|
8 HTaskInfo::~HTaskInfo(void) { destroy(); }
|
|
9
|
|
10 int
|
|
11 HTaskInfo::init(int num)
|
|
12 {
|
|
13 if (htaskPool == NULL) {
|
|
14 return extend_pool(num);
|
|
15 }
|
|
16 return 0;
|
|
17 }
|
|
18
|
|
19 /**
|
|
20 * Fix me
|
|
21 * extend できる限界を設定するべき?
|
|
22 */
|
|
23 int
|
|
24 HTaskInfo::extend_pool(int num)
|
|
25 {
|
|
26 HTaskPtr q = NULL;
|
|
27
|
|
28 q = (HTaskPtr)malloc(sizeof(HTask)*(num+1));
|
|
29
|
|
30 if (q == NULL) {
|
|
31 return -1;
|
|
32 }
|
|
33 q->next = htaskPool;
|
|
34 htaskPool = q;
|
|
35
|
|
36 /* Connect all free queue in the pool */
|
|
37 for (q = htaskPool + 1; --num > 0; q++) {
|
|
38 q->next = q + 1;
|
|
39 }
|
|
40 q->next = freeHTask;
|
|
41 freeHTask = htaskPool + 1;
|
|
42
|
|
43 return 0;
|
|
44 }
|
|
45
|
|
46 HTaskPtr
|
54
|
47 HTaskInfo::create(int cmd, int size, DmaBuffer *in_addr, DmaBuffer *out_addr)
|
46
|
48 {
|
|
49 HTaskPtr q;
|
|
50
|
|
51 if (freeHTask == NULL) {
|
|
52 extend_pool(100);
|
|
53 }
|
|
54
|
|
55 q = freeHTask;
|
|
56 freeHTask = freeHTask->next;
|
|
57
|
|
58 q->command = cmd;
|
|
59 q->in_addr = in_addr;
|
|
60 q->out_addr = out_addr;
|
|
61 q->in_size = size;
|
|
62 q->wait_me = NULL;
|
|
63 q->wait_i = NULL;
|
|
64 q->post_func = NULL;
|
|
65
|
|
66 return q;
|
|
67 }
|
|
68
|
|
69 void
|
|
70 HTaskInfo::free(HTaskPtr q)
|
|
71 {
|
|
72 q->next = freeHTask;
|
|
73 freeHTask = q;
|
|
74 }
|
|
75
|
|
76 void
|
|
77 HTaskInfo::destroy(void)
|
|
78 {
|
|
79 HTaskPtr q;
|
|
80
|
|
81 for (q = htaskPool; q; q = q->next) {
|
|
82 free(q);
|
|
83 }
|
|
84 freeHTask = htaskPool = NULL;
|
|
85 }
|