• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef FILLP_TIMEING_WHEEL_H
17 #define FILLP_TIMEING_WHEEL_H
18 
19 #include "hlist.h"
20 
21 #ifdef __cplusplus
22 extern "C" {
23 #endif
24 
25 #define FILLP_SECOND_IN_US 1000000
26 #define FILLP_MICROSECOND_IN_NS 1000
27 
28 #define FILLP_TIMING_WHEEL_SEC_FLAG 0x01
29 #define FILLP_TIMING_WHEEL_MIN_FLAG 0x02
30 #define FILLP_TIMING_WHEEL_HOUR_FLAG 0x04
31 
32 #define FILLP_TIMING_WHEEL_SET_SEC(status) ((status) |= FILLP_TIMING_WHEEL_SEC_FLAG)
33 #define FILLP_TIMING_WHEEL_SET_MIN(status) ((status) |= FILLP_TIMING_WHEEL_MIN_FLAG)
34 #define FILLP_TIMING_WHEEL_SET_HOUR(status) ((status) |= FILLP_TIMING_WHEEL_HOUR_FLAG)
35 
36 #define FILLP_TIMING_WHEEL_CLEAR_SEC(status) ((status) = (status) & (FILLP_UINT32)(~FILLP_TIMING_WHEEL_SEC_FLAG))
37 #define FILLP_TIMING_WHEEL_CLEAR_MIN(status) ((status) = (status) & (FILLP_UINT32)(~FILLP_TIMING_WHEEL_MIN_FLAG))
38 #define FILLP_TIMING_WHEEL_CLEAR_HOUR(status) ((status) = (status) & (FILLP_UINT32)(~FILLP_TIMING_WHEEL_HOUR_FLAG))
39 
40 #define FILLP_TIMING_WHEEL_IS_SEC_CLEAR(status) (!((status)&FILLP_TIMING_WHEEL_SEC_FLAG))
41 #define FILLP_TIMING_WHEEL_IS_MIN_CLEAR(status) (!((status)&FILLP_TIMING_WHEEL_MIN_FLAG))
42 #define FILLP_TIMING_WHEEL_IS_HOUR_CLEAR(status) (!((status)&FILLP_TIMING_WHEEL_HOUR_FLAG))
43 
44 #define FILLP_TIMING_WHEEL_IS_CLEAR(status) ((status) == 0)
45 
46 struct FillpTimingWheelHand {
47     struct Hlist slotList[FILLP_TIMING_WHEEL_SLOT_NUM];
48     FILLP_LLONG curSlotTime;
49 
50     FILLP_INT accuracy;
51     FILLP_INT handLength;
52     FILLP_INT curTick;
53 };
54 
55 struct FillpTimingWheel {
56     struct FillpTimingWheelHand secHand;
57     struct FillpTimingWheelHand minHand;
58     struct FillpTimingWheelHand hourHand;
59 
60     FILLP_LLONG curTime;
61     /* secHand->cur_tick + minHand->cur_tick * SLOT_NUM + hourHand->cur_tick * SLOT_NUM * SLOT_NUM */
62     FILLP_LLONG tickTime;
63     FILLP_LLONG accuracy;
64     /* Current loop, the cb may calls */
65     struct Hlist curCbList;
66     /* for hour check , then recycle */
67     struct Hlist hourCycleList;
68     /* Is in callback function context */
69     FILLP_UINT8 inCbContext;
70     FILLP_LLONG nextMinimalExpireTime;
71 };
72 
73 typedef void (*FillpTimingWheelCb)(void *arg);
74 struct FillpTimingWheelCbNode {
75     void *arg;
76     FillpTimingWheelCb cb;
77 };
78 
79 struct FillpTimingWheelTimerNode {
80     struct HlistNode secNode;
81     struct HlistNode minNode;
82     struct HlistNode hourNode;
83     struct HlistNode cycleNode;
84     struct HlistNode cbListNode;
85     struct FillpTimingWheel *wheel;
86 
87     FILLP_LLONG expireTime;
88     struct FillpTimingWheelCbNode cbNode;
89     FILLP_UINT32 interval; /* If cyclical */
90     FILLP_UINT32 status;
91 };
92 
93 #define FILLP_TIMING_WHEEL_INIT_NODE(node) \
94     do {                                   \
95         (node)->wheel = FILLP_NULL_PTR;    \
96         (node)->status = 0;                \
97     } while (0)
98 
99 #define FILLP_TIMING_WHEEL_IS_NODE_ENABLED(timerNode) \
100     ((timerNode)->wheel &&                            \
101         (!FILLP_TIMING_WHEEL_IS_CLEAR((timerNode)->status) || HLISTNODE_LINKED(&(timerNode)->cbListNode)))
102 
103 
FillpTimingWheelHourNodeEntry(struct HlistNode * hourNode)104 static __inline struct FillpTimingWheelTimerNode *FillpTimingWheelHourNodeEntry(struct HlistNode *hourNode)
105 {
106     return (struct FillpTimingWheelTimerNode *)((char *)(hourNode) -
107         (uintptr_t)(&(((struct FillpTimingWheelTimerNode *)0)->hourNode)));
108 }
109 
FillpTimingWheelMinNodeEntry(struct HlistNode * minNode)110 static __inline struct FillpTimingWheelTimerNode *FillpTimingWheelMinNodeEntry(struct HlistNode *minNode)
111 {
112     return (struct FillpTimingWheelTimerNode *)((char *)(minNode) -
113         (uintptr_t)(&(((struct FillpTimingWheelTimerNode *)0)->minNode)));
114 }
115 
FillpTimingWheelSecNodeEntry(struct HlistNode * secNode)116 static __inline struct FillpTimingWheelTimerNode *FillpTimingWheelSecNodeEntry(struct HlistNode *secNode)
117 {
118     return (struct FillpTimingWheelTimerNode *)((char *)(secNode) -
119         (uintptr_t)(&(((struct FillpTimingWheelTimerNode *)0)->secNode)));
120 }
121 
FillpTimingWheelCycleNodeEntry(struct HlistNode * cycleNode)122 static __inline struct FillpTimingWheelTimerNode *FillpTimingWheelCycleNodeEntry(struct HlistNode *cycleNode)
123 {
124     return (struct FillpTimingWheelTimerNode *)((char *)(cycleNode) -
125         (uintptr_t)(&(((struct FillpTimingWheelTimerNode *)0)->cycleNode)));
126 }
127 
FillpTimingWheelCblistNodeEntry(struct HlistNode * cbNode)128 static __inline struct FillpTimingWheelTimerNode *FillpTimingWheelCblistNodeEntry(struct HlistNode *cbNode)
129 {
130     return (struct FillpTimingWheelTimerNode *)((char *)(cbNode) -
131         (uintptr_t)(&(((struct FillpTimingWheelTimerNode *)0)->cbListNode)));
132 }
133 
134 void FillpTimingWheelInit(struct FillpTimingWheel *ftWheel, FILLP_LLONG accuracy);
135 
136 void FillpTimingWheelAddTimer(struct FillpTimingWheel *ftWheel, FILLP_LLONG expireTime,
137     struct FillpTimingWheelTimerNode *timerNode);
138 
139 void FillpTimingWheelLoopCheck(struct FillpTimingWheel *ftWheel, FILLP_LLONG curTime);
140 
141 void FillpTimingWheelDelTimer(struct FillpTimingWheel *ftWheel, struct FillpTimingWheelTimerNode *timerNode);
142 
143 #ifdef __cplusplus
144 }
145 #endif
146 
147 #endif /* FILLP_TIMEING_WHEEL_H */