1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /********************************************************************20**
21 Name: common functions - 5
25 Desc: C source code for common timer routines;
29 *********************************************************************21*/
32 /* header include files -- defines (.h) */
34 #include "envopt.h" /* environment options */
35 #include "envdep.h" /* environment dependent */
36 #include "envind.h" /* environment independent */
38 #include "gen.h" /* general */
39 #include "ssi.h" /* system services */
40 #include "cm5.h" /* common functions */
42 /* header/extern include files (.x) */
44 #include "gen.x" /* general */
45 #include "ssi.x" /* system services */
46 #include "cm5.x" /* common functions */
51 #define CM_RMV_TQCP(tqEnt, tgt) \
53 ((tgt)->prev) ? ((tgt)->prev->next = (tgt)->next): \
54 ((tqEnt)->first = (tgt)->next); \
55 ((tgt)->next) ? ((tgt)->next->prev = (tgt)->prev): \
56 ((tqEnt)->tail = (tgt)->prev); \
57 (tgt)->prev = NULLP; \
58 (tgt)->next = NULLP; \
59 (tgt)->ent2bUpd = FALSE; \
62 #define CM_PLC_TQCP(tqEnt, tgt) \
66 (tqEnt)->tail->next = tgt; \
67 (tgt)->prev = (tqEnt)->tail; \
68 (tqEnt)->tail = tgt; \
72 (tqEnt)->first = (tqEnt)->tail = tgt; \
78 /* forward references */
80 /* functions in other modules */
87 * Desc: Handle a timer entry
101 CmTqCp *tqCp, /* timing que control point */
102 CmTqType *tq, /* timing queue */
103 PFV func /* function */
106 PUBLIC Void cmPrcTmr(tqCp, tq, func)
107 CmTqCp *tqCp; /* connection control block */
108 CmTqType *tq; /* message buffer */
109 PFV func; /* function */
125 Txt prntBuf[PRNTSZE];
128 /* Here the year was being printed as 2 letter value and hence did
129 * not represent accurate information. It has been modified as
130 * recommended to include the offset of year 1900 used in all Trillium
131 * SSI implementations. Patch cmbdy5c_001.113
133 sprintf(prntBuf,"%s: date: %02d/%02d/%04d time: %02d:%02d:%02d\n",
134 msArgv[0],dt.month,dt.day,(int)(dt.year + 1900), dt.hour,
141 expire = tqCp->nxtEnt;
142 /* cm_bdy5_c_002.113 - Modification for SRegCfgTmr support */
143 entry = (U32) (expire % (U32)(tqCp->tmrLen));
145 tmp2 = &tq[entry].first;
146 while ((tmp1 = *tmp2) != NULLP)
148 if (tmp1->tqExpire == expire)
150 event = tmp1->tmrEvnt;
152 /* remove and reset this timer control block */
153 (*tmp2) = tmp1->next;
154 tmp1->tmrEvnt = TMR_NONE;
164 } /* end of cmPrcTmr */
166 #else /* not defined SS_FAP */
171 CmTqCp *tqCp, /* timing que control point */
172 CmTqType *tq, /* timing queue */
173 PFV func /* function */
176 PUBLIC Void cmPrcTmr(tqCp, tq, func)
177 CmTqCp *tqCp; /* connection control block */
178 CmTqType *tq; /* message buffer */
179 PFV func; /* function */
186 CmTqType *tqEnt, *tqEnt1;
189 VOLATILE U32 startTime = 0;
194 SStartTask(&startTime, PID_CM_PRC_TMR);
199 Txt prntBuf[PRNTSZE];
202 /* Here the year was being printed as 2 letter value and hence did
203 * not represent accurate information. It has been modified as
204 * recommended to include the offset of year 1900 used in all Trillium
205 * SSI implementations.
207 sprintf(prntBuf,"%s: date: %02d/%02d/%04d time: %02d:%02d:%02d\n",
208 msArgv[0],dt.month,dt.day,(int)(dt.year + 1900), dt.hour,
215 expire = tqCp->nxtEnt;
217 entry = (U32) (expire % (U32)(tqCp->tmrLen));
219 tqCp->tmp = (tqEnt = &tq[entry])->first;
220 while ((tmp1 = tqCp->tmp) != NULLP)
222 tqCp->tmp = tmp1->next;
223 /* SRIKY - Temp Fix to overcome timer not firing. Need to take */
224 /* care of wrap around case */
225 if ((tmp1->tqExpire <= expire) || (tmp1->ent2bUpd))
227 event = tmp1->tmrEvnt;
230 if (!(tmp1->ent2bUpd))
232 CM_RMV_TQCP(tqEnt, tmp1);
233 tmp1->tmrEvnt = TMR_NONE;
241 entry1 = (U32) (tmp1->tqExpire % (U32)(tqCp->tmrLen));
242 tqEnt1 = &tq[entry1];
243 CM_RMV_TQCP(tqEnt, tmp1);
244 tmp1->entIdx = entry1;
245 CM_PLC_TQCP(tqEnt1, tmp1);
251 SStopTask(startTime, PID_CM_PRC_TMR);
253 } /* end of cmPrcTmr */
262 * Desc: initialize timers
266 * Notes: Connection Oriented Control
272 PUBLIC Void cmInitTimers
274 CmTimer *timers, /* timer list */
275 U8 max /* maximum tmrs */
278 PUBLIC Void cmInitTimers(timers, max)
279 CmTimer *timers; /* timer list */
280 U8 max; /* maximum tmrs */
288 for (i = 0, tPtr = timers; i < max; i++, tPtr++)
290 tPtr->tmrEvnt = TMR_NONE;
293 tPtr->next = (struct cmTimer *)NULLP;
294 tPtr->prev = (struct cmTimer *)NULLP;
295 tPtr->ent2bUpd = FALSE;
298 } /* end of cmInitTimers */
304 * Desc: Places Control Block on Timing Queue
315 PUBLIC Void cmPlcCbTq
320 PUBLIC Void cmPlcCbTq(arg)
324 /*added FAP modifications*/
327 /* cm_bdy5_c_001.main_20 - Modification for SRegCfgTmr support */
334 expire = (arg->tqCp->nxtEnt + arg->wait);
335 /* cm_bdy5_c_002.113 - Modification for SRegCfgTmr support */
336 ent = (U32)(expire % (U32)(arg->tqCp->tmrLen));
338 for (tmrNum = 0; tmrNum < arg->max; tmrNum++)
340 if (arg->timers[tmrNum].tmrEvnt == TMR_NONE)
342 arg->timers[tmrNum].tmrEvnt = arg->evnt;
343 arg->timers[tmrNum].tqExpire = expire;
344 arg->timers[tmrNum].cb = arg->cb;
345 arg->timers[tmrNum].next = NULLP;
347 tmp = &(arg->tq[ent].first);
349 tmp = &((*tmp)->next);
350 *tmp = &arg->timers[tmrNum];
364 expire = (arg->tqCp->nxtEnt + arg->wait);
365 ent = (U32)(expire % (U32)(arg->tqCp->tmrLen));
367 for (tmrNum = 0; tmrNum < arg->max; tmrNum++)
369 if (arg->timers[tmrNum].tmrEvnt == TMR_NONE)
371 target = &arg->timers[tmrNum];
374 target->tmrEvnt = arg->evnt;
375 target->tqExpire = expire;
376 target->cb = arg->cb;
377 target->ent2bUpd = FALSE;
378 target->entIdx = ent;
380 /* Place the timer block in the timer list */
381 CM_PLC_TQCP(tq, target);
388 } /* end of cmPlcCbTq */
394 * Desc: Places Control Block on Timing Queue
405 PUBLIC Void cmRstCbTq
410 PUBLIC Void cmRstCbTq(arg)
416 arg->timers[arg->tNum].tqExpire = arg->tqCp->nxtEnt + arg->wait;
417 arg->timers[arg->tNum].ent2bUpd = TRUE;
420 } /* end of cmRstCbTq */
426 * Desc: Removes control block from Timing Queue
437 PUBLIC Void cmRmvCbTq
442 PUBLIC Void cmRmvCbTq(arg)
446 /*Added FAP modifications*/
448 /* cm_bdy5_c_002.113 - Modification for SRegCfgTmr support */
456 target = &arg->timers[arg->tNum];
457 if (target->tmrEvnt != TMR_NONE)
459 /* cm_bdy5_c_002.113 - Modification for SRegCfgTmr support */
460 ent = (U32) (target->tqExpire % (U32)(arg->tqCp->tmrLen));
461 tmp2 = &arg->tq[ent].first;
463 while ((tmp1 = *tmp2) != NULLP)
467 /* find the timer control block to be removed */
468 (*tmp2) = tmp1->next;
469 tmp1->tmrEvnt = TMR_NONE;
476 /* find the next timer control block */
489 target = &arg->timers[arg->tNum];
490 if (target->tmrEvnt != TMR_NONE)
492 ent = (U32) (target->entIdx);
496 * Update the timer pointer in the for correct processing in
499 if (target == arg->tqCp->tmp)
500 arg->tqCp->tmp = target->next;
502 /* Remove the entru from the list */
503 CM_RMV_TQCP( tq , target);
504 target->tmrEvnt = TMR_NONE;
505 target->tqExpire = 0;
511 } /* end of cmRmvCbTq */
513 /**********************************************************************
515 **********************************************************************/