Blender V4.3
BLI_timer.c
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2018 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "BLI_timer.h"
10#include "BLI_listbase.h"
11#include "BLI_time.h"
12
13#include "MEM_guardedalloc.h"
14
15#define GET_TIME() BLI_time_now_seconds()
16
27
31
33
35 BLI_timer_func func,
36 void *user_data,
37 BLI_timer_data_free user_data_free,
38 double first_interval,
39 bool persistent)
40{
41 TimedFunction *timed_func = MEM_callocN(sizeof(TimedFunction), __func__);
42 timed_func->func = func;
43 timed_func->user_data_free = user_data_free;
44 timed_func->user_data = user_data;
45 timed_func->next_time = GET_TIME() + first_interval;
46 timed_func->tag_removal = false;
47 timed_func->persistent = persistent;
48 timed_func->uuid = uuid;
49
50 BLI_addtail(&GlobalTimer.funcs, timed_func);
51}
52
53static void clear_user_data(TimedFunction *timed_func)
54{
55 if (timed_func->user_data_free) {
56 timed_func->user_data_free(timed_func->uuid, timed_func->user_data);
57 timed_func->user_data_free = NULL;
58 }
59}
60
62{
64 if (timed_func->uuid == uuid && !timed_func->tag_removal) {
65 timed_func->tag_removal = true;
66 clear_user_data(timed_func);
67 return true;
68 }
69 }
70 return false;
71}
72
74{
76 if (timed_func->uuid == uuid && !timed_func->tag_removal) {
77 return true;
78 }
79 }
80 return false;
81}
82
84{
85 double current_time = GET_TIME();
86
88 if (timed_func->tag_removal) {
89 continue;
90 }
91 if (timed_func->next_time > current_time) {
92 continue;
93 }
94
95 double ret = timed_func->func(timed_func->uuid, timed_func->user_data);
96
97 if (ret < 0) {
98 timed_func->tag_removal = true;
99 }
100 else {
101 timed_func->next_time = current_time + ret;
102 }
103 }
104}
105
106static void remove_tagged_functions(void)
107{
108 for (TimedFunction *timed_func = GlobalTimer.funcs.first; timed_func;) {
109 TimedFunction *next = timed_func->next;
110 if (timed_func->tag_removal) {
111 clear_user_data(timed_func);
112 BLI_freelinkN(&GlobalTimer.funcs, timed_func);
113 }
114 timed_func = next;
115 }
116}
117
123
125{
127 timed_func->tag_removal = true;
128 }
129
131}
132
134{
136 if (!timed_func->persistent) {
137 timed_func->tag_removal = true;
138 }
139 }
140}
141
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:269
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:110
Platform independent time functions.
#define GET_TIME()
Definition BLI_timer.c:15
static TimerContainer GlobalTimer
Definition BLI_timer.c:32
static void clear_user_data(TimedFunction *timed_func)
Definition BLI_timer.c:53
bool BLI_timer_is_registered(uintptr_t uuid)
Definition BLI_timer.c:73
void BLI_timer_register(uintptr_t uuid, BLI_timer_func func, void *user_data, BLI_timer_data_free user_data_free, double first_interval, bool persistent)
Definition BLI_timer.c:34
static void remove_tagged_functions(void)
Definition BLI_timer.c:106
static void execute_functions_if_necessary(void)
Definition BLI_timer.c:83
struct TimerContainer TimerContainer
struct TimedFunction TimedFunction
bool BLI_timer_unregister(uintptr_t uuid)
Definition BLI_timer.c:61
void BLI_timer_free(void)
Definition BLI_timer.c:124
static void remove_non_persistent_functions(void)
Definition BLI_timer.c:133
void BLI_timer_on_file_load(void)
Definition BLI_timer.c:142
void BLI_timer_execute(void)
Definition BLI_timer.c:118
void(* BLI_timer_data_free)(uintptr_t uuid, void *user_data)
Definition BLI_timer.h:23
double(* BLI_timer_func)(uintptr_t uuid, void *user_data)
Definition BLI_timer.h:22
Read Guarded memory(de)allocation.
#define NULL
void *(* MEM_callocN)(size_t len, const char *str)
Definition mallocn.cc:42
static ulong * next
return ret
_W64 unsigned int uintptr_t
Definition stdint.h:119
void * first
BLI_timer_data_free user_data_free
Definition BLI_timer.c:20
bool tag_removal
Definition BLI_timer.c:24
double next_time
Definition BLI_timer.c:22
void * user_data
Definition BLI_timer.c:21
uintptr_t uuid
Definition BLI_timer.c:23
bool persistent
Definition BLI_timer.c:25
struct TimedFunction * prev
Definition BLI_timer.c:18
struct TimedFunction * next
Definition BLI_timer.c:18
BLI_timer_func func
Definition BLI_timer.c:19
ListBase funcs
Definition BLI_timer.c:29