toolkit.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. /*
  2. * category: [misc]
  3. * apply status:
  4. * edit status:
  5. * build status:
  6. * description:
  7. */
  8. #ifndef __TOOLKIT_GLOBAL_H__
  9. #define __TOOLKIT_GLOBAL_H__
  10. #include "config.h"
  11. #include <stdint.h>
  12. #include "errorno.h"
  13. #include "memutil.h"
  14. #ifdef __cplusplus
  15. extern "C" {
  16. #endif
  17. #ifndef _WIN32
  18. #include "unix.h"
  19. #else
  20. #include "win.h"
  21. #endif //NOT _WIN32
  22. /*version component*/
  23. TOOLKIT_API unsigned int toolkit_version(void);
  24. TOOLKIT_API const char* toolkit_version_string(void);
  25. /** errno compoent*/
  26. #define TOOLKIT_ERRNO_MAP(XX) \
  27. XX(E2BIG, "argument list too long") \
  28. XX(EACCES, "permission denied") \
  29. XX(EADDRINUSE, "address already in use") \
  30. XX(EADDRNOTAVAIL, "address not available") \
  31. XX(EAFNOSUPPORT, "address family not supported") \
  32. XX(EAGAIN, "resource temporarily unavailable") \
  33. XX(EAI_ADDRFAMILY, "address family not supported") \
  34. XX(EAI_AGAIN, "temporary failure") \
  35. XX(EAI_BADFLAGS, "bad ai_flags value") \
  36. XX(EAI_BADHINTS, "invalid value for hints") \
  37. XX(EAI_CANCELED, "request canceled") \
  38. XX(EAI_FAIL, "permanent failure") \
  39. XX(EAI_FAMILY, "ai_family not supported") \
  40. XX(EAI_MEMORY, "out of memory") \
  41. XX(EAI_NODATA, "no address") \
  42. XX(EAI_NONAME, "unknown node or service") \
  43. XX(EAI_OVERFLOW, "argument buffer overflow") \
  44. XX(EAI_PROTOCOL, "resolved protocol is unknown") \
  45. XX(EAI_SERVICE, "service not available for socket type") \
  46. XX(EAI_SOCKTYPE, "socket type not supported") \
  47. XX(EALREADY, "connection already in progress") \
  48. XX(EBADF, "bad file descriptor") \
  49. XX(EBUSY, "resource busy or locked") \
  50. XX(ECANCELED, "operation canceled") \
  51. XX(ECHARSET, "invalid Unicode character") \
  52. XX(ECONNABORTED, "software caused connection abort") \
  53. XX(ECONNREFUSED, "connection refused") \
  54. XX(ECONNRESET, "connection reset by peer") \
  55. XX(EDESTADDRREQ, "destination address required") \
  56. XX(EEXIST, "file already exists") \
  57. XX(EFAULT, "bad address in system call argument") \
  58. XX(EFBIG, "file too large") \
  59. XX(EHOSTUNREACH, "host is unreachable") \
  60. XX(EINTR, "interrupted system call") \
  61. XX(EINVAL, "invalid argument") \
  62. XX(EIO, "i/o error") \
  63. XX(EISCONN, "socket is already connected") \
  64. XX(EISDIR, "illegal operation on a directory") \
  65. XX(ELOOP, "too many symbolic links encountered") \
  66. XX(EMFILE, "too many open files") \
  67. XX(EMSGSIZE, "message too long") \
  68. XX(ENAMETOOLONG, "name too long") \
  69. XX(ENETDOWN, "network is down") \
  70. XX(ENETUNREACH, "network is unreachable") \
  71. XX(ENFILE, "file table overflow") \
  72. XX(ENOBUFS, "no buffer space available") \
  73. XX(ENODEV, "no such device") \
  74. XX(ENOENT, "no such file or directory") \
  75. XX(ENOMEM, "not enough memory") \
  76. XX(ENONET, "machine is not on the network") \
  77. XX(ENOPROTOOPT, "protocol not available") \
  78. XX(ENOSPC, "no space left on device") \
  79. XX(ENOSYS, "function not implemented") \
  80. XX(ENOTCONN, "socket is not connected") \
  81. XX(ENOTDIR, "not a directory") \
  82. XX(ENOTEMPTY, "directory not empty") \
  83. XX(ENOTSOCK, "socket operation on non-socket") \
  84. XX(ENOTSUP, "operation not supported on socket") \
  85. XX(EPERM, "operation not permitted") \
  86. XX(EPIPE, "broken pipe") \
  87. XX(EPROTO, "protocol error") \
  88. XX(EPROTONOSUPPORT, "protocol not supported") \
  89. XX(EPROTOTYPE, "protocol wrong type for socket") \
  90. XX(ERANGE, "result too large") \
  91. XX(EROFS, "read-only file system") \
  92. XX(ESHUTDOWN, "cannot send after transport endpoint shutdown") \
  93. XX(ESPIPE, "invalid seek") \
  94. XX(ESRCH, "no such process") \
  95. XX(ETIMEDOUT, "connection timed out") \
  96. XX(ETXTBSY, "text file is busy") \
  97. XX(EXDEV, "cross-device link not permitted") \
  98. XX(UNKNOWN, "unknown error") \
  99. XX(EOF, "end of file") \
  100. XX(ENXIO, "no such device or address") \
  101. XX(EMLINK, "too many links") \
  102. XX(EHOSTDOWN, "host is down") \
  103. XX(EREMOTEIO, "remote I/O error") \
  104. XX(ENOTTY, "inappropriate ioctl for device") \
  105. XX(EFTYPE, "inappropriate file type or format") \
  106. XX(EILSEQ, "illegal byte sequence") \
  107. typedef enum {
  108. #define XX(code, _) TOOLKIT_ ## code = TOOLKIT__ ## code,
  109. TOOLKIT_ERRNO_MAP(XX)
  110. #undef XX
  111. TOOLKIT_ERRNO_MAX = TOOLKIT__EOF - 1
  112. } toolkit_errno_t;
  113. # define TOOLKIT_PRIORITY_LOW 19
  114. # define TOOLKIT_PRIORITY_BELOW_NORMAL 10
  115. # define TOOLKIT_PRIORITY_NORMAL 0
  116. # define TOOLKIT_PRIORITY_ABOVE_NORMAL -7
  117. # define TOOLKIT_PRIORITY_HIGH -14
  118. # define TOOLKIT_PRIORITY_HIGHEST -20
  119. TOOLKIT_API int toolkit_translate_sys_error(int sys_errno);
  120. TOOLKIT_API const char* toolkit_strerror(int err);
  121. TOOLKIT_API char* toolkit_strerror_r(int err, char* buf, size_t buflen);
  122. TOOLKIT_API const char* toolkit_err_name(int err);
  123. TOOLKIT_API char* toolkit_err_name_r(int err, char* buf, size_t buflen);
  124. TOOLKIT_API void toolkit_once(toolkit_once_t* guard, void (*callback)(void));
  125. TOOLKIT_API int toolkit_mutex_init(toolkit_mutex_t* handle);
  126. TOOLKIT_API int toolkit_mutex_init_recursive(toolkit_mutex_t* handle);
  127. TOOLKIT_API void toolkit_mutex_destroy(toolkit_mutex_t* handle);
  128. TOOLKIT_API void toolkit_mutex_lock(toolkit_mutex_t* handle);
  129. TOOLKIT_API int toolkit_mutex_trylock(toolkit_mutex_t* handle);
  130. TOOLKIT_API void toolkit_mutex_unlock(toolkit_mutex_t* handle);
  131. TOOLKIT_API int toolkit_rwlock_init(toolkit_rwlock_t* rwlock);
  132. TOOLKIT_API void toolkit_rwlock_destroy(toolkit_rwlock_t* rwlock);
  133. TOOLKIT_API void toolkit_rwlock_rdlock(toolkit_rwlock_t* rwlock);
  134. TOOLKIT_API int toolkit_rwlock_tryrdlock(toolkit_rwlock_t* rwlock);
  135. TOOLKIT_API void toolkit_rwlock_rdunlock(toolkit_rwlock_t* rwlock);
  136. TOOLKIT_API void toolkit_rwlock_wrlock(toolkit_rwlock_t* rwlock);
  137. TOOLKIT_API int toolkit_rwlock_trywrlock(toolkit_rwlock_t* rwlock);
  138. TOOLKIT_API void toolkit_rwlock_wrunlock(toolkit_rwlock_t* rwlock);
  139. TOOLKIT_API int toolkit_sem_init(toolkit_sem_t* sem, unsigned int value);
  140. TOOLKIT_API void toolkit_sem_destroy(toolkit_sem_t* sem);
  141. TOOLKIT_API void toolkit_sem_post(toolkit_sem_t* sem);
  142. TOOLKIT_API void toolkit_sem_wait(toolkit_sem_t* sem);
  143. TOOLKIT_API int toolkit_sem_trywait(toolkit_sem_t* sem);
  144. TOOLKIT_API int toolkit_cond_init(toolkit_cond_t* cond);
  145. TOOLKIT_API void toolkit_cond_destroy(toolkit_cond_t* cond);
  146. TOOLKIT_API void toolkit_cond_signal(toolkit_cond_t* cond);
  147. TOOLKIT_API void toolkit_cond_broadcast(toolkit_cond_t* cond);
  148. TOOLKIT_API int toolkit_barrier_init(toolkit_barrier_t* barrier, unsigned int count);
  149. TOOLKIT_API void toolkit_barrier_destroy(toolkit_barrier_t* barrier);
  150. TOOLKIT_API int toolkit_barrier_wait(toolkit_barrier_t* barrier);
  151. TOOLKIT_API void toolkit_cond_wait(toolkit_cond_t* cond, toolkit_mutex_t* mutex);
  152. TOOLKIT_API int toolkit_cond_timedwait(toolkit_cond_t* cond, toolkit_mutex_t* mutex, uint64_t timeout);
  153. typedef struct tk_process_s tk_process_t;
  154. typedef struct tk_process_option_s tk_process_option_t;
  155. typedef void (*tk_exit_cb)(tk_process_t*, int64_t);
  156. struct tk_process_s {
  157. int pid;
  158. HANDLE handle;
  159. };
  160. struct tk_process_option_s {
  161. tk_exit_cb exit_cb;
  162. const char* file;
  163. char* params;
  164. uint32_t flags;
  165. };
  166. TOOLKIT_API int process_init(tk_process_t* proc);
  167. TOOLKIT_API int process_spawn(const tk_process_option_t* option, tk_process_t** proc);
  168. TOOLKIT_API int process_compare(const tk_process_t* proc1, const tk_process_t* proc2);
  169. TOOLKIT_API void process_close(tk_process_t* proc);
  170. TOOLKIT_API int process_exist_or_not(int pid);
  171. TOOLKIT_API int toolkit_key_create(toolkit_key_t* key);
  172. TOOLKIT_API void toolkit_key_delete(toolkit_key_t* key);
  173. TOOLKIT_API void* toolkit_key_get(toolkit_key_t* key);
  174. TOOLKIT_API void toolkit_key_set(toolkit_key_t* key, void* value);
  175. /** thread component*/
  176. typedef struct toolkit_thread_option_s {
  177. unsigned int flags;
  178. size_t stack_size;
  179. } toolkit_thread_option_t;
  180. typedef void (*toolkit_thread_cb)(void* arg);
  181. TOOLKIT_API int toolkit_thread_create(toolkit_thread_t* tid, toolkit_thread_cb entry, void* arg);
  182. TOOLKIT_API int toolkit_thread_create_ex(toolkit_thread_t* tid, const toolkit_thread_option_t* params, toolkit_thread_cb entry, void* arg);
  183. TOOLKIT_API toolkit_thread_t toolkit_thread_self(void);
  184. TOOLKIT_API int toolkit_thread_join(toolkit_thread_t* tid);
  185. TOOLKIT_API int toolkit_thread_equal(const toolkit_thread_t* t1, const toolkit_thread_t* t2);
  186. /** library component*/
  187. TOOLKIT_API int toolkit_dlopen(const char* filename, toolkit_lib_t* lib);
  188. TOOLKIT_API void toolkit_dlclose(toolkit_lib_t* lib);
  189. TOOLKIT_API int toolkit_dlsym(toolkit_lib_t* lib, const char* name, void** ptr);
  190. TOOLKIT_API const char* toolkit_dlerror(const toolkit_lib_t* lib);
  191. /** environment variable component*/
  192. typedef struct toolkit_env_item_s {
  193. char* name;
  194. char* value;
  195. } toolkit_env_item_t;
  196. TOOLKIT_API int toolkit_environ(toolkit_env_item_t** envitems, int* count);
  197. TOOLKIT_API void toolkit_free_environ(toolkit_env_item_t* envitems, int count);
  198. TOOLKIT_API int toolkit_getenv(const char* name, char* buffer, size_t* size);
  199. TOOLKIT_API int toolkit_setenv(const char* name, const char* value);
  200. TOOLKIT_API int toolkit_unsetenv(const char* name);
  201. /** time component*/
  202. /** high resolution time*/
  203. TOOLKIT_API uint64_t toolkit_hrtime();
  204. struct toolkit_cpu_times_s
  205. {
  206. uint64_t user;
  207. uint64_t nice;
  208. uint64_t sys;
  209. uint64_t idle;
  210. uint64_t irq;
  211. };
  212. typedef struct toolkit_cpu_info_s
  213. {
  214. char* model;
  215. int speed;
  216. struct toolkit_cpu_times_s cpu_times;
  217. } toolkit_cpu_info_t;
  218. typedef struct toolkit_interface_address_s
  219. {
  220. char* name;
  221. char phys_addr[6];
  222. int is_internal;
  223. union
  224. {
  225. struct sockaddr_in address4;
  226. struct sockaddr_in6 address6;
  227. } address;
  228. union
  229. {
  230. struct sockaddr_in netmask4;
  231. struct sockaddr_in6 netmask6;
  232. } netmask;
  233. } toolkit_interface_address_t;
  234. TOOLKIT_API int toolkit_cpu_info(toolkit_cpu_info_t** cpu_infos, int* count);
  235. TOOLKIT_API void toolkit_free_cpu_info(toolkit_cpu_info_t* cpu_infos, int count);
  236. TOOLKIT_API int toolkit_interface_addresses(toolkit_interface_address_t** addresses, int* count);
  237. TOOLKIT_API void toolkit_free_interface_addresses(toolkit_interface_address_t* addresses, int count);
  238. TOOLKIT_API int toolkit_ip4_name(const struct sockaddr_in* src, char* dst, size_t size);
  239. TOOLKIT_API int toolkit_ip6_name(const struct sockaddr_in6* src, char* dst, size_t size);
  240. TOOLKIT_API int toolkit_inet_ntop(int af, const void* src, char* dst, size_t size);
  241. TOOLKIT_API int toolkit_inet_pton(int af, const char* src, void* dst);
  242. TOOLKIT_API void toolkit_sleep(int msec);
  243. TOOLKIT_API int toolkit_os_getpriority(toolkit_pid_t pid, int* priority);
  244. TOOLKIT_API int toolkit_os_setpriority(toolkit_pid_t pid, int priority);
  245. #ifdef __cplusplus
  246. } // extern "C" {
  247. #endif
  248. #include "winfit.h"
  249. #endif //__TOOLKIT_GLOBAL_H__