1 /*
2  * Copyright (c) 2015-2016 Red Hat, Inc.
3  *
4  * All rights reserved.
5  *
6  * Author: Jan Friesse (jfriesse@redhat.com)
7  *
8  * This software licensed under BSD license, the text of which follows:
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions are met:
12  *
13  * - Redistributions of source code must retain the above copyright notice,
14  *   this list of conditions and the following disclaimer.
15  * - Redistributions in binary form must reproduce the above copyright notice,
16  *   this list of conditions and the following disclaimer in the documentation
17  *   and/or other materials provided with the distribution.
18  * - Neither the name of the Red Hat, Inc. nor the names of its
19  *   contributors may be used to endorse or promote products derived from this
20  *   software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
32  * THE POSSIBILITY OF SUCH DAMAGE.
33  */
34 
35 #ifndef _TIMER_LIST_H_
36 #define _TIMER_LIST_H_
37 
38 #include <sys/queue.h>
39 
40 #include <nspr.h>
41 
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
45 
46 /*
47  * PR Interval is 32-bit integer which overflows. Maximum useable interval is around
48  * 6 hours (less). So define max interval as 5 hours
49  */
50 #define TIMER_LIST_MAX_INTERVAL			18000000
51 
52 typedef int (*timer_list_cb_fn)(void *data1, void *data2);
53 
54 struct timer_list_entry {
55 	/* Time when timer was planned */
56 	PRIntervalTime epoch;
57 	/* Number of miliseconds to expire */
58 	PRUint32 interval;
59 	/* Time when timer expires (epoch + interval) */
60 	PRIntervalTime expire_time;
61 	timer_list_cb_fn func;
62 	void *user_data1;
63 	void *user_data2;
64 	int is_active;
65 	TAILQ_ENTRY(timer_list_entry) entries;
66 };
67 
68 struct timer_list {
69 	TAILQ_HEAD(, timer_list_entry) list;
70 	TAILQ_HEAD(, timer_list_entry) free_list;
71 };
72 
73 extern void				 timer_list_init(struct timer_list *tlist);
74 
75 extern struct timer_list_entry		*timer_list_add(struct timer_list *tlist,
76     PRUint32 interval, timer_list_cb_fn func, void *data1, void *data2);
77 
78 extern void				 timer_list_reschedule(struct timer_list *tlist,
79     struct timer_list_entry *entry);
80 
81 extern void				 timer_list_delete(struct timer_list *tlist,
82     struct timer_list_entry *entry);
83 
84 extern void				 timer_list_expire(struct timer_list *tlist);
85 
86 extern PRIntervalTime			 timer_list_time_to_expire(struct timer_list *tlist);
87 
88 extern uint32_t				 timer_list_time_to_expire_ms(struct timer_list *tlist);
89 
90 extern void				 timer_list_free(struct timer_list *tlist);
91 
92 #ifdef __cplusplus
93 }
94 #endif
95 
96 #endif /* _TIMER_LIST_H_ */
97