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);
112int32_t (*ecs_os_api_ainc_t)(
116int64_t (*ecs_os_api_lainc_t)(
121ecs_os_mutex_t (*ecs_os_api_mutex_new_t)(
125void (*ecs_os_api_mutex_lock_t)(
126 ecs_os_mutex_t mutex);
129void (*ecs_os_api_mutex_unlock_t)(
130 ecs_os_mutex_t mutex);
133void (*ecs_os_api_mutex_free_t)(
134 ecs_os_mutex_t mutex);
138ecs_os_cond_t (*ecs_os_api_cond_new_t)(
142void (*ecs_os_api_cond_free_t)(
146void (*ecs_os_api_cond_signal_t)(
150void (*ecs_os_api_cond_broadcast_t)(
154void (*ecs_os_api_cond_wait_t)(
156 ecs_os_mutex_t mutex);
159void (*ecs_os_api_sleep_t)(
164void (*ecs_os_api_enable_high_timer_resolution_t)(
168void (*ecs_os_api_get_time_t)(
172uint64_t (*ecs_os_api_now_t)(void);
176void (*ecs_os_api_log_t)(
184void (*ecs_os_api_abort_t)(
189ecs_os_dl_t (*ecs_os_api_dlopen_t)(
190 const char *libname);
193ecs_os_proc_t (*ecs_os_api_dlproc_t)(
195 const char *procname);
198void (*ecs_os_api_dlclose_t)(
202char* (*ecs_os_api_module_to_path_t)(
203 const char *module_id);
210 ecs_os_api_init_t init_;
211 ecs_os_api_fini_t fini_;
214 ecs_os_api_malloc_t malloc_;
215 ecs_os_api_realloc_t realloc_;
216 ecs_os_api_calloc_t calloc_;
217 ecs_os_api_free_t free_;
220 ecs_os_api_strdup_t strdup_;
223 ecs_os_api_thread_new_t thread_new_;
224 ecs_os_api_thread_join_t thread_join_;
225 ecs_os_api_thread_self_t thread_self_;
228 ecs_os_api_ainc_t ainc_;
229 ecs_os_api_ainc_t adec_;
230 ecs_os_api_lainc_t lainc_;
231 ecs_os_api_lainc_t ladec_;
234 ecs_os_api_mutex_new_t mutex_new_;
235 ecs_os_api_mutex_free_t mutex_free_;
236 ecs_os_api_mutex_lock_t mutex_lock_;
237 ecs_os_api_mutex_lock_t mutex_unlock_;
240 ecs_os_api_cond_new_t cond_new_;
241 ecs_os_api_cond_free_t cond_free_;
242 ecs_os_api_cond_signal_t cond_signal_;
243 ecs_os_api_cond_broadcast_t cond_broadcast_;
244 ecs_os_api_cond_wait_t cond_wait_;
247 ecs_os_api_sleep_t sleep_;
248 ecs_os_api_now_t now_;
249 ecs_os_api_get_time_t get_time_;
252 ecs_os_api_log_t log_;
260 ecs_os_api_abort_t abort_;
263 ecs_os_api_dlopen_t dlopen_;
264 ecs_os_api_dlproc_t dlproc_;
265 ecs_os_api_dlclose_t dlclose_;
269 ecs_os_api_module_to_path_t module_to_dl_;
273 ecs_os_api_module_to_path_t module_to_etc_;
282 int32_t log_last_error_;
285 int64_t log_last_timestamp_;
288 ecs_flags32_t flags_;
295void ecs_os_init(
void);
298void ecs_os_fini(
void);
308void ecs_os_set_api_defaults(
void);
312#define ecs_os_malloc(size) ecs_os_api.malloc_(size)
315#define ecs_os_free(ptr) ecs_os_api.free_(ptr)
317#ifndef ecs_os_realloc
318#define ecs_os_realloc(ptr, size) ecs_os_api.realloc_(ptr, size)
321#define ecs_os_calloc(size) ecs_os_api.calloc_(size)
323#if defined(ECS_TARGET_WINDOWS)
324#define ecs_os_alloca(size) _alloca((size_t)(size))
326#define ecs_os_alloca(size) alloca((size_t)(size))
329#define ecs_os_malloc_t(T) ECS_CAST(T*, ecs_os_malloc(ECS_SIZEOF(T)))
330#define ecs_os_malloc_n(T, count) ECS_CAST(T*, ecs_os_malloc(ECS_SIZEOF(T) * (count)))
331#define ecs_os_calloc_t(T) ECS_CAST(T*, ecs_os_calloc(ECS_SIZEOF(T)))
332#define ecs_os_calloc_n(T, count) ECS_CAST(T*, ecs_os_calloc(ECS_SIZEOF(T) * (count)))
334#define ecs_os_realloc_t(ptr, T) ECS_CAST(T*, ecs_os_realloc([ptr, ECS_SIZEOF(T)))
335#define ecs_os_realloc_n(ptr, T, count) ECS_CAST(T*, ecs_os_realloc(ptr, ECS_SIZEOF(T) * (count)))
336#define ecs_os_alloca_t(T) ECS_CAST(T*, ecs_os_alloca(ECS_SIZEOF(T)))
337#define ecs_os_alloca_n(T, count) ECS_CAST(T*, ecs_os_alloca(ECS_SIZEOF(T) * (count)))
341#define ecs_os_strdup(str) ecs_os_api.strdup_(str)
345#define ecs_os_strlen(str) static_cast<ecs_size_t>(strlen(str))
346#define ecs_os_strncmp(str1, str2, num) strncmp(str1, str2, static_cast<size_t>(num))
347#define ecs_os_memcmp(ptr1, ptr2, num) memcmp(ptr1, ptr2, static_cast<size_t>(num))
348#define ecs_os_memcpy(ptr1, ptr2, num) memcpy(ptr1, ptr2, static_cast<size_t>(num))
349#define ecs_os_memset(ptr, value, num) memset(ptr, value, static_cast<size_t>(num))
350#define ecs_os_memmove(dst, src, size) memmove(dst, src, static_cast<size_t>(size))
352#define ecs_os_strlen(str) (ecs_size_t)strlen(str)
353#define ecs_os_strncmp(str1, str2, num) strncmp(str1, str2, (size_t)(num))
354#define ecs_os_memcmp(ptr1, ptr2, num) memcmp(ptr1, ptr2, (size_t)(num))
355#define ecs_os_memcpy(ptr1, ptr2, num) memcpy(ptr1, ptr2, (size_t)(num))
356#define ecs_os_memset(ptr, value, num) memset(ptr, value, (size_t)(num))
357#define ecs_os_memmove(dst, src, size) memmove(dst, src, (size_t)(size))
360#define ecs_os_memcpy_t(ptr1, ptr2, T) ecs_os_memcpy(ptr1, ptr2, ECS_SIZEOF(T))
361#define ecs_os_memcpy_n(ptr1, ptr2, T, count) ecs_os_memcpy(ptr1, ptr2, ECS_SIZEOF(T) * count)
362#define ecs_os_memcmp_t(ptr1, ptr2, T) ecs_os_memcmp(ptr1, ptr2, ECS_SIZEOF(T))
364#define ecs_os_strcmp(str1, str2) strcmp(str1, str2)
365#define ecs_os_memset_t(ptr, value, T) ecs_os_memset(ptr, value, ECS_SIZEOF(T))
366#define ecs_os_memset_n(ptr, value, T, count) ecs_os_memset(ptr, value, ECS_SIZEOF(T) * count)
367#define ecs_os_zeromem(ptr) ecs_os_memset(ptr, 0, ECS_SIZEOF(*ptr))
369#define ecs_os_memdup_t(ptr, T) ecs_os_memdup(ptr, ECS_SIZEOF(T))
370#define ecs_os_memdup_n(ptr, T, count) ecs_os_memdup(ptr, ECS_SIZEOF(T) * count)
372#define ecs_offset(ptr, T, index)\
373 ECS_CAST(T*, ECS_OFFSET(ptr, ECS_SIZEOF(T) * index))
375#if defined(ECS_TARGET_MSVC)
376#define ecs_os_strcat(str1, str2) strcat_s(str1, INT_MAX, str2)
377#define ecs_os_sprintf(ptr, ...) sprintf_s(ptr, INT_MAX, __VA_ARGS__)
378#define ecs_os_vsprintf(ptr, fmt, args) vsprintf_s(ptr, INT_MAX, fmt, args)
379#define ecs_os_strcpy(str1, str2) strcpy_s(str1, INT_MAX, str2)
381#define ecs_os_strncpy(str1, str2, num) strncpy_s(str1, INT_MAX, str2, static_cast<size_t>(num))
383#define ecs_os_strncpy(str1, str2, num) strncpy_s(str1, INT_MAX, str2, (size_t)(num))
386#define ecs_os_strcat(str1, str2) strcat(str1, str2)
387#define ecs_os_sprintf(ptr, ...) sprintf(ptr, __VA_ARGS__)
388#define ecs_os_vsprintf(ptr, fmt, args) vsprintf(ptr, fmt, args)
389#define ecs_os_strcpy(str1, str2) strcpy(str1, str2)
391#define ecs_os_strncpy(str1, str2, num) strncpy(str1, str2, static_cast<size_t>(num))
393#define ecs_os_strncpy(str1, str2, num) strncpy(str1, str2, (size_t)(num))
398#if defined(ECS_TARGET_MSVC)
399#define ecs_os_fopen(result, file, mode) fopen_s(result, file, mode)
401#define ecs_os_fopen(result, file, mode) (*(result)) = fopen(file, mode)
405#define ecs_os_thread_new(callback, param) ecs_os_api.thread_new_(callback, param)
406#define ecs_os_thread_join(thread) ecs_os_api.thread_join_(thread)
407#define ecs_os_thread_self() ecs_os_api.thread_self_()
410#define ecs_os_ainc(value) ecs_os_api.ainc_(value)
411#define ecs_os_adec(value) ecs_os_api.adec_(value)
412#define ecs_os_lainc(value) ecs_os_api.lainc_(value)
413#define ecs_os_ladec(value) ecs_os_api.ladec_(value)
416#define ecs_os_mutex_new() ecs_os_api.mutex_new_()
417#define ecs_os_mutex_free(mutex) ecs_os_api.mutex_free_(mutex)
418#define ecs_os_mutex_lock(mutex) ecs_os_api.mutex_lock_(mutex)
419#define ecs_os_mutex_unlock(mutex) ecs_os_api.mutex_unlock_(mutex)
422#define ecs_os_cond_new() ecs_os_api.cond_new_()
423#define ecs_os_cond_free(cond) ecs_os_api.cond_free_(cond)
424#define ecs_os_cond_signal(cond) ecs_os_api.cond_signal_(cond)
425#define ecs_os_cond_broadcast(cond) ecs_os_api.cond_broadcast_(cond)
426#define ecs_os_cond_wait(cond, mutex) ecs_os_api.cond_wait_(cond, mutex)
429#define ecs_os_sleep(sec, nanosec) ecs_os_api.sleep_(sec, nanosec)
430#define ecs_os_now() ecs_os_api.now_()
431#define ecs_os_get_time(time_out) ecs_os_api.get_time_(time_out)
435void ecs_os_dbg(
const char *file, int32_t line,
const char *msg);
438void ecs_os_trace(
const char *file, int32_t line,
const char *msg);
441void ecs_os_warn(
const char *file, int32_t line,
const char *msg);
444void ecs_os_err(
const char *file, int32_t line,
const char *msg);
447void ecs_os_fatal(
const char *file, int32_t line,
const char *msg);
450const char* ecs_os_strerror(
int err);
453void ecs_os_strset(
char **str,
const char *value);
455#ifdef FLECS_ACCURATE_COUNTERS
456#define ecs_os_inc(v) (ecs_os_ainc(v))
457#define ecs_os_linc(v) (ecs_os_lainc(v))
458#define ecs_os_dec(v) (ecs_os_adec(v))
459#define ecs_os_ldec(v) (ecs_os_ladec(v))
461#define ecs_os_inc(v) (++(*v))
462#define ecs_os_linc(v) (++(*v))
463#define ecs_os_dec(v) (--(*v))
464#define ecs_os_ldec(v) (--(*v))
468#define ecs_os_abort() ecs_os_api.abort_()
471#define ecs_os_dlopen(libname) ecs_os_api.dlopen_(libname)
472#define ecs_os_dlproc(lib, procname) ecs_os_api.dlproc_(lib, procname)
473#define ecs_os_dlclose(lib) ecs_os_api.dlclose_(lib)
476#define ecs_os_module_to_dl(lib) ecs_os_api.module_to_dl_(lib)
477#define ecs_os_module_to_etc(lib) ecs_os_api.module_to_etc_(lib)
486double ecs_time_measure(
497double 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_threading(void)
Are threading functions available?
FLECS_API bool ecs_os_has_heap(void)
Are heap functions available?