#if !defined(_UTILS_H_) #define _UTILS_H_ #include "config.h" #include #include #include #include #include #include "controller.capnp.h" #include "xce/errnox.h" #include "xce/types.h" #define CONTAINER_OF(P, T, F) ((T*)(((char*)(P)) - offsetof(T, F))) #define MAKE_JOBID(cluster, apiserver, timestamp, tag, sequence) \ ((((uint64_t)cluster) << CLUSTER_ID_SHIFT) \ | (((uint64_t)apiserver) << APISERVER_ID_SHIFT) \ | (((uint64_t)timestamp) << TIMESTAMP_SHIFT) \ | (((uint64_t)tag) << TAG_SHIFT) | (sequence)) #define EXTRACT_BITS(id, shift, bits) (((id) >> (shift)) & (UMAX_BITS(bits))) #define EXTRACT_ID_TAG(id) EXTRACT_BITS(id, TAG_SHIFT, N_TAG_BITS) #define EXTRACT_ID_CLUSTER(id) \ EXTRACT_BITS(id, CLUSTER_ID_SHIFT, N_CLUSTER_ID_BITS) #define EXTRACT_ID_APISERVER(id) \ EXTRACT_BITS(id, APISERVER_ID_SHIFT, N_APISERVER_ID_BITS) #define EXTRACT_ID_TIMESTAMP(id) \ EXTRACT_BITS(id, TIMESTAMP_SHIFT, N_TIMESTAMP_BITS) #define EXTRACT_ID_SEQUENCE(id) EXTRACT_BITS(id, 0, N_SEQUENCE_BITS) #define EXTRACT_ARRAY_JOB(id) \ ((((id) >> SEQUENCE_HIGH_SHIFT) \ & UMAX_BITS(N_SEQUENCE_BITS - SEQUENCE_HIGH_SHIFT)) \ << SEQUENCE_HIGH_SHIFT) #define EXTRACT_ARRAY_BASEID(id) \ MAKE_JOBID(EXTRACT_ID_CLUSTER(id), EXTRACT_ID_APISERVER(id), \ EXTRACT_ID_TIMESTAMP(id), 0x0, EXTRACT_ARRAY_JOB(id)) #define EXTRACT_ARRAY_IDX(id) EXTRACT_BITS(id, 0, N_ARRAY_IDX_BITS) #define ROUNDUP(v, bits) (((v) + UMAX_BITS(bits)) & ~UMAX_BITS(bits)) #define xce_use(x) (void)(x) #define float_near_zero (0.000001) #define float_equal(a, b) (fabs((a) - (b)) < float_near_zero) #define STR(x) _STR(x) #define _STR(x) #x #define MK_VERSION(ver, commit) ver commit #ifndef FREEUP #define FREEUP(p) \ if ((p) != NULL) { \ free(p); \ (p) = NULL; \ } #endif #define EQUAL_STRING(s1, s2) \ (((s1) == (s2)) \ || (((s1) != NULL) && ((s2) != NULL) && (strcmp((s1), (s2)) == 0))) #define N_EL_ARRAY(arr) (sizeof(arr) / sizeof(arr[0])) #define PTR_STEP(p, delta) ((void*)(((char*)p) + (delta))) /* move the owner ship of pointer from src to dst */ #define MOVE_PTR(dst, src) \ do { \ (dst) = (src); \ (src) = NULL; \ } while (0) #define NULLSTR(p) (((p) == NULL) || (strlen(p) == 0)) #define SET_ERROR(code) \ do { \ set_error((char*)__FILE__, (char*)__func__, __LINE__, (code)); \ } while (0) #define TRACE(...) tlog_debug3(__VA_ARGS__) #define INFO(...) tlog_info(__VA_ARGS__) #define ERROR(...) tlog_error(__VA_ARGS__) #define WARN(...) tlog_warn(__VA_ARGS__) #define PERROR(s) xce_perror(s) typedef struct { char* file; char* func; int line; int code; } ectx_t; extern int parse_argv(char*, char***); extern void free_argv(char**, int); extern int get_myname(char*, size_t); extern int mylog_init(char*, char*, int, int); extern void mylog_fini(void); extern int mylog_setlevel(char*); extern char* verbose_to_loglevel(int); extern void set_error(char*, char*, int, int); extern ectx_t* get_ectx(void); extern int xce_vprintf(const char*, va_list); extern int xce_strerror_r(int, char*, size_t); extern void xce_perror(const char*); extern char* frame_symbol(int); extern int copy_int_list(int**, int*, int); extern int copy_strlist(xce_strlist_t*, xce_strlist_t); extern void free_timewindow_config(xce_timewindow_config_t*); extern xce_timewindow_config_t* dup_timewindow_config(xce_timewindow_config_t*); extern void free_resource_thresholds(xce_res_threshold_t**, int); extern xce_res_threshold_t** dup_resource_thresholds(xce_res_threshold_t**, int); extern void free_resval_with_idx_list(xce_val_with_idx_t***, int); extern void free_strlist(xce_strlist_t*); extern int fmt_jobid_ex(char*, size_t, uint64_t, char*, char*); extern int fmt_jobid(char*, size_t, uint64_t); extern int parse_jobid(uint64_t*, char*); extern uint64_t array_jobid(uint64_t); extern uint64_t array_idx(uint64_t); extern void unblock_sig(int); extern void block_sig(int); extern uint32_t hash4(uint32_t, uint32_t, uint32_t, uint32_t); extern uint32_t hash64(uint64_t); extern uint32_t hash_string(const char*); extern uint32_t hash_block(char*, size_t); #endif