platform_core.h (5408B)
1 ////////////////////////////////////////////////////////////////// 2 // platform_core.h 3 4 5 ////////////////////////////////////////////////////////////////// 6 // Includes 7 8 #if RV_OS_WINDOWS 9 10 #if RV_COMPILER_CL 11 #define __USE_MINGW_ANSI_STDIO 1 12 #endif 13 #define WIN32_LEAN_AND_MEAN 14 #define OEMRESOURCE 15 #include <windows.h> 16 17 #elif RV_OS_LINUX 18 19 #include <unistd.h> 20 #include <sys/mman.h> 21 #include <fcntl.h> 22 23 #else 24 25 #error TODO: add includes for other platforms 26 27 #endif 28 29 #include <stdio.h> 30 #include <errno.h> 31 #include <string.h> 32 #include <stdlib.h> 33 #include <time.h> 34 #include <stdarg.h> 35 36 ////////////////////////////////////////////////////////////////// 37 // Linked List 38 // stolen from rjf's root_basic 39 40 #define rv_llist_link_array(_array, _array_size) do { \ 41 for (u32 __i = 0; __i+1 < (_array_size); __i++) \ 42 (_array)[__i].next = &(_array)[__i+1]; \ 43 if (_array_size) (_array)[(_array_size)-1].next = 0; \ 44 } while (0) 45 46 47 #define RV_CHECK_NULL(p) ((p)==0) 48 #define RV_SET_NULL(p) ((p)=0) 49 50 #define RV_QUEUE_PUSH_NZ(f,l,n,next,zchk,zset) (zchk(f)?\ 51 (((f)=(l)=(n)), zset((n)->next)):\ 52 ((l)->next=(n),(l)=(n),zset((n)->next))) 53 #define RV_QUEUE_PUSH_FRONT_NZ(f,l,n,next,zchk,zset) (zchk(f) ? (((f) = (l) = (n)), zset((n)->next)) :\ 54 ((n)->next = (f)), ((f) = (n))) 55 #define RV_QUEUE_POP_NZ(f,l,next,zset) ((f)==(l)?\ 56 (zset(f),zset(l)):\ 57 ((f)=(f)->next)) 58 #define RV_STACK_PUSH_N(f,n,next) ((n)->next=(f),(f)=(n)) 59 #define RV_STAC_KPOP_NZ(f,next,zchk) (zchk(f)?0:((f)=(f)->next)) 60 61 #define RV_DLL_INSERT_NPZ(f,l,p,n,next,prev,zchk,zset) \ 62 (zchk(f) ? (((f) = (l) = (n)), zset((n)->next), zset((n)->prev)) :\ 63 zchk(p) ? (zset((n)->prev), (n)->next = (f), (zchk(f) ? (0) : ((f)->prev = (n))), (f) = (n)) :\ 64 ((zchk((p)->next) ? (0) : (((p)->next->prev) = (n))), (n)->next = (p)->next, (n)->prev = (p), (p)->next = (n),\ 65 ((p) == (l) ? (l) = (n) : (0)))) 66 #define RV_DLL_PUSH_BACK_NPZ(f,l,n,next,prev,zchk,zset) RV_DLL_INSERT_NPZ(f,l,l,n,next,prev,zchk,zset) 67 #define RV_DLL_REMOVE_NPZ(f,l,n,next,prev,zchk,zset) (((f)==(n))?\ 68 ((f)=(f)->next, (zchk(f) ? (zset(l)) : zset((f)->prev))):\ 69 ((l)==(n))?\ 70 ((l)=(l)->prev, (zchk(l) ? (zset(f)) : zset((l)->next))):\ 71 ((zchk((n)->next) ? (0) : ((n)->next->prev=(n)->prev)),\ 72 (zchk((n)->prev) ? (0) : ((n)->prev->next=(n)->next)))) 73 74 #define rv_llist_queue_push(f,l,n) RV_QUEUE_PUSH_NZ(f,l,n,next,RV_CHECK_NULL,RV_SET_NULL) 75 #define rv_llist_queue_push_front(f,l,n) RV_QUEUE_PUSH_FRONT_NZ(f,l,n,next,RV_CHECK_NULL,RV_SET_NULL) 76 #define rv_llist_queue_pop(f,l) RV_QUEUE_POP_NZ(f,l,next,RV_SET_NULL) 77 #define rv_llist_stack_push(f,n) RV_STACK_PUSH_N(f,n,next) 78 #define rv_llist_stack_pop(f) RV_STAC_KPOP_NZ(f,next,RV_CHECK_NULL) 79 #define rv_dll_push_back(f,l,n) RV_DLL_PUSH_BACK_NPZ(f,l,n,next,prev,RV_CHECK_NULL,RV_SET_NULL) 80 #define rv_dll_push_front(f,l,n) RV_DLL_PUSH_BACK_NPZ(l,f,n,prev,next,RV_CHECK_NULL,RV_SET_NULL) 81 #define rv_dll_insert(f,l,p,n) RV_DLL_INSERT_NPZ(f,l,p,n,next,prev,RV_CHECK_NULL,RV_SET_NULL) 82 #define rv_dll_remove(f,l,n) RV_DLL_REMOVE_NPZ(f,l,n,next,prev,RV_CHECK_NULL,RV_SET_NULL) 83 84 ////////////////////////////////////////////////////////////////// 85 // Utils 86 87 #define rv_strify(...) #__VA_ARGS__ 88 89 #define rv_align_pow2(x,b) (((x) + (b) - 1)&(~((b) - 1))) 90 91 #define rv_array_size(...) sizeof(__VA_ARGS__) / sizeof(__VA_ARGS__[0]) 92 93 #define rv_abort(exit_code) rv_abort_msg_(__FILE__, __FUNCTION__, __LINE__, exit_code, "(no message)") 94 #define rv_abort_msg(exit_code, ...) rv_abort_msg_(__FILE__, __FUNCTION__, __LINE__, exit_code, __VA_ARGS__) 95 RV_GLOBAL void rv_abort_msg_(const char* file, const char* func, s32 line_no, s32 exit_code, const char* message, ...); 96 97 RV_GLOBAL f64 rv_time(void); 98 99 100 ////////////////////////////////////////////////////////////////// 101 // Memory 102 103 RV_GLOBAL void* rv_mem_reserve(s64 size); 104 RV_GLOBAL void* rv_mem_reserve_large(s64 size); 105 RV_GLOBAL void rv_mem_commit(void* ptr, s64 size); 106 RV_GLOBAL void rv_mem_commit_large(void* ptr, s64 size); 107 RV_GLOBAL void rv_mem_decommit(void* ptr, s64 size); 108 RV_GLOBAL void rv_mem_release(void* ptr, s64 size); 109 110 RV_GLOBAL s64 rv_mem_get_page_size(bool32 is_large); // if is_large = true, it will return 0 if large pages are not supported 111 112 RV_GLOBAL void* rv_mem_set(void* mem, u8 set_byte, s64 size); // returns mem 113 RV_GLOBAL void* rv_mem_zero(void* mem, s64 size); // returns mem 114 RV_GLOBAL void* rv_mem_copy(void* restrict target, const void* restrict source, s64 size); // returns target 115 RV_GLOBAL void* rv_mem_move(void* target, const void* source, s64 size); // returns target 116 117 RV_GLOBAL bool32 rv_mem_eq(const void* a, const void* b, s64 size); 118 119 RV_GLOBAL void* rv_mem_global_alloc_nz_(s64 size, s64 align); 120 RV_GLOBAL void* rv_mem_global_realloc_nz_(void* old_ptr, s64 new_size, s64 align); 121 RV_GLOBAL void rv_mem_global_alloc_free(void* ptr, s64 size); 122 123 // helper macros 124 #define rv_mem_global_alloc_no_zero_align(T, c, align) (T*)rv_mem_global_alloc_nz_(sizeof(T)*c, align) 125 #define rv_mem_global_alloc_no_zero(T, c) rv_mem_global_alloc_no_zero_align(T, c, rv_max(8, rv_alignof(T))) 126 #define rv_mem_global_alloc_align(T, c, align) (T*)rv_mem_zero(rv_mem_global_alloc_no_zero_align(T, c, align), sizeof(T)*c) 127 #define rv_mem_global_alloc(T, c) rv_mem_global_alloc_align(T, c, rv_max(8, rv_alignof(T)))