27#if defined(ECS_TARGET_WINDOWS)
29#elif defined(ECS_TARGET_FREEBSD)
45extern int64_t ecs_os_api_malloc_count;
46extern int64_t ecs_os_api_realloc_count;
47extern int64_t ecs_os_api_calloc_count;
48extern int64_t ecs_os_api_free_count;
51typedef uintptr_t ecs_os_thread_t;
52typedef uintptr_t ecs_os_cond_t;
53typedef uintptr_t ecs_os_mutex_t;
54typedef uintptr_t ecs_os_dl_t;
55typedef uintptr_t ecs_os_sock_t;
58typedef uint64_t ecs_os_thread_id_t;
61typedef void (*ecs_os_proc_t)(void);
65void (*ecs_os_api_init_t)(void);
69void (*ecs_os_api_fini_t)(void);
73void* (*ecs_os_api_malloc_t)(
77void (*ecs_os_api_free_t)(
81void* (*ecs_os_api_realloc_t)(
86void* (*ecs_os_api_calloc_t)(
90char* (*ecs_os_api_strdup_t)(
95void* (*ecs_os_thread_callback_t)(
99ecs_os_thread_t (*ecs_os_api_thread_new_t)(
100 ecs_os_thread_callback_t callback,
104void* (*ecs_os_api_thread_join_t)(
105 ecs_os_thread_t thread);
108ecs_os_thread_id_t (*ecs_os_api_thread_self_t)(void);
112ecs_os_thread_t (*ecs_os_api_task_new_t)(
113 ecs_os_thread_callback_t callback,
117void* (*ecs_os_api_task_join_t)(
118 ecs_os_thread_t thread);
122int32_t (*ecs_os_api_ainc_t)(
126int64_t (*ecs_os_api_lainc_t)(
131ecs_os_mutex_t (*ecs_os_api_mutex_new_t)(
135void (*ecs_os_api_mutex_lock_t)(
136 ecs_os_mutex_t mutex);
139void (*ecs_os_api_mutex_unlock_t)(
140 ecs_os_mutex_t mutex);
143void (*ecs_os_api_mutex_free_t)(
144 ecs_os_mutex_t mutex);
148ecs_os_cond_t (*ecs_os_api_cond_new_t)(
152void (*ecs_os_api_cond_free_t)(
156void (*ecs_os_api_cond_signal_t)(
160void (*ecs_os_api_cond_broadcast_t)(
164void (*ecs_os_api_cond_wait_t)(
166 ecs_os_mutex_t mutex);
169void (*ecs_os_api_sleep_t)(
174void (*ecs_os_api_enable_high_timer_resolution_t)(
178void (*ecs_os_api_get_time_t)(
182uint64_t (*ecs_os_api_now_t)(void);
186void (*ecs_os_api_log_t)(
194void (*ecs_os_api_abort_t)(
199ecs_os_dl_t (*ecs_os_api_dlopen_t)(
200 const char *libname);
203ecs_os_proc_t (*ecs_os_api_dlproc_t)(
205 const char *procname);
208void (*ecs_os_api_dlclose_t)(
212char* (*ecs_os_api_module_to_path_t)(
213 const char *module_id);
220 ecs_os_api_init_t init_;
221 ecs_os_api_fini_t fini_;
224 ecs_os_api_malloc_t malloc_;
225 ecs_os_api_realloc_t realloc_;
226 ecs_os_api_calloc_t calloc_;
227 ecs_os_api_free_t free_;
230 ecs_os_api_strdup_t strdup_;
233 ecs_os_api_thread_new_t thread_new_;
234 ecs_os_api_thread_join_t thread_join_;
235 ecs_os_api_thread_self_t thread_self_;
238 ecs_os_api_thread_new_t task_new_;
239 ecs_os_api_thread_join_t task_join_;
242 ecs_os_api_ainc_t ainc_;
243 ecs_os_api_ainc_t adec_;
244 ecs_os_api_lainc_t lainc_;
245 ecs_os_api_lainc_t ladec_;
248 ecs_os_api_mutex_new_t mutex_new_;
249 ecs_os_api_mutex_free_t mutex_free_;
250 ecs_os_api_mutex_lock_t mutex_lock_;
251 ecs_os_api_mutex_lock_t mutex_unlock_;
254 ecs_os_api_cond_new_t cond_new_;
255 ecs_os_api_cond_free_t cond_free_;
256 ecs_os_api_cond_signal_t cond_signal_;
257 ecs_os_api_cond_broadcast_t cond_broadcast_;
258 ecs_os_api_cond_wait_t cond_wait_;
261 ecs_os_api_sleep_t sleep_;
262 ecs_os_api_now_t now_;
263 ecs_os_api_get_time_t get_time_;
266 ecs_os_api_log_t log_;
274 ecs_os_api_abort_t abort_;
277 ecs_os_api_dlopen_t dlopen_;
278 ecs_os_api_dlproc_t dlproc_;
279 ecs_os_api_dlclose_t dlclose_;
283 ecs_os_api_module_to_path_t module_to_dl_;
287 ecs_os_api_module_to_path_t module_to_etc_;
296 int32_t log_last_error_;
299 int64_t log_last_timestamp_;
302 ecs_flags32_t flags_;
309void ecs_os_init(
void);
312void ecs_os_fini(
void);
322void ecs_os_set_api_defaults(
void);
326#define ecs_os_malloc(size) ecs_os_api.malloc_(size)
329#define ecs_os_free(ptr) ecs_os_api.free_(ptr)
331#ifndef ecs_os_realloc
332#define ecs_os_realloc(ptr, size) ecs_os_api.realloc_(ptr, size)
335#define ecs_os_calloc(size) ecs_os_api.calloc_(size)
337#if defined(ECS_TARGET_WINDOWS)
338#define ecs_os_alloca(size) _alloca((size_t)(size))
340#define ecs_os_alloca(size) alloca((size_t)(size))
343#define ecs_os_malloc_t(T) ECS_CAST(T*, ecs_os_malloc(ECS_SIZEOF(T)))
344#define ecs_os_malloc_n(T, count) ECS_CAST(T*, ecs_os_malloc(ECS_SIZEOF(T) * (count)))
345#define ecs_os_calloc_t(T) ECS_CAST(T*, ecs_os_calloc(ECS_SIZEOF(T)))
346#define ecs_os_calloc_n(T, count) ECS_CAST(T*, ecs_os_calloc(ECS_SIZEOF(T) * (count)))
348#define ecs_os_realloc_t(ptr, T) ECS_CAST(T*, ecs_os_realloc(ptr, ECS_SIZEOF(T)))
349#define ecs_os_realloc_n(ptr, T, count) ECS_CAST(T*, ecs_os_realloc(ptr, ECS_SIZEOF(T) * (count)))
350#define ecs_os_alloca_t(T) ECS_CAST(T*, ecs_os_alloca(ECS_SIZEOF(T)))
351#define ecs_os_alloca_n(T, count) ECS_CAST(T*, ecs_os_alloca(ECS_SIZEOF(T) * (count)))
355#define ecs_os_strdup(str) ecs_os_api.strdup_(str)
359#define ecs_os_strlen(str) static_cast<ecs_size_t>(strlen(str))
360#define ecs_os_strncmp(str1, str2, num) strncmp(str1, str2, static_cast<size_t>(num))
361#define ecs_os_memcmp(ptr1, ptr2, num) memcmp(ptr1, ptr2, static_cast<size_t>(num))
362#define ecs_os_memcpy(ptr1, ptr2, num) memcpy(ptr1, ptr2, static_cast<size_t>(num))
363#define ecs_os_memset(ptr, value, num) memset(ptr, value, static_cast<size_t>(num))
364#define ecs_os_memmove(dst, src, size) memmove(dst, src, static_cast<size_t>(size))
366#define ecs_os_strlen(str) (ecs_size_t)strlen(str)
367#define ecs_os_strncmp(str1, str2, num) strncmp(str1, str2, (size_t)(num))
368#define ecs_os_memcmp(ptr1, ptr2, num) memcmp(ptr1, ptr2, (size_t)(num))
369#define ecs_os_memcpy(ptr1, ptr2, num) memcpy(ptr1, ptr2, (size_t)(num))
370#define ecs_os_memset(ptr, value, num) memset(ptr, value, (size_t)(num))
371#define ecs_os_memmove(dst, src, size) memmove(dst, src, (size_t)(size))
374#define ecs_os_memcpy_t(ptr1, ptr2, T) ecs_os_memcpy(ptr1, ptr2, ECS_SIZEOF(T))
375#define ecs_os_memcpy_n(ptr1, ptr2, T, count) ecs_os_memcpy(ptr1, ptr2, ECS_SIZEOF(T) * count)
376#define ecs_os_memcmp_t(ptr1, ptr2, T) ecs_os_memcmp(ptr1, ptr2, ECS_SIZEOF(T))
378#define ecs_os_memmove_t(ptr1, ptr2, T) ecs_os_memmove(ptr1, ptr2, ECS_SIZEOF(T))
379#define ecs_os_memmove_n(ptr1, ptr2, T, count) ecs_os_memmove(ptr1, ptr2, ECS_SIZEOF(T) * count)
380#define ecs_os_memmove_t(ptr1, ptr2, T) ecs_os_memmove(ptr1, ptr2, ECS_SIZEOF(T))
382#define ecs_os_strcmp(str1, str2) strcmp(str1, str2)
383#define ecs_os_memset_t(ptr, value, T) ecs_os_memset(ptr, value, ECS_SIZEOF(T))
384#define ecs_os_memset_n(ptr, value, T, count) ecs_os_memset(ptr, value, ECS_SIZEOF(T) * count)
385#define ecs_os_zeromem(ptr) ecs_os_memset(ptr, 0, ECS_SIZEOF(*ptr))
387#define ecs_os_memdup_t(ptr, T) ecs_os_memdup(ptr, ECS_SIZEOF(T))
388#define ecs_os_memdup_n(ptr, T, count) ecs_os_memdup(ptr, ECS_SIZEOF(T) * count)
390#define ecs_offset(ptr, T, index)\
391 ECS_CAST(T*, ECS_OFFSET(ptr, ECS_SIZEOF(T) * index))
393#if !defined(ECS_TARGET_POSIX) && !defined(ECS_TARGET_MINGW)
394#define ecs_os_strcat(str1, str2) strcat_s(str1, INT_MAX, str2)
395#define ecs_os_sprintf(ptr, ...) sprintf_s(ptr, INT_MAX, __VA_ARGS__)
396#define ecs_os_vsprintf(ptr, fmt, args) vsprintf_s(ptr, INT_MAX, fmt, args)
397#define ecs_os_strcpy(str1, str2) strcpy_s(str1, INT_MAX, str2)
399#define ecs_os_strncpy(str1, str2, num) strncpy_s(str1, INT_MAX, str2, static_cast<size_t>(num))
401#define ecs_os_strncpy(str1, str2, num) strncpy_s(str1, INT_MAX, str2, (size_t)(num))
404#define ecs_os_strcat(str1, str2) strcat(str1, str2)
405#define ecs_os_sprintf(ptr, ...) sprintf(ptr, __VA_ARGS__)
406#define ecs_os_vsprintf(ptr, fmt, args) vsprintf(ptr, fmt, args)
407#define ecs_os_strcpy(str1, str2) strcpy(str1, str2)
409#define ecs_os_strncpy(str1, str2, num) strncpy(str1, str2, static_cast<size_t>(num))
411#define ecs_os_strncpy(str1, str2, num) strncpy(str1, str2, (size_t)(num))
416#ifndef ECS_TARGET_POSIX
417#define ecs_os_fopen(result, file, mode) fopen_s(result, file, mode)
419#define ecs_os_fopen(result, file, mode) (*(result)) = fopen(file, mode)
423#define ecs_os_thread_new(callback, param) ecs_os_api.thread_new_(callback, param)
424#define ecs_os_thread_join(thread) ecs_os_api.thread_join_(thread)
425#define ecs_os_thread_self() ecs_os_api.thread_self_()
428#define ecs_os_task_new(callback, param) ecs_os_api.task_new_(callback, param)
429#define ecs_os_task_join(thread) ecs_os_api.task_join_(thread)
432#define ecs_os_ainc(value) ecs_os_api.ainc_(value)
433#define ecs_os_adec(value) ecs_os_api.adec_(value)
434#define ecs_os_lainc(value) ecs_os_api.lainc_(value)
435#define ecs_os_ladec(value) ecs_os_api.ladec_(value)
438#define ecs_os_mutex_new() ecs_os_api.mutex_new_()
439#define ecs_os_mutex_free(mutex) ecs_os_api.mutex_free_(mutex)
440#define ecs_os_mutex_lock(mutex) ecs_os_api.mutex_lock_(mutex)
441#define ecs_os_mutex_unlock(mutex) ecs_os_api.mutex_unlock_(mutex)
444#define ecs_os_cond_new() ecs_os_api.cond_new_()
445#define ecs_os_cond_free(cond) ecs_os_api.cond_free_(cond)
446#define ecs_os_cond_signal(cond) ecs_os_api.cond_signal_(cond)
447#define ecs_os_cond_broadcast(cond) ecs_os_api.cond_broadcast_(cond)
448#define ecs_os_cond_wait(cond, mutex) ecs_os_api.cond_wait_(cond, mutex)
451#define ecs_os_sleep(sec, nanosec) ecs_os_api.sleep_(sec, nanosec)
452#define ecs_os_now() ecs_os_api.now_()
453#define ecs_os_get_time(time_out) ecs_os_api.get_time_(time_out)
457void ecs_os_dbg(
const char *file, int32_t line,
const char *msg);
460void ecs_os_trace(
const char *file, int32_t line,
const char *msg);
463void ecs_os_warn(
const char *file, int32_t line,
const char *msg);
466void ecs_os_err(
const char *file, int32_t line,
const char *msg);
469void ecs_os_fatal(
const char *file, int32_t line,
const char *msg);
472const char* ecs_os_strerror(
int err);
475void ecs_os_strset(
char **str,
const char *value);
477#ifdef FLECS_ACCURATE_COUNTERS
478#define ecs_os_inc(v) (ecs_os_ainc(v))
479#define ecs_os_linc(v) (ecs_os_lainc(v))
480#define ecs_os_dec(v) (ecs_os_adec(v))
481#define ecs_os_ldec(v) (ecs_os_ladec(v))
483#define ecs_os_inc(v) (++(*v))
484#define ecs_os_linc(v) (++(*v))
485#define ecs_os_dec(v) (--(*v))
486#define ecs_os_ldec(v) (--(*v))
489#ifdef ECS_TARGET_MINGW
492#define ecs_os_isnan(val) (isnan((float)val))
493#define ecs_os_isinf(val) (isinf((float)val))
495#define ecs_os_isnan(val) (isnan(val))
496#define ecs_os_isinf(val) (isinf(val))
500#define ecs_os_abort() ecs_os_api.abort_()
503#define ecs_os_dlopen(libname) ecs_os_api.dlopen_(libname)
504#define ecs_os_dlproc(lib, procname) ecs_os_api.dlproc_(lib, procname)
505#define ecs_os_dlclose(lib) ecs_os_api.dlclose_(lib)
508#define ecs_os_module_to_dl(lib) ecs_os_api.module_to_dl_(lib)
509#define ecs_os_module_to_etc(lib) ecs_os_api.module_to_etc_(lib)
518double ecs_time_measure(
529double ecs_time_to_double(
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?
FLECS_API bool ecs_os_has_logging(void)
Are logging functions available?
FLECS_API bool ecs_os_has_modules(void)
Are module path functions available?
FLECS_API bool ecs_os_has_task_support(void)
Are task functions available?
FLECS_API bool ecs_os_has_threading(void)
Are threading functions available?
FLECS_API bool ecs_os_has_heap(void)
Are heap functions available?