Blender V5.0
BLI_timer.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2018 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
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
32static TimerContainer GlobalTimer = {{nullptr}};
33
34void BLI_timer_register(uintptr_t uuid,
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<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 = nullptr;
58 }
59}
60
61bool BLI_timer_unregister(uintptr_t uuid)
62{
63 LISTBASE_FOREACH (TimedFunction *, timed_func, &GlobalTimer.funcs) {
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
73bool BLI_timer_is_registered(uintptr_t uuid)
74{
75 LISTBASE_FOREACH (TimedFunction *, timed_func, &GlobalTimer.funcs) {
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
87 LISTBASE_FOREACH (TimedFunction *, timed_func, &GlobalTimer.funcs) {
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
107{
108 for (TimedFunction *timed_func = static_cast<TimedFunction *>(GlobalTimer.funcs.first);
109 timed_func;)
110 {
111 TimedFunction *next = timed_func->next;
112 if (timed_func->tag_removal) {
113 clear_user_data(timed_func);
114 BLI_freelinkN(&GlobalTimer.funcs, timed_func);
115 }
116 timed_func = next;
117 }
118}
119
125
127{
128 LISTBASE_FOREACH (TimedFunction *, timed_func, &GlobalTimer.funcs) {
129 timed_func->tag_removal = true;
130 }
131
133}
134
136{
137 LISTBASE_FOREACH (TimedFunction *, timed_func, &GlobalTimer.funcs) {
138 if (!timed_func->persistent) {
139 timed_func->tag_removal = true;
140 }
141 }
142}
143
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:270
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:111
Platform independent time functions.
#define GET_TIME()
Definition BLI_timer.cc:15
static TimerContainer GlobalTimer
Definition BLI_timer.cc:32
static void clear_user_data(TimedFunction *timed_func)
Definition BLI_timer.cc:53
static void remove_tagged_functions()
Definition BLI_timer.cc:106
static void execute_functions_if_necessary()
Definition BLI_timer.cc:83
static void remove_non_persistent_functions()
Definition BLI_timer.cc:135
bool BLI_timer_is_registered(uintptr_t uuid)
Definition BLI_timer.cc: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.cc:34
void BLI_timer_on_file_load()
Definition BLI_timer.cc:144
bool BLI_timer_unregister(uintptr_t uuid)
Definition BLI_timer.cc:61
void BLI_timer_execute()
Definition BLI_timer.cc:120
void BLI_timer_free()
Definition BLI_timer.cc:126
void(* BLI_timer_data_free)(uintptr_t uuid, void *user_data)
Definition BLI_timer.h:19
double(* BLI_timer_func)(uintptr_t uuid, void *user_data)
Definition BLI_timer.h:18
Read Guarded memory(de)allocation.
void * MEM_callocN(size_t len, const char *str)
Definition mallocn.cc:118
static ulong * next
return ret
TimedFunction * next
Definition BLI_timer.cc:18
TimedFunction * prev
Definition BLI_timer.cc:18
BLI_timer_data_free user_data_free
Definition BLI_timer.cc:20
double next_time
Definition BLI_timer.cc:22
void * user_data
Definition BLI_timer.cc:21
uintptr_t uuid
Definition BLI_timer.cc:23
BLI_timer_func func
Definition BLI_timer.cc:19
ListBase funcs
Definition BLI_timer.cc:29