Skip to content
Flecs v4.1
os_api.h
Go to the documentation of this file.
1/**
2 * @file os_api.h
3 * @brief Operating system abstraction API.
4 *
5 * This file contains the operating system abstraction API. The flecs core
6 * library avoids OS/runtime-specific API calls as much as possible. Instead, it
7 * provides an interface that can be implemented by applications.
8 *
9 * Examples of how to implement this interface can be found in the
10 * examples/os_api folder.
11 */
12
13#ifndef FLECS_OS_API_H
14#define FLECS_OS_API_H
15
16/**
17 * @defgroup c_os_api OS API
18 * @ingroup c
19 * Interface for providing OS-specific functionality.
20 *
21 * @{
22 */
23
24#if defined(ECS_TARGET_WINDOWS)
25#include <malloc.h>
26#elif defined(ECS_TARGET_FREEBSD)
27#include <stdlib.h>
28#else
29#include <alloca.h>
30#endif
31
32#include <stdio.h>
33
34#ifdef __cplusplus
35extern "C" {
36#endif
37
38/** Time type. */
39typedef struct ecs_time_t {
40 uint32_t sec; /**< Second part. */
41 uint32_t nanosec; /**< Nanosecond part. */
43
44/** Allocation counters. */
45FLECS_API extern int64_t ecs_os_api_malloc_count; /**< malloc count. */
46FLECS_API extern int64_t ecs_os_api_realloc_count; /**< realloc count. */
47FLECS_API extern int64_t ecs_os_api_calloc_count; /**< calloc count. */
48FLECS_API extern int64_t ecs_os_api_free_count; /**< free count. */
49
50/* Enabling this flag will add a header to each allocation that allows the code
51 * to track exactly how much memory has been allocated. Increases memory
52 * utilization by 16 bytes per allocation, and is not thread-safe. */
53// #define FLECS_TRACK_OS_ALLOC
54#ifdef FLECS_TRACK_OS_ALLOC
55FLECS_API extern ecs_size_t ecs_os_allocated_bytes;
56#endif
57
58/** Use handle types that _at least_ can store pointers. */
59typedef uintptr_t ecs_os_thread_t; /**< OS thread. */
60typedef uintptr_t ecs_os_cond_t; /**< OS cond. */
61typedef uintptr_t ecs_os_mutex_t; /**< OS mutex. */
62typedef uintptr_t ecs_os_dl_t; /**< OS dynamic library. */
63typedef uintptr_t ecs_os_sock_t; /**< OS socket. */
64
65/** 64-bit thread ID. */
66typedef uint64_t ecs_os_thread_id_t;
67
68/** Generic function pointer type. */
69typedef void (*ecs_os_proc_t)(void);
70
71/** OS API init. */
72typedef
73void (*ecs_os_api_init_t)(void);
74
75/** OS API deinit. */
76typedef
77void (*ecs_os_api_fini_t)(void);
78
79/** OS API malloc function type. */
80typedef
81void* (*ecs_os_api_malloc_t)(
82 ecs_size_t size);
83
84/** OS API free function type. */
85typedef
87 void *ptr);
88
89/** OS API realloc function type. */
90typedef
91void* (*ecs_os_api_realloc_t)(
92 void *ptr,
93 ecs_size_t size);
94
95/** OS API calloc function type. */
96typedef
97void* (*ecs_os_api_calloc_t)(
98 ecs_size_t size);
99
100/** OS API strdup function type. */
101typedef
102char* (*ecs_os_api_strdup_t)(
103 const char *str);
104
105/** OS API thread_callback function type. */
106typedef
107void* (*ecs_os_thread_callback_t)(
108 void*);
109
110/** OS API thread_new function type. */
111typedef
114 void *param);
115
116/** OS API thread_join function type. */
117typedef
118void* (*ecs_os_api_thread_join_t)(
119 ecs_os_thread_t thread);
120
121/** OS API thread_self function type. */
122typedef
124
125/** OS API task_new function type. */
126typedef
129 void *param);
130
131/** OS API task_join function type. */
132typedef
133void* (*ecs_os_api_task_join_t)(
134 ecs_os_thread_t thread);
135
136/** Atomic increment and decrement. */
137/** OS API ainc function type. */
138typedef
140 int32_t *value);
141
142/** OS API lainc function type. */
143typedef
145 int64_t *value);
146
147/** Mutex. */
148/** OS API mutex_new function type. */
149typedef
151 void);
152
153/** OS API mutex_lock function type. */
154typedef
156 ecs_os_mutex_t mutex);
157
158/** OS API mutex_unlock function type. */
159typedef
161 ecs_os_mutex_t mutex);
162
163/** OS API mutex_free function type. */
164typedef
166 ecs_os_mutex_t mutex);
167
168/** Condition variable. */
169/** OS API cond_new function type. */
170typedef
172 void);
173
174/** OS API cond_free function type. */
175typedef
177 ecs_os_cond_t cond);
178
179/** OS API cond_signal function type. */
180typedef
182 ecs_os_cond_t cond);
183
184/** OS API cond_broadcast function type. */
185typedef
187 ecs_os_cond_t cond);
188
189/** OS API cond_wait function type. */
190typedef
192 ecs_os_cond_t cond,
193 ecs_os_mutex_t mutex);
194
195/** OS API sleep function type. */
196typedef
198 int32_t sec,
199 int32_t nanosec);
200
201/** OS API enable_high_timer_resolution function type. */
202typedef
204 bool enable);
205
206/** OS API get_time function type. */
207typedef
209 ecs_time_t *time_out);
210
211/** OS API now function type. */
212typedef
213uint64_t (*ecs_os_api_now_t)(void);
214
215/** OS API log function type.
216 *
217 * @param level The logging level.
218 * @param file The file where the message was logged.
219 * @param line The line where it was logged.
220 * @param msg The log message.
221 */
222typedef
224 int32_t level,
225 const char *file,
226 int32_t line,
227 const char *msg);
228
229/** OS API abort function type. */
230typedef
232 void);
233
234/** OS API dlopen function type. */
235typedef
237 const char *libname);
238
239/** OS API dlproc function type. */
240typedef
242 ecs_os_dl_t lib,
243 const char *procname);
244
245/** OS API dlclose function type. */
246typedef
248 ecs_os_dl_t lib);
249
250/** OS API module_to_path function type. */
251typedef
252char* (*ecs_os_api_module_to_path_t)(
253 const char *module_id);
254
255/** OS API fopen function type. */
256typedef
257FILE* (*ecs_os_api_fopen_t)(
258 const char *file,
259 const char *mode);
260
261/** OS API fclose function type. */
262typedef
264 FILE *file);
265
266/** OS API fread function type. */
267typedef
269 void *ptr,
270 size_t size,
271 size_t count,
272 FILE *file);
273
274/** OS API performance tracing function type.
275 *
276 * @param filename The source file name.
277 * @param line The source line number.
278 * @param name The name of the trace region.
279 */
281 const char *filename,
282 size_t line,
283 const char *name);
284
285/* Prefix members of the struct with 'ecs_' as some system headers may define
286 * macros for functions like "strdup", "log", or "_free". */
287
288/** OS API interface. */
289typedef struct ecs_os_api_t {
290 /* API init and deinit */
291 ecs_os_api_init_t init_; /**< init callback. */
292 ecs_os_api_fini_t fini_; /**< fini callback. */
293
294 /* Memory management */
295 ecs_os_api_malloc_t malloc_; /**< malloc callback. */
296 ecs_os_api_realloc_t realloc_; /**< realloc callback. */
297 ecs_os_api_calloc_t calloc_; /**< calloc callback. */
298 ecs_os_api_free_t free_; /**< free callback. */
299
300 /* Strings */
301 ecs_os_api_strdup_t strdup_; /**< strdup callback. */
302
303 /* Threads */
304 ecs_os_api_thread_new_t thread_new_; /**< thread_new callback. */
305 ecs_os_api_thread_join_t thread_join_; /**< thread_join callback. */
306 ecs_os_api_thread_self_t thread_self_; /**< thread_self callback. */
307
308 /* Tasks */
309 ecs_os_api_thread_new_t task_new_; /**< task_new callback. */
310 ecs_os_api_thread_join_t task_join_; /**< task_join callback. */
311
312 /* Atomic increment and decrement */
313 ecs_os_api_ainc_t ainc_; /**< ainc callback. */
314 ecs_os_api_ainc_t adec_; /**< adec callback. */
315 ecs_os_api_lainc_t lainc_; /**< lainc callback. */
316 ecs_os_api_lainc_t ladec_; /**< ladec callback. */
317
318 /* Mutex */
319 ecs_os_api_mutex_new_t mutex_new_; /**< mutex_new callback. */
320 ecs_os_api_mutex_free_t mutex_free_; /**< mutex_free callback. */
321 ecs_os_api_mutex_lock_t mutex_lock_; /**< mutex_lock callback. */
322 ecs_os_api_mutex_lock_t mutex_unlock_; /**< mutex_unlock callback. */
323
324 /* Condition variable */
325 ecs_os_api_cond_new_t cond_new_; /**< cond_new callback. */
326 ecs_os_api_cond_free_t cond_free_; /**< cond_free callback. */
327 ecs_os_api_cond_signal_t cond_signal_; /**< cond_signal callback. */
328 ecs_os_api_cond_broadcast_t cond_broadcast_; /**< cond_broadcast callback. */
329 ecs_os_api_cond_wait_t cond_wait_; /**< cond_wait callback. */
330
331 /* Time */
332 ecs_os_api_sleep_t sleep_; /**< sleep callback. */
333 ecs_os_api_now_t now_; /**< now callback. */
334 ecs_os_api_get_time_t get_time_; /**< get_time callback. */
335
336 /* Logging */
337 ecs_os_api_log_t log_; /**< log callback.
338 * The level should be interpreted as:
339 * >0: Debug tracing. Only enabled in debug builds.
340 * 0: Tracing. Enabled in debug and release builds.
341 * -2: Warning. An issue occurred, but the operation was successful.
342 * -3: Error. An issue occurred, and the operation was unsuccessful.
343 * -4: Fatal. An issue occurred, and the application must quit. */
344
345 /* Application termination */
346 ecs_os_api_abort_t abort_; /**< abort callback. */
347
348 /* Dynamic library loading */
349 ecs_os_api_dlopen_t dlopen_; /**< dlopen callback. */
350 ecs_os_api_dlproc_t dlproc_; /**< dlproc callback. */
351 ecs_os_api_dlclose_t dlclose_; /**< dlclose callback. */
352
353 /* Overridable function that translates from a logical module ID to a
354 * shared library filename. */
355 ecs_os_api_module_to_path_t module_to_dl_; /**< module_to_dl callback. */
356
357 /* Overridable function that translates from a logical module ID to a
358 * path that contains module-specific resources or assets. */
359 ecs_os_api_module_to_path_t module_to_etc_; /**< module_to_etc callback. */
360
361 /* File I/O */
362 ecs_os_api_fopen_t fopen_; /**< fopen callback. */
363 ecs_os_api_fclose_t fclose_; /**< fclose callback. */
364 ecs_os_api_fread_t fread_; /**< fread callback. */
365
366 /* Performance tracing */
367 ecs_os_api_perf_trace_t perf_trace_push_; /**< perf_trace_push callback. */
368 ecs_os_api_perf_trace_t perf_trace_pop_; /**< perf_trace_pop callback. */
369
370 int32_t log_level_; /**< Tracing level. */
371 int32_t log_indent_; /**< Tracing indentation level. */
372 int32_t log_last_error_; /**< Last logged error code. */
373 int64_t log_last_timestamp_; /**< Last logged timestamp. */
374
375 ecs_flags32_t flags_; /**< OS API flags. */
376
377 void *log_out_; /**< File used for logging output (type is FILE*)
378 * (hint: log_ decides where to write). */
380
381/** Static OS API variable with configured callbacks. */
382FLECS_API
384
385/** Initialize the OS API.
386 * This operation is not usually called by an application. To override callbacks
387 * of the OS API, use the following pattern:
388 *
389 * @code
390 * ecs_os_set_api_defaults();
391 * ecs_os_api_t os_api = ecs_os_get_api();
392 * os_api.abort_ = my_abort;
393 * ecs_os_set_api(&os_api);
394 * @endcode
395 */
396FLECS_API
397void ecs_os_init(void);
398
399/** Deinitialize the OS API.
400 * This operation is not usually called by an application.
401 */
402FLECS_API
403void ecs_os_fini(void);
404
405/** Override the OS API.
406 * This overrides the OS API struct with new values for callbacks. See
407 * ecs_os_init() for how to use the function.
408 *
409 * @param os_api Pointer to a struct with values to set.
410 */
411FLECS_API
413 ecs_os_api_t *os_api);
414
415/** Get the OS API.
416 *
417 * @return A value with the current OS API callbacks.
418 * @see ecs_os_init()
419 */
420FLECS_API
422
423/** Set default values for the OS API.
424 * This initializes the OS API struct with default values for callbacks like
425 * malloc and free.
426 *
427 * @see ecs_os_init()
428 */
429FLECS_API
431
432/** Macro utilities
433 * \cond
434 */
435
436/* Memory management */
437#ifndef ecs_os_malloc
438#define ecs_os_malloc(size) ecs_os_api.malloc_(size)
439#endif
440#ifndef ecs_os_free
441#define ecs_os_free(ptr) ecs_os_api.free_(ptr)
442#endif
443#ifndef ecs_os_realloc
444#define ecs_os_realloc(ptr, size) ecs_os_api.realloc_(ptr, size)
445#endif
446#ifndef ecs_os_calloc
447#define ecs_os_calloc(size) ecs_os_api.calloc_(size)
448#endif
449#if defined(ECS_TARGET_WINDOWS)
450#define ecs_os_alloca(size) _alloca((size_t)(size))
451#else
452#define ecs_os_alloca(size) alloca((size_t)(size))
453#endif
454
455#define ecs_os_malloc_t(T) ECS_CAST(T*, ecs_os_malloc(ECS_SIZEOF(T)))
456#define ecs_os_malloc_n(T, count) ECS_CAST(T*, ecs_os_malloc(ECS_SIZEOF(T) * (count)))
457#define ecs_os_calloc_t(T) ECS_CAST(T*, ecs_os_calloc(ECS_SIZEOF(T)))
458#define ecs_os_calloc_n(T, count) ECS_CAST(T*, ecs_os_calloc(ECS_SIZEOF(T) * (count)))
459
460#define ecs_os_realloc_t(ptr, T) ECS_CAST(T*, ecs_os_realloc(ptr, ECS_SIZEOF(T)))
461#define ecs_os_realloc_n(ptr, T, count) ECS_CAST(T*, ecs_os_realloc(ptr, ECS_SIZEOF(T) * (count)))
462#define ecs_os_alloca_t(T) ECS_CAST(T*, ecs_os_alloca(ECS_SIZEOF(T)))
463#define ecs_os_alloca_n(T, count) ECS_CAST(T*, ecs_os_alloca(ECS_SIZEOF(T) * (count)))
464
465/* Strings */
466#ifndef ecs_os_strdup
467#define ecs_os_strdup(str) ecs_os_strdup_(str)
468#endif
469
470#ifdef __cplusplus
471#define ecs_os_strlen(str) static_cast<ecs_size_t>(strlen(str))
472#define ecs_os_strncmp(str1, str2, num) strncmp(str1, str2, static_cast<size_t>(num))
473#define ecs_os_memcmp(ptr1, ptr2, num) memcmp(ptr1, ptr2, static_cast<size_t>(num))
474#define ecs_os_memcpy(ptr1, ptr2, num) memcpy(ptr1, ptr2, static_cast<size_t>(num))
475#define ecs_os_memset(ptr, value, num) memset(ptr, value, static_cast<size_t>(num))
476#define ecs_os_memmove(dst, src, size) memmove(dst, src, static_cast<size_t>(size))
477#else
478#define ecs_os_strlen(str) (ecs_size_t)strlen(str)
479#define ecs_os_strncmp(str1, str2, num) strncmp(str1, str2, (size_t)(num))
480#define ecs_os_memcmp(ptr1, ptr2, num) memcmp(ptr1, ptr2, (size_t)(num))
481#define ecs_os_memcpy(ptr1, ptr2, num) memcpy(ptr1, ptr2, (size_t)(num))
482#define ecs_os_memset(ptr, value, num) memset(ptr, value, (size_t)(num))
483#define ecs_os_memmove(dst, src, size) memmove(dst, src, (size_t)(size))
484#endif
485
486#define ecs_os_memcpy_t(ptr1, ptr2, T) ecs_os_memcpy(ptr1, ptr2, ECS_SIZEOF(T))
487#define ecs_os_memcpy_n(ptr1, ptr2, T, count) ecs_os_memcpy(ptr1, ptr2, ECS_SIZEOF(T) * (size_t)(count))
488#define ecs_os_memcmp_t(ptr1, ptr2, T) ecs_os_memcmp(ptr1, ptr2, ECS_SIZEOF(T))
489
490#define ecs_os_memmove_t(ptr1, ptr2, T) ecs_os_memmove(ptr1, ptr2, ECS_SIZEOF(T))
491#define ecs_os_memmove_n(ptr1, ptr2, T, count) ecs_os_memmove(ptr1, ptr2, ECS_SIZEOF(T) * (size_t)(count))
492
493#define ecs_os_strcmp(str1, str2) strcmp(str1, str2)
494#define ecs_os_memset_t(ptr, value, T) ecs_os_memset(ptr, value, ECS_SIZEOF(T))
495#define ecs_os_memset_n(ptr, value, T, count) ecs_os_memset(ptr, value, ECS_SIZEOF(T) * (size_t)(count))
496#define ecs_os_zeromem(ptr) ecs_os_memset(ptr, 0, ECS_SIZEOF(*ptr))
497
498#define ecs_os_memdup_t(ptr, T) ecs_os_memdup(ptr, ECS_SIZEOF(T))
499#define ecs_os_memdup_n(ptr, T, count) ecs_os_memdup(ptr, ECS_SIZEOF(T) * (count))
500
501#define ecs_offset(ptr, T, index)\
502 ECS_CAST(T*, ECS_OFFSET(ptr, ECS_SIZEOF(T) * (index)))
503
504#if !defined(ECS_TARGET_POSIX) && !defined(ECS_TARGET_MINGW)
505#define ecs_os_strcat(str1, str2) strcat_s(str1, INT_MAX, str2)
506#define ecs_os_snprintf(ptr, len, ...) sprintf_s(ptr, ECS_CAST(size_t, len), __VA_ARGS__)
507#define ecs_os_vsnprintf(ptr, len, fmt, args) vsnprintf(ptr, ECS_CAST(size_t, len), fmt, args)
508#define ecs_os_strcpy(str1, str2) strcpy_s(str1, INT_MAX, str2)
509#define ecs_os_strncpy(str1, str2, len) strncpy_s(str1, INT_MAX, str2, ECS_CAST(size_t, len))
510#else
511#define ecs_os_strcat(str1, str2) strcat(str1, str2)
512#define ecs_os_snprintf(ptr, len, ...) snprintf(ptr, ECS_CAST(size_t, len), __VA_ARGS__)
513#define ecs_os_vsnprintf(ptr, len, fmt, args) vsnprintf(ptr, ECS_CAST(size_t, len), fmt, args)
514#define ecs_os_strcpy(str1, str2) strcpy(str1, str2)
515#define ecs_os_strncpy(str1, str2, len) strncpy(str1, str2, ECS_CAST(size_t, len))
516#endif
517
518/* Files */
519#define ecs_os_fopen(file, mode) ecs_os_api.fopen_(file, mode)
520#define ecs_os_fclose(file) ecs_os_api.fclose_(file)
521#define ecs_os_fread(ptr, size, count, file) ecs_os_api.fread_(ptr, size, count, file)
522
523/* Threads */
524#define ecs_os_thread_new(callback, param) ecs_os_api.thread_new_(callback, param)
525#define ecs_os_thread_join(thread) ecs_os_api.thread_join_(thread)
526#define ecs_os_thread_self() ecs_os_api.thread_self_()
527
528/* Tasks */
529#define ecs_os_task_new(callback, param) ecs_os_api.task_new_(callback, param)
530#define ecs_os_task_join(thread) ecs_os_api.task_join_(thread)
531
532/* Atomic increment and decrement */
533#define ecs_os_ainc(value) ecs_os_api.ainc_(value)
534#define ecs_os_adec(value) ecs_os_api.adec_(value)
535#define ecs_os_lainc(value) ecs_os_api.lainc_(value)
536#define ecs_os_ladec(value) ecs_os_api.ladec_(value)
537
538/* Mutex */
539#define ecs_os_mutex_new() ecs_os_api.mutex_new_()
540#define ecs_os_mutex_free(mutex) ecs_os_api.mutex_free_(mutex)
541#define ecs_os_mutex_lock(mutex) ecs_os_api.mutex_lock_(mutex)
542#define ecs_os_mutex_unlock(mutex) ecs_os_api.mutex_unlock_(mutex)
543
544/* Condition variable */
545#define ecs_os_cond_new() ecs_os_api.cond_new_()
546#define ecs_os_cond_free(cond) ecs_os_api.cond_free_(cond)
547#define ecs_os_cond_signal(cond) ecs_os_api.cond_signal_(cond)
548#define ecs_os_cond_broadcast(cond) ecs_os_api.cond_broadcast_(cond)
549#define ecs_os_cond_wait(cond, mutex) ecs_os_api.cond_wait_(cond, mutex)
550
551/* Time */
552#define ecs_os_sleep(sec, nanosec) ecs_os_api.sleep_(sec, nanosec)
553#define ecs_os_now() ecs_os_api.now_()
554#define ecs_os_get_time(time_out) ecs_os_api.get_time_(time_out)
555
556#ifndef FLECS_DISABLE_COUNTERS
557#ifdef FLECS_ACCURATE_COUNTERS
558#define ecs_os_inc(v) (ecs_os_ainc(v))
559#define ecs_os_linc(v) (ecs_os_lainc(v))
560#define ecs_os_dec(v) (ecs_os_adec(v))
561#define ecs_os_ldec(v) (ecs_os_ladec(v))
562#else
563#define ecs_os_inc(v) (++(*v))
564#define ecs_os_linc(v) (++(*v))
565#define ecs_os_dec(v) (--(*v))
566#define ecs_os_ldec(v) (--(*v))
567#endif
568#else
569#define ecs_os_inc(v)
570#define ecs_os_linc(v)
571#define ecs_os_dec(v)
572#define ecs_os_ldec(v)
573#endif
574
575
576#ifdef ECS_TARGET_MINGW
577/* mingw bug: without this, a conversion error is thrown, but isnan/isinf should
578 * accept float, double, and long double. */
579#define ecs_os_isnan(val) (isnan((float)val))
580#define ecs_os_isinf(val) (isinf((float)val))
581#else
582#define ecs_os_isnan(val) (isnan(val))
583#define ecs_os_isinf(val) (isinf(val))
584#endif
585
586/* Application termination */
587#define ecs_os_abort() ecs_os_api.abort_()
588
589/* Dynamic libraries */
590#define ecs_os_dlopen(libname) ecs_os_api.dlopen_(libname)
591#define ecs_os_dlproc(lib, procname) ecs_os_api.dlproc_(lib, procname)
592#define ecs_os_dlclose(lib) ecs_os_api.dlclose_(lib)
593
594/* Module ID translation */
595#define ecs_os_module_to_dl(lib) ecs_os_api.module_to_dl_(lib)
596#define ecs_os_module_to_etc(lib) ecs_os_api.module_to_etc_(lib)
597
598/** Macro utilities
599 * \endcond
600 */
601
602
603/* Logging */
604
605/** Log at debug level.
606 *
607 * @param file The source file.
608 * @param line The source line.
609 * @param msg The message to log.
610*/
611FLECS_API
613 const char *file,
614 int32_t line,
615 const char *msg);
616
617/** Log at trace level.
618 *
619 * @param file The source file.
620 * @param line The source line.
621 * @param msg The message to log.
622*/
623FLECS_API
625 const char *file,
626 int32_t line,
627 const char *msg);
628
629/** Log at warning level.
630 *
631 * @param file The source file.
632 * @param line The source line.
633 * @param msg The message to log.
634*/
635FLECS_API
637 const char *file,
638 int32_t line,
639 const char *msg);
640
641/** Log at error level.
642 *
643 * @param file The source file.
644 * @param line The source line.
645 * @param msg The message to log.
646*/
647FLECS_API
649 const char *file,
650 int32_t line,
651 const char *msg);
652
653/** Log at fatal level.
654 *
655 * @param file The source file.
656 * @param line The source line.
657 * @param msg The message to log.
658*/
659FLECS_API
661 const char *file,
662 int32_t line,
663 const char *msg);
664
665/** Convert errno to a string.
666 *
667 * @param err The error number.
668 * @return A string describing the error.
669 */
670FLECS_API
671const char* ecs_os_strerror(
672 int err);
673
674/** A utility for assigning strings.
675 * This operation frees an existing string and duplicates the input string.
676 *
677 * @param str Pointer to a string value.
678 * @param value The string value to assign.
679 */
680FLECS_API
682 char **str,
683 const char *value);
684
685FLECS_API
686char* ecs_os_strdup_(
687 const char *str);
688
689/* Profile tracing */
690#ifdef FLECS_PERF_TRACE
691#define ecs_os_perf_trace_push(name) ecs_os_perf_trace_push_(__FILE__, __LINE__, name)
692#define ecs_os_perf_trace_pop(name) ecs_os_perf_trace_pop_(__FILE__, __LINE__, name)
693#else
694#define ecs_os_perf_trace_push(name)
695#define ecs_os_perf_trace_pop(name)
696#endif
697
698/** Push a performance trace region.
699 *
700 * @param file The source file name.
701 * @param line The source line number.
702 * @param name The name of the trace region.
703 */
705 const char *file,
706 size_t line,
707 const char *name);
708
709/** Pop a performance trace region.
710 *
711 * @param file The source file name.
712 * @param line The source line number.
713 * @param name The name of the trace region.
714 */
716 const char *file,
717 size_t line,
718 const char *name);
719
720/** Sleep with floating-point time.
721 *
722 * @param t The time in seconds.
723 */
724FLECS_API
726 double t);
727
728/** Measure time since the provided timestamp.
729 * Use with a time value initialized to 0 to obtain the number of seconds since
730 * the epoch. The operation will write the current timestamp into start.
731 *
732 * Usage:
733 * @code
734 * ecs_time_t t = {};
735 * ecs_time_measure(&t);
736 * // code
737 * double elapsed = ecs_time_measure(&t);
738 * @endcode
739 *
740 * @param start The starting timestamp.
741 * @return The time elapsed since start.
742 */
743FLECS_API
745 ecs_time_t *start);
746
747/** Calculate the difference between two timestamps.
748 *
749 * @param t1 The first timestamp.
750 * @param t2 The second timestamp.
751 * @return The difference between timestamps.
752 */
753FLECS_API
755 ecs_time_t t1,
756 ecs_time_t t2);
757
758/** Convert a time value to a double.
759 *
760 * @param t The timestamp.
761 * @return The timestamp converted to a double.
762 */
763FLECS_API
765 ecs_time_t t);
766
767/** Return newly allocated memory that contains a copy of src.
768 *
769 * @param src The source pointer.
770 * @param size The number of bytes to copy.
771 * @return The duplicated memory.
772 */
773FLECS_API
775 const void *src,
776 ecs_size_t size);
777
778/** Are heap functions available? */
779FLECS_API
781
782/** Are threading functions available? */
783FLECS_API
785
786/** Are task functions available? */
787FLECS_API
789
790/** Are time functions available? */
791FLECS_API
793
794/** Are logging functions available? */
795FLECS_API
797
798/** Are dynamic library functions available? */
799FLECS_API
800bool ecs_os_has_dl(void);
801
802/** Are module path functions available? */
803FLECS_API
805
806#ifdef __cplusplus
807}
808#endif
809
810/** @} */
811
812#endif
size_t(*) ecs_os_api_fread_t(void *ptr, size_t size, size_t count, FILE *file)
OS API fread function type.
Definition os_api.h:268
void *(*) ecs_os_api_calloc_t(ecs_size_t size)
OS API calloc function type.
Definition os_api.h:97
FLECS_API void ecs_os_err(const char *file, int32_t line, const char *msg)
Log at error level.
void(*) ecs_os_api_abort_t(void)
OS API abort function type.
Definition os_api.h:231
char *(*) ecs_os_api_module_to_path_t(const char *module_id)
OS API module_to_path function type.
Definition os_api.h:252
uintptr_t ecs_os_dl_t
OS dynamic library.
Definition os_api.h:62
uint64_t ecs_os_thread_id_t
64-bit thread ID.
Definition os_api.h:66
void(*) ecs_os_api_enable_high_timer_resolution_t(bool enable)
OS API enable_high_timer_resolution function type.
Definition os_api.h:203
FLECS_API ecs_os_api_t ecs_os_api
Static OS API variable with configured callbacks.
ecs_os_thread_t(*) ecs_os_api_task_new_t(ecs_os_thread_callback_t callback, void *param)
OS API task_new function type.
Definition os_api.h:127
void(*) ecs_os_api_mutex_unlock_t(ecs_os_mutex_t mutex)
OS API mutex_unlock function type.
Definition os_api.h:160
ecs_os_mutex_t(*) ecs_os_api_mutex_new_t(void)
Mutex.
Definition os_api.h:150
uint64_t(*) ecs_os_api_now_t(void)
OS API now function type.
Definition os_api.h:213
int32_t(*) ecs_os_api_ainc_t(int32_t *value)
Atomic increment and decrement.
Definition os_api.h:139
void(*) ecs_os_api_cond_broadcast_t(ecs_os_cond_t cond)
OS API cond_broadcast function type.
Definition os_api.h:186
ecs_os_dl_t(*) ecs_os_api_dlopen_t(const char *libname)
OS API dlopen function type.
Definition os_api.h:236
FLECS_API int64_t ecs_os_api_realloc_count
realloc count.
void *(*) ecs_os_thread_callback_t(void *)
OS API thread_callback function type.
Definition os_api.h:107
FLECS_API double ecs_time_measure(ecs_time_t *start)
Measure time since the provided timestamp.
FLECS_API bool ecs_os_has_time(void)
Are time functions available?
FLECS_API bool ecs_os_has_dl(void)
Are dynamic library functions available?
char *(*) ecs_os_api_strdup_t(const char *str)
OS API strdup function type.
Definition os_api.h:102
FLECS_API bool ecs_os_has_logging(void)
Are logging functions available?
void(*) ecs_os_api_cond_wait_t(ecs_os_cond_t cond, ecs_os_mutex_t mutex)
OS API cond_wait function type.
Definition os_api.h:191
FLECS_API bool ecs_os_has_modules(void)
Are module path functions available?
void *(*) ecs_os_api_realloc_t(void *ptr, ecs_size_t size)
OS API realloc function type.
Definition os_api.h:91
uintptr_t ecs_os_thread_t
Use handle types that at least can store pointers.
Definition os_api.h:59
void(*) ecs_os_api_dlclose_t(ecs_os_dl_t lib)
OS API dlclose function type.
Definition os_api.h:247
uintptr_t ecs_os_sock_t
OS socket.
Definition os_api.h:63
void(*) ecs_os_api_get_time_t(ecs_time_t *time_out)
OS API get_time function type.
Definition os_api.h:208
FLECS_API int64_t ecs_os_api_malloc_count
Allocation counters.
FLECS_API void ecs_os_set_api(ecs_os_api_t *os_api)
Override the OS API.
FLECS_API void ecs_os_warn(const char *file, int32_t line, const char *msg)
Log at warning level.
void(*) ecs_os_api_free_t(void *ptr)
OS API free function type.
Definition os_api.h:86
FLECS_API void ecs_os_trace(const char *file, int32_t line, const char *msg)
Log at trace level.
FLECS_API bool ecs_os_has_task_support(void)
Are task functions available?
FLECS_API ecs_os_api_t ecs_os_get_api(void)
Get the OS API.
ecs_os_thread_t(*) ecs_os_api_thread_new_t(ecs_os_thread_callback_t callback, void *param)
OS API thread_new function type.
Definition os_api.h:112
void(*) ecs_os_api_perf_trace_t(const char *filename, size_t line, const char *name)
OS API performance tracing function type.
Definition os_api.h:280
FILE *(*) ecs_os_api_fopen_t(const char *file, const char *mode)
OS API fopen function type.
Definition os_api.h:257
void *(*) ecs_os_api_malloc_t(ecs_size_t size)
OS API malloc function type.
Definition os_api.h:81
ecs_os_thread_id_t(*) ecs_os_api_thread_self_t(void)
OS API thread_self function type.
Definition os_api.h:123
FLECS_API double ecs_time_to_double(ecs_time_t t)
Convert a time value to a double.
FLECS_API int64_t ecs_os_api_free_count
free count.
FLECS_API void ecs_os_strset(char **str, const char *value)
A utility for assigning strings.
void(*) ecs_os_api_fclose_t(FILE *file)
OS API fclose function type.
Definition os_api.h:263
void(*) ecs_os_api_log_t(int32_t level, const char *file, int32_t line, const char *msg)
OS API log function type.
Definition os_api.h:223
FLECS_API void ecs_os_dbg(const char *file, int32_t line, const char *msg)
Macro utilities.
void(*) ecs_os_api_fini_t(void)
OS API deinit.
Definition os_api.h:77
void ecs_os_perf_trace_push_(const char *file, size_t line, const char *name)
Push a performance trace region.
uintptr_t ecs_os_mutex_t
OS mutex.
Definition os_api.h:61
ecs_os_proc_t(*) ecs_os_api_dlproc_t(ecs_os_dl_t lib, const char *procname)
OS API dlproc function type.
Definition os_api.h:241
FLECS_API ecs_time_t ecs_time_sub(ecs_time_t t1, ecs_time_t t2)
Calculate the difference between two timestamps.
void(*) ecs_os_api_sleep_t(int32_t sec, int32_t nanosec)
OS API sleep function type.
Definition os_api.h:197
void(*) ecs_os_api_cond_free_t(ecs_os_cond_t cond)
OS API cond_free function type.
Definition os_api.h:176
uintptr_t ecs_os_cond_t
OS cond.
Definition os_api.h:60
void(*) ecs_os_api_init_t(void)
OS API init.
Definition os_api.h:73
int64_t(*) ecs_os_api_lainc_t(int64_t *value)
OS API lainc function type.
Definition os_api.h:144
void(*) ecs_os_proc_t(void)
Generic function pointer type.
Definition os_api.h:69
FLECS_API bool ecs_os_has_threading(void)
Are threading functions available?
FLECS_API void * ecs_os_memdup(const void *src, ecs_size_t size)
Return newly allocated memory that contains a copy of src.
void(*) ecs_os_api_cond_signal_t(ecs_os_cond_t cond)
OS API cond_signal function type.
Definition os_api.h:181
void *(*) ecs_os_api_thread_join_t(ecs_os_thread_t thread)
OS API thread_join function type.
Definition os_api.h:118
FLECS_API void ecs_os_set_api_defaults(void)
Set default values for the OS API.
FLECS_API void ecs_os_fatal(const char *file, int32_t line, const char *msg)
Log at fatal level.
FLECS_API void ecs_os_init(void)
Initialize the OS API.
void(*) ecs_os_api_mutex_free_t(ecs_os_mutex_t mutex)
OS API mutex_free function type.
Definition os_api.h:165
FLECS_API bool ecs_os_has_heap(void)
Are heap functions available?
FLECS_API void ecs_os_fini(void)
Deinitialize the OS API.
void ecs_os_perf_trace_pop_(const char *file, size_t line, const char *name)
Pop a performance trace region.
FLECS_API const char * ecs_os_strerror(int err)
Convert errno to a string.
FLECS_API void ecs_sleepf(double t)
Sleep with floating-point time.
void(*) ecs_os_api_mutex_lock_t(ecs_os_mutex_t mutex)
OS API mutex_lock function type.
Definition os_api.h:155
ecs_os_cond_t(*) ecs_os_api_cond_new_t(void)
Condition variable.
Definition os_api.h:171
FLECS_API int64_t ecs_os_api_calloc_count
calloc count.
OS API interface.
Definition os_api.h:289
ecs_os_api_fopen_t fopen_
fopen callback.
Definition os_api.h:362
ecs_os_api_cond_wait_t cond_wait_
cond_wait callback.
Definition os_api.h:329
ecs_os_api_thread_new_t thread_new_
thread_new callback.
Definition os_api.h:304
ecs_os_api_free_t free_
free callback.
Definition os_api.h:298
int32_t log_last_error_
Last logged error code.
Definition os_api.h:372
ecs_os_api_sleep_t sleep_
sleep callback.
Definition os_api.h:332
ecs_os_api_realloc_t realloc_
realloc callback.
Definition os_api.h:296
ecs_os_api_mutex_lock_t mutex_unlock_
mutex_unlock callback.
Definition os_api.h:322
ecs_os_api_abort_t abort_
abort callback.
Definition os_api.h:346
ecs_os_api_lainc_t lainc_
lainc callback.
Definition os_api.h:315
ecs_os_api_init_t init_
init callback.
Definition os_api.h:291
ecs_os_api_get_time_t get_time_
get_time callback.
Definition os_api.h:334
ecs_os_api_cond_broadcast_t cond_broadcast_
cond_broadcast callback.
Definition os_api.h:328
ecs_os_api_calloc_t calloc_
calloc callback.
Definition os_api.h:297
ecs_os_api_dlopen_t dlopen_
dlopen callback.
Definition os_api.h:349
ecs_os_api_perf_trace_t perf_trace_push_
perf_trace_push callback.
Definition os_api.h:367
ecs_os_api_thread_self_t thread_self_
thread_self callback.
Definition os_api.h:306
ecs_os_api_fclose_t fclose_
fclose callback.
Definition os_api.h:363
ecs_os_api_fread_t fread_
fread callback.
Definition os_api.h:364
ecs_os_api_thread_join_t thread_join_
thread_join callback.
Definition os_api.h:305
ecs_os_api_module_to_path_t module_to_dl_
module_to_dl callback.
Definition os_api.h:355
int32_t log_indent_
Tracing indentation level.
Definition os_api.h:371
ecs_os_api_malloc_t malloc_
malloc callback.
Definition os_api.h:295
ecs_os_api_log_t log_
log callback.
Definition os_api.h:337
ecs_os_api_thread_join_t task_join_
task_join callback.
Definition os_api.h:310
int64_t log_last_timestamp_
Last logged timestamp.
Definition os_api.h:373
ecs_os_api_mutex_new_t mutex_new_
mutex_new callback.
Definition os_api.h:319
ecs_os_api_lainc_t ladec_
ladec callback.
Definition os_api.h:316
void * log_out_
File used for logging output (type is FILE*) (hint: log_ decides where to write).
Definition os_api.h:377
ecs_os_api_cond_new_t cond_new_
cond_new callback.
Definition os_api.h:325
ecs_os_api_perf_trace_t perf_trace_pop_
perf_trace_pop callback.
Definition os_api.h:368
ecs_os_api_thread_new_t task_new_
task_new callback.
Definition os_api.h:309
int32_t log_level_
Tracing level.
Definition os_api.h:370
ecs_os_api_fini_t fini_
fini callback.
Definition os_api.h:292
ecs_os_api_cond_signal_t cond_signal_
cond_signal callback.
Definition os_api.h:327
ecs_os_api_cond_free_t cond_free_
cond_free callback.
Definition os_api.h:326
ecs_os_api_strdup_t strdup_
strdup callback.
Definition os_api.h:301
ecs_os_api_mutex_free_t mutex_free_
mutex_free callback.
Definition os_api.h:320
ecs_os_api_module_to_path_t module_to_etc_
module_to_etc callback.
Definition os_api.h:359
ecs_flags32_t flags_
OS API flags.
Definition os_api.h:375
ecs_os_api_now_t now_
now callback.
Definition os_api.h:333
ecs_os_api_mutex_lock_t mutex_lock_
mutex_lock callback.
Definition os_api.h:321
ecs_os_api_ainc_t ainc_
ainc callback.
Definition os_api.h:313
ecs_os_api_ainc_t adec_
adec callback.
Definition os_api.h:314
ecs_os_api_dlproc_t dlproc_
dlproc callback.
Definition os_api.h:350
ecs_os_api_dlclose_t dlclose_
dlclose callback.
Definition os_api.h:351
Time type.
Definition os_api.h:39
uint32_t sec
Second part.
Definition os_api.h:40
uint32_t nanosec
Nanosecond part.
Definition os_api.h:41