revolver

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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)))