mirror of
https://github.com/djhackersdev/bemanitools.git
synced 2026-09-15 11:55:10 -05:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6a98ce1f59 | ||
|
|
5833197b03 | ||
|
|
7ee9a2e219 |
@@ -100,7 +100,6 @@ include src/main/bstio/Module.mk
|
||||
include src/main/camhook/Module.mk
|
||||
include src/main/cconfig/Module.mk
|
||||
include src/main/config/Module.mk
|
||||
include src/main/core/Module.mk
|
||||
include src/main/d3d9-util/Module.mk
|
||||
include src/main/d3d9exhook/Module.mk
|
||||
include src/main/ddrhook-util/Module.mk
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
#ifndef BEMANITOOLS_API_THREAD_H
|
||||
#define BEMANITOOLS_API_THREAD_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __GNUC__
|
||||
/* Bemanitools is compiled with GCC (MinGW, specifically) as of version 5 */
|
||||
#define LOG_CHECK_FMT __attribute__((format(printf, 2, 3)))
|
||||
#else
|
||||
/* Compile it out for MSVC plebs */
|
||||
#define LOG_CHECK_FMT
|
||||
#endif
|
||||
|
||||
/* An AVS-style logger function. Comes in four flavors: misc, info, warning,
|
||||
and fatal, with increasing severity. Fatal loggers do not return, they
|
||||
abort the running process after writing their message to the log.
|
||||
|
||||
"module" is an arbitrary short string identifying the source of the log
|
||||
message. The name of the calling DLL is a good default choice for this
|
||||
string, although you might want to identify a module within your DLL here
|
||||
instead.
|
||||
|
||||
"fmt" is a printf-style format string. Depending on the context in which
|
||||
your DLL is running you might end up calling a logger function exported
|
||||
from libavs, which has its own printf implementation (including a number of
|
||||
proprietary extensions), so don't use any overly exotic formats. */
|
||||
|
||||
typedef void (*btapi_log_formatter_t)(const char *module, const char *fmt, ...)
|
||||
LOG_CHECK_FMT;
|
||||
|
||||
#endif
|
||||
@@ -1,20 +0,0 @@
|
||||
#ifndef BEMANITOOLS_API_THREAD_H
|
||||
#define BEMANITOOLS_API_THREAD_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/* An API for spawning threads. This API is defined by libavs, although
|
||||
Bemanitools itself may supply compatible implementations of these functions
|
||||
to your DLL, depending on the context in which it runs.
|
||||
|
||||
NOTE: You may only use the logging functions from a thread where Bemanitools
|
||||
calls you, or a thread that you create using this API. Failure to observe
|
||||
this restriction will cause the process to crash. This is a limitation of
|
||||
libavs itself, not Bemanitools. */
|
||||
|
||||
typedef int (*btapi_thread_create_t)(
|
||||
int (*proc)(void *), void *ctx, uint32_t stack_sz, unsigned int priority);
|
||||
typedef void (*btapi_thread_join_t)(int thread_id, int *result);
|
||||
typedef void (*btapi_thread_destroy_t)(int thread_id);
|
||||
|
||||
#endif
|
||||
@@ -220,9 +220,6 @@ void property_file_write(struct property *prop, const char *path);
|
||||
int property_set_flag(struct property *prop, int flags, int mask);
|
||||
void property_destroy(struct property *prop);
|
||||
|
||||
avs_error property_get_error(struct property *prop);
|
||||
void property_clear_error(struct property *prop);
|
||||
|
||||
int property_psmap_import(
|
||||
struct property *prop,
|
||||
struct property_node *root,
|
||||
|
||||
@@ -25,8 +25,6 @@ EXPORTS
|
||||
property_destroy
|
||||
property_file_write
|
||||
property_insert_read
|
||||
property_clear_error
|
||||
property_get_error
|
||||
property_mem_write
|
||||
property_read_query_memsize
|
||||
property_search
|
||||
|
||||
@@ -28,8 +28,6 @@ EXPORTS
|
||||
property_destroy
|
||||
property_file_write
|
||||
property_insert_read
|
||||
property_clear_error
|
||||
property_get_error
|
||||
property_mem_write
|
||||
property_read_query_memsize
|
||||
property_search
|
||||
|
||||
@@ -26,8 +26,6 @@ EXPORTS
|
||||
property_desc_to_buffer @246 NONAME
|
||||
property_destroy @247 NONAME
|
||||
property_insert_read @255 NONAME
|
||||
property_clear_error @573 NONAME
|
||||
property_get_error @573 NONAME
|
||||
property_node_create @266 NONAME
|
||||
property_node_datasize @267 NONAME
|
||||
property_node_name @274 NONAME
|
||||
|
||||
@@ -25,8 +25,6 @@ EXPORTS
|
||||
property_desc_to_buffer @201 NONAME
|
||||
property_destroy @264 NONAME
|
||||
property_insert_read @23 NONAME
|
||||
property_clear_error @573 NONAME
|
||||
property_get_error @573 NONAME
|
||||
property_node_create @316 NONAME
|
||||
property_node_datasize @249 NONAME
|
||||
property_node_name @255 NONAME
|
||||
|
||||
@@ -25,8 +25,6 @@ EXPORTS
|
||||
property_desc_to_buffer @201 NONAME == XC058ba50000cd
|
||||
property_destroy @264 NONAME == XC058ba500010f
|
||||
property_insert_read @23 NONAME == XC058ba5000016
|
||||
property_clear_error @573 NONAME
|
||||
property_get_error @573 NONAME
|
||||
property_node_create @316 NONAME == XC058ba5000143
|
||||
property_node_datasize @249 NONAME == XC058ba5000100
|
||||
property_node_name @255 NONAME == XC058ba5000106
|
||||
|
||||
@@ -24,8 +24,6 @@ EXPORTS
|
||||
property_desc_to_buffer @131 NONAME
|
||||
property_destroy @130 NONAME
|
||||
property_insert_read @133 NONAME
|
||||
property_clear_error @573 NONAME
|
||||
property_get_error @573 NONAME
|
||||
property_node_name @573 NONAME ==
|
||||
property_node_read @573 NONAME ==
|
||||
property_node_remove @148 NONAME
|
||||
|
||||
@@ -26,8 +26,6 @@ EXPORTS
|
||||
property_desc_to_buffer @129 NONAME
|
||||
property_destroy @128 NONAME
|
||||
property_insert_read @131 NONAME
|
||||
property_clear_error @573 NONAME
|
||||
property_get_error @573 NONAME
|
||||
property_node_create @145 NONAME
|
||||
property_node_name @150 NONAME
|
||||
property_node_read @154 NONAME == XCd229cc0000f3
|
||||
|
||||
@@ -19,8 +19,6 @@ EXPORTS
|
||||
property_destroy @125 NONAME
|
||||
property_desc_to_buffer @126 NONAME
|
||||
property_insert_read @128 NONAME
|
||||
property_clear_error @573 NONAME
|
||||
property_get_error @573 NONAME
|
||||
property_search @141 NONAME
|
||||
property_node_create @142 NONAME
|
||||
property_node_name @147 NONAME == XCnbrep7000092
|
||||
|
||||
@@ -19,8 +19,6 @@ EXPORTS
|
||||
property_destroy @146 NONAME
|
||||
property_desc_to_buffer @147 NONAME
|
||||
property_insert_read @149 NONAME
|
||||
property_clear_error @158 NONAME == XCnbrep700009d
|
||||
property_get_error @159 NONAME == XCnbrep700009e
|
||||
property_search @162 NONAME
|
||||
property_node_create @163 NONAME
|
||||
property_node_name @168 NONAME == XCnbrep70000a7
|
||||
|
||||
@@ -21,8 +21,6 @@ EXPORTS
|
||||
property_destroy @146 NONAME
|
||||
property_desc_to_buffer @147 NONAME
|
||||
property_insert_read @149 NONAME
|
||||
property_clear_error @158 NONAME == XCgsqzn000009d
|
||||
property_get_error @159 NONAME == XCgsqzn000009e
|
||||
property_search @162 NONAME
|
||||
property_node_create @163 NONAME
|
||||
property_node_name @168 NONAME == XCgsqzn00000a7
|
||||
|
||||
@@ -25,8 +25,6 @@ EXPORTS
|
||||
property_destroy
|
||||
property_file_write
|
||||
property_insert_read
|
||||
property_clear_error
|
||||
property_get_error
|
||||
property_mem_write
|
||||
property_read_query_memsize
|
||||
property_search
|
||||
|
||||
@@ -26,8 +26,6 @@ EXPORTS
|
||||
property_desc_to_buffer @129 NONAME
|
||||
property_destroy @128 NONAME
|
||||
property_insert_read @131 NONAME
|
||||
property_clear_error @573 NONAME
|
||||
property_get_error @573 NONAME
|
||||
property_node_create @145 NONAME
|
||||
property_node_name @150 NONAME
|
||||
property_node_read @154 NONAME == XCd229cc0000f3
|
||||
|
||||
@@ -26,8 +26,6 @@ EXPORTS
|
||||
property_desc_to_buffer @129 NONAME
|
||||
property_destroy @128 NONAME
|
||||
property_insert_read @131 NONAME
|
||||
property_clear_error @573 NONAME
|
||||
property_get_error @573 NONAME
|
||||
property_node_create @145 NONAME
|
||||
property_node_name @573 NONAME ==
|
||||
property_node_read @573 NONAME ==
|
||||
|
||||
@@ -19,8 +19,6 @@ EXPORTS
|
||||
property_destroy @125 NONAME
|
||||
property_desc_to_buffer @126 NONAME
|
||||
property_insert_read @128 NONAME
|
||||
property_clear_error @573 NONAME
|
||||
property_get_error @573 NONAME
|
||||
property_search @141 NONAME
|
||||
property_node_create @142 NONAME
|
||||
property_node_name @147 NONAME == XCnbrep7000092
|
||||
|
||||
@@ -19,14 +19,12 @@ EXPORTS
|
||||
property_destroy @146 NONAME
|
||||
property_desc_to_buffer @147 NONAME
|
||||
property_insert_read @149 NONAME
|
||||
property_clear_error @158 NONAME == XCnbrep700009d
|
||||
property_get_error @159 NONAME == XCnbrep700009e
|
||||
property_search @162 NONAME
|
||||
property_node_create @163 NONAME
|
||||
property_node_name @168 NONAME == XCnbrep70000a7
|
||||
property_node_remove @164 NONAME
|
||||
property_node_type @169 NONAME == XCnbrep70000a8
|
||||
property_node_clone @165 NONAME == XCnbrep70000a4
|
||||
property_node_clone @165 NONAME
|
||||
property_node_traversal @167 NONAME
|
||||
property_node_refdata @166 NONAME == XCnbrep70000a5
|
||||
property_node_datasize @171 NONAME == XCnbrep70000aa
|
||||
|
||||
@@ -21,8 +21,6 @@ EXPORTS
|
||||
property_destroy @146 NONAME
|
||||
property_desc_to_buffer @147 NONAME
|
||||
property_insert_read @149 NONAME
|
||||
property_clear_error @158 NONAME == XCgsqzn000009d
|
||||
property_get_error @159 NONAME == XCgsqzn000009e
|
||||
property_search @162 NONAME
|
||||
property_node_create @163 NONAME
|
||||
property_node_name @168 NONAME == XCgsqzn00000a7
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
libs += aciodrv-proc
|
||||
|
||||
libs_aciodrv-proc := \
|
||||
core \
|
||||
|
||||
src_aciodrv-proc := \
|
||||
panb.c \
|
||||
|
||||
@@ -5,9 +5,8 @@
|
||||
#include "aciodrv/device.h"
|
||||
#include "aciodrv/panb.h"
|
||||
|
||||
#include "core/thread.h"
|
||||
|
||||
#include "core/log.h"
|
||||
#include "util/log.h"
|
||||
#include "util/thread.h"
|
||||
|
||||
static int auto_poll_proc(void *auto_poll_param);
|
||||
static int auto_poll_threadid;
|
||||
@@ -51,7 +50,7 @@ bool aciodrv_proc_panb_init(struct aciodrv_device_ctx *device)
|
||||
InitializeCriticalSection(&keypair_lock);
|
||||
InitializeCriticalSection(&auto_poll_stop_lock);
|
||||
auto_poll_threadid =
|
||||
core_thread_create(auto_poll_proc, (void *) device, 0x4000, 0);
|
||||
thread_create(auto_poll_proc, (void *) device, 0x4000, 0);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -81,8 +80,8 @@ void aciodrv_proc_panb_fini(struct aciodrv_device_ctx *device)
|
||||
auto_poll_stop = true;
|
||||
LeaveCriticalSection(&auto_poll_stop_lock);
|
||||
|
||||
core_thread_join(auto_poll_threadid, NULL);
|
||||
core_thread_destroy(auto_poll_threadid);
|
||||
thread_join(auto_poll_threadid, NULL);
|
||||
thread_destroy(auto_poll_threadid);
|
||||
|
||||
DeleteCriticalSection(&keypair_lock);
|
||||
DeleteCriticalSection(&auto_poll_stop_lock);
|
||||
|
||||
@@ -7,9 +7,8 @@
|
||||
|
||||
#include "aciodrv/port.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "util/hex.h"
|
||||
#include "util/log.h"
|
||||
#include "util/mem.h"
|
||||
|
||||
/* Enable to dump all data to the logger */
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include "aciodrv/device.h"
|
||||
|
||||
#include "core/log.h"
|
||||
#include "util/log.h"
|
||||
|
||||
bool aciodrv_h44b_init(struct aciodrv_device_ctx *device, uint8_t node_id)
|
||||
{
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include "aciodrv/device.h"
|
||||
#include "aciodrv/icca.h"
|
||||
|
||||
#include "core/log.h"
|
||||
#include "util/log.h"
|
||||
|
||||
static bool aciodrv_icca_queue_loop_start(
|
||||
struct aciodrv_device_ctx *device, uint8_t node_id)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
#include "aciodrv/device.h"
|
||||
|
||||
#include "core/log.h"
|
||||
#include "util/log.h"
|
||||
|
||||
static bool
|
||||
aciodrv_kfca_watchdog_start(struct aciodrv_device_ctx *device, uint8_t node_id)
|
||||
|
||||
@@ -5,7 +5,8 @@
|
||||
#include "aciodrv/device.h"
|
||||
#include "aciodrv/panb.h"
|
||||
|
||||
#include "core/log.h"
|
||||
#include "util/log.h"
|
||||
#include "util/thread.h"
|
||||
|
||||
bool aciodrv_panb_start_auto_input(
|
||||
struct aciodrv_device_ctx *device, uint8_t node_id, uint8_t node_count)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#include "core/log.h"
|
||||
#include "util/log.h"
|
||||
|
||||
HANDLE aciodrv_port_open(const char *port_path, int baud)
|
||||
{
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
#include "aciodrv/device.h"
|
||||
|
||||
#include "core/log.h"
|
||||
#include "util/log.h"
|
||||
|
||||
static bool aciodrv_rvol_change_expand_mode(
|
||||
struct aciodrv_device_ctx *device, uint8_t node_id, uint8_t mode)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include "acioemu/addr.h"
|
||||
#include "acioemu/emu.h"
|
||||
|
||||
#include "core/log.h"
|
||||
#include "util/log.h"
|
||||
|
||||
void ac_io_emu_cmd_assign_addrs(
|
||||
struct ac_io_emu *emu, const struct ac_io_message *req, uint8_t node_count)
|
||||
|
||||
@@ -14,10 +14,9 @@
|
||||
#include "acioemu/emu.h"
|
||||
#include "acioemu/pipe.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "hook/iohook.h"
|
||||
|
||||
#include "util/log.h"
|
||||
#include "util/str.h"
|
||||
|
||||
static HRESULT ac_io_emu_open(struct ac_io_emu *emu, struct irp *irp);
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include "acioemu/emu.h"
|
||||
#include "acioemu/hdxs.h"
|
||||
|
||||
#include "core/log.h"
|
||||
#include "util/log.h"
|
||||
|
||||
static void ac_io_emu_hdxs_cmd_send_version(
|
||||
struct ac_io_emu_hdxs *hdxs, const struct ac_io_message *req);
|
||||
|
||||
@@ -7,10 +7,9 @@
|
||||
|
||||
#include "acio/acio.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "util/iobuf.h"
|
||||
#include "util/list.h"
|
||||
#include "util/log.h"
|
||||
|
||||
/* This uses the USB convention where OUT and IN are from the host's (game's)
|
||||
perspective. So an OUT transaction comes in to us and vice versa.
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
dlls += aciomgr
|
||||
|
||||
libs_aciomgr := \
|
||||
core \
|
||||
aciodrv \
|
||||
util \
|
||||
|
||||
|
||||
@@ -5,15 +5,14 @@
|
||||
#include <stdatomic.h>
|
||||
|
||||
#include "aciomgr/manager-init.h"
|
||||
|
||||
#include "aciomgr/manager.h"
|
||||
|
||||
#include "acio/acio.h"
|
||||
|
||||
#include "aciodrv/device.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "util/array.h"
|
||||
#include "util/log.h"
|
||||
|
||||
#define MAX_PORT_PATH_LENGTH 256
|
||||
|
||||
@@ -91,7 +90,7 @@ void aciomgr_set_loggers(
|
||||
log_formatter_t warning,
|
||||
log_formatter_t fatal)
|
||||
{
|
||||
core_log_impl_set(misc, warning, info, fatal);
|
||||
log_to_external(misc, info, warning, fatal);
|
||||
}
|
||||
|
||||
struct aciomgr_port_dispatcher *aciomgr_port_init(const char *path, int baud)
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
exes += aciotest
|
||||
|
||||
libs_aciotest := \
|
||||
core \
|
||||
bio2drv \
|
||||
aciodrv \
|
||||
aciodrv-proc \
|
||||
|
||||
@@ -15,14 +15,7 @@
|
||||
#include "aciotest/panb.h"
|
||||
#include "aciotest/rvol.h"
|
||||
|
||||
#include "core/log-bt-ext.h"
|
||||
#include "core/log-bt.h"
|
||||
#include "core/log.h"
|
||||
#include "core/thread-crt-ext.h"
|
||||
#include "core/thread-crt.h"
|
||||
#include "core/thread.h"
|
||||
|
||||
#include "core/log.h"
|
||||
#include "util/log.h"
|
||||
|
||||
static uint8_t aciotest_cnt = 0;
|
||||
static uint8_t bi2a_mode = 255;
|
||||
@@ -119,10 +112,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
core_thread_crt_ext_impl_set();
|
||||
core_log_bt_ext_impl_set();
|
||||
|
||||
core_log_bt_ext_init_with_stdout();
|
||||
log_to_writer(log_writer_stdout, NULL);
|
||||
|
||||
struct aciodrv_device_ctx *device =
|
||||
aciodrv_device_open_path(argv[1], atoi(argv[2]));
|
||||
|
||||
@@ -10,14 +10,13 @@
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "asio/asio-reghook.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "hook/com-proxy.h"
|
||||
#include "hook/table.h"
|
||||
|
||||
#include "asio/asio-reghook.h"
|
||||
|
||||
#include "util/defs.h"
|
||||
#include "util/log.h"
|
||||
#include "util/str.h"
|
||||
#include "util/time.h"
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#include "cconfig/cconfig-util.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "asio/config-asio.h"
|
||||
|
||||
#include "util/log.h"
|
||||
|
||||
#define ASIOHOOK_CONFIG_IO_FORCE_ASIO_KEY "asio.force_asio"
|
||||
#define ASIOHOOK_CONFIG_IO_FORCE_WASAPI_KEY "asio.force_wasapi"
|
||||
#define ASIOHOOK_CONFIG_IO_ASIO_DEVICE_NAME_KEY "asio.device_name"
|
||||
|
||||
@@ -3,5 +3,4 @@ libs += avs-util
|
||||
libs_avs-util := \
|
||||
|
||||
src_avs-util := \
|
||||
core-interop.c \
|
||||
error.c \
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
#include "core/log.h"
|
||||
#include "core/thread.h"
|
||||
|
||||
#include "imports/avs.h"
|
||||
|
||||
void avs_util_core_interop_log_avs_impl_set()
|
||||
{
|
||||
core_log_impl_set(
|
||||
log_body_misc, log_body_info, log_body_warning, log_body_fatal);
|
||||
}
|
||||
|
||||
void avs_util_core_interop_thread_avs_impl_set()
|
||||
{
|
||||
core_thread_impl_set(
|
||||
avs_thread_create, avs_thread_join, avs_thread_destroy);
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
#ifndef AVS_UTIL_CORE_INTEROP_H
|
||||
#define AVS_UTIL_CORE_INTEROP_H
|
||||
|
||||
void avs_util_core_interop_log_avs_impl_set();
|
||||
void avs_util_core_interop_thread_avs_impl_set();
|
||||
|
||||
#endif
|
||||
@@ -96,14 +96,4 @@ const char *avs_util_error_str(avs_error error)
|
||||
}
|
||||
|
||||
return avs_util_error_unknown;
|
||||
}
|
||||
|
||||
const char *avs_util_property_error_get_and_clear(struct property *prop)
|
||||
{
|
||||
avs_error error;
|
||||
|
||||
error = property_get_error(prop);
|
||||
property_clear_error(prop);
|
||||
|
||||
return avs_util_error_str(error);
|
||||
}
|
||||
@@ -5,6 +5,4 @@
|
||||
|
||||
const char *avs_util_error_str(avs_error error);
|
||||
|
||||
const char *avs_util_property_error_get_and_clear(struct property *prop);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
@@ -1,11 +1,10 @@
|
||||
libs += bio2drv
|
||||
|
||||
libs_bio2drv := \
|
||||
core \
|
||||
aciodrv \
|
||||
aciodrv
|
||||
|
||||
src_bio2drv := \
|
||||
detect.c \
|
||||
config-bio2.c \
|
||||
bi2a-iidx.c \
|
||||
bi2a-sdvx.c \
|
||||
bi2a-sdvx.c
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include "aciodrv/device.h"
|
||||
|
||||
#include "core/log.h"
|
||||
#include "util/log.h"
|
||||
|
||||
// Must be provided on init command. Actual meaning unknown right now.
|
||||
// Not providing this will not initialize the IO correctly resulting
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include "aciodrv/device.h"
|
||||
|
||||
#include "core/log.h"
|
||||
#include "util/log.h"
|
||||
|
||||
static const uint8_t _BIO2DR_BI2A_SDVX_INIT_DATA = 0x3B;
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#include "cconfig/cconfig-util.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "bio2drv/config-bio2.h"
|
||||
|
||||
#include "util/log.h"
|
||||
|
||||
#define BIO2DRV_CONFIG_BIO2_AUTO_KEY "bio2.autodetect"
|
||||
#define BIO2DRV_CONFIG_BIO2_PORT_KEY "bio2.port"
|
||||
#define BIO2DRV_CONFIG_BIO2_BAUD_KEY "bio2.baud"
|
||||
|
||||
@@ -8,11 +8,11 @@
|
||||
|
||||
#include "bio2drv/detect.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "util/log.h"
|
||||
|
||||
DEFINE_GUID(
|
||||
GUID_COM_BUS_ENUMERATOR,
|
||||
0x4D36E978,
|
||||
@@ -142,7 +142,7 @@ void bio2drv_set_loggers(
|
||||
log_formatter_t warning,
|
||||
log_formatter_t fatal)
|
||||
{
|
||||
core_log_impl_set(misc, warning, info, fatal);
|
||||
log_to_external(misc, info, warning, fatal);
|
||||
}
|
||||
|
||||
bool bio2drv_detect(
|
||||
|
||||
@@ -14,8 +14,6 @@
|
||||
#include "acioemu/addr.h"
|
||||
#include "acioemu/emu.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "hook/iohook.h"
|
||||
#include "hooklib/rs232.h"
|
||||
|
||||
@@ -27,6 +25,7 @@
|
||||
#include "util/array.h"
|
||||
#include "util/defs.h"
|
||||
#include "util/iobuf.h"
|
||||
#include "util/log.h"
|
||||
#include "util/str.h"
|
||||
|
||||
static struct array bio2_active_ports;
|
||||
|
||||
@@ -6,14 +6,13 @@
|
||||
#include <cfgmgr32.h>
|
||||
#include <setupapi.h>
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "hook/table.h"
|
||||
|
||||
#include "bio2emu/emu.h"
|
||||
#include "bio2emu/setupapi.h"
|
||||
|
||||
#include "util/defs.h"
|
||||
#include "util/log.h"
|
||||
#include "util/str.h"
|
||||
#include "util/time.h"
|
||||
|
||||
|
||||
@@ -4,8 +4,6 @@ deplibs_bsthook := \
|
||||
avs \
|
||||
|
||||
libs_bsthook := \
|
||||
avs-util \
|
||||
core \
|
||||
acioemu \
|
||||
bstio \
|
||||
hook \
|
||||
|
||||
@@ -19,14 +19,13 @@
|
||||
#include "bsthook/acio.h"
|
||||
#include "bsthook/kfca.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "hook/iohook.h"
|
||||
|
||||
#include "imports/avs.h"
|
||||
|
||||
#include "util/defs.h"
|
||||
#include "util/iobuf.h"
|
||||
#include "util/log.h"
|
||||
#include "util/str.h"
|
||||
|
||||
static struct ac_io_emu ac_io_emu;
|
||||
|
||||
@@ -2,14 +2,9 @@
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "avs-util/core-interop.h"
|
||||
|
||||
#include "bemanitools/bstio.h"
|
||||
#include "bemanitools/eamio.h"
|
||||
|
||||
#include "core/log.h"
|
||||
#include "core/thread.h"
|
||||
|
||||
#include "hook/iohook.h"
|
||||
|
||||
#include "hooklib/app.h"
|
||||
@@ -23,6 +18,7 @@
|
||||
|
||||
#include "util/cmdline.h"
|
||||
#include "util/defs.h"
|
||||
#include "util/log.h"
|
||||
|
||||
static bool my_dll_entry_init(char *sidcode, struct property_node *config);
|
||||
static bool my_dll_entry_main(void);
|
||||
@@ -37,23 +33,19 @@ static bool my_dll_entry_init(char *sidcode, struct property_node *config)
|
||||
|
||||
log_info("Starting up BeatStream IO backend");
|
||||
|
||||
core_log_impl_assign(bst_io_set_loggers);
|
||||
bst_io_set_loggers(
|
||||
log_body_misc, log_body_info, log_body_warning, log_body_fatal);
|
||||
|
||||
ok = bst_io_init(
|
||||
core_thread_create_impl_get(),
|
||||
core_thread_join_impl_get(),
|
||||
core_thread_destroy_impl_get());
|
||||
ok = bst_io_init(avs_thread_create, avs_thread_join, avs_thread_destroy);
|
||||
|
||||
if (!ok) {
|
||||
goto bst_io_fail;
|
||||
}
|
||||
|
||||
core_log_impl_assign(eam_io_set_loggers);
|
||||
eam_io_set_loggers(
|
||||
log_body_misc, log_body_info, log_body_warning, log_body_fatal);
|
||||
|
||||
ok = eam_io_init(
|
||||
core_thread_create_impl_get(),
|
||||
core_thread_join_impl_get(),
|
||||
core_thread_destroy_impl_get());
|
||||
ok = eam_io_init(avs_thread_create, avs_thread_join, avs_thread_destroy);
|
||||
|
||||
if (!ok) {
|
||||
goto eam_io_fail;
|
||||
@@ -99,9 +91,8 @@ BOOL WINAPI DllMain(HMODULE self, DWORD reason, void *ctx)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// Use AVS APIs
|
||||
avs_util_core_interop_thread_avs_impl_set();
|
||||
avs_util_core_interop_log_avs_impl_set();
|
||||
log_to_external(
|
||||
log_body_misc, log_body_info, log_body_warning, log_body_fatal);
|
||||
|
||||
args_recover(&argc, &argv);
|
||||
|
||||
|
||||
@@ -3,8 +3,6 @@
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "hook/com-proxy.h"
|
||||
#include "hook/pe.h"
|
||||
#include "hook/table.h"
|
||||
@@ -12,6 +10,7 @@
|
||||
#include "sdvxhook/gfx.h"
|
||||
|
||||
#include "util/defs.h"
|
||||
#include "util/log.h"
|
||||
|
||||
static HRESULT STDCALL my_CreateDevice(
|
||||
IDirect3D9 *self,
|
||||
|
||||
@@ -7,11 +7,10 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "hook/table.h"
|
||||
|
||||
#include "util/defs.h"
|
||||
#include "util/log.h"
|
||||
#include "util/str.h"
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
@@ -15,14 +15,13 @@
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "camhook/cam.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "hook/com-proxy.h"
|
||||
#include "hook/table.h"
|
||||
|
||||
#include "camhook/cam.h"
|
||||
|
||||
#include "util/defs.h"
|
||||
#include "util/log.h"
|
||||
#include "util/str.h"
|
||||
#include "util/time.h"
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#include "cconfig/cconfig-util.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "camhook/config-cam.h"
|
||||
|
||||
#include "util/log.h"
|
||||
|
||||
#define CAMHOOK_CONFIG_CAM_DISABLE_EMU_KEY "cam.disable_emu"
|
||||
#define CAMHOOK_CONFIG_CAM_DEFAULT_DISABLE_EMU_VALUE false
|
||||
|
||||
|
||||
@@ -6,9 +6,8 @@
|
||||
|
||||
#include "cconfig/cconfig-main.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "util/cmdline.h"
|
||||
#include "util/log.h"
|
||||
|
||||
bool cconfig_main_config_init(
|
||||
struct cconfig *config,
|
||||
@@ -85,7 +84,7 @@ bool cconfig_main_config_init(
|
||||
}
|
||||
|
||||
log_misc("Config state after file loading:");
|
||||
cconfig_util_log(config, core_log_misc_impl_get());
|
||||
cconfig_util_log(config, log_impl_misc);
|
||||
}
|
||||
|
||||
log_misc("Parsing override config parameters from cmd");
|
||||
@@ -97,7 +96,7 @@ bool cconfig_main_config_init(
|
||||
}
|
||||
|
||||
log_misc("Config state after cmd parameter overrides:");
|
||||
cconfig_util_log(config, core_log_misc_impl_get());
|
||||
cconfig_util_log(config, log_impl_misc);
|
||||
|
||||
goto success;
|
||||
|
||||
|
||||
@@ -5,9 +5,8 @@
|
||||
|
||||
#include "cconfig/cconfig-util.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "util/hex.h"
|
||||
#include "util/log.h"
|
||||
#include "util/mem.h"
|
||||
|
||||
bool cconfig_util_get_int(
|
||||
@@ -221,10 +220,10 @@ void cconfig_util_set_data(
|
||||
free(str);
|
||||
}
|
||||
|
||||
void cconfig_util_log(struct cconfig *config, core_log_message_t log_message)
|
||||
void cconfig_util_log(struct cconfig *config, log_formatter_t log_formatter)
|
||||
{
|
||||
for (uint32_t i = 0; i < config->nentries; i++) {
|
||||
log_message(
|
||||
log_formatter(
|
||||
LOG_MODULE,
|
||||
"%s=%s",
|
||||
config->entries[i].key,
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include "cconfig/cconfig.h"
|
||||
|
||||
#include "core/log.h"
|
||||
#include "util/log.h"
|
||||
|
||||
bool cconfig_util_get_int(
|
||||
struct cconfig *config,
|
||||
@@ -57,6 +57,6 @@ void cconfig_util_set_data(
|
||||
size_t len,
|
||||
const char *desc);
|
||||
|
||||
void cconfig_util_log(struct cconfig *config, core_log_message_t log_message);
|
||||
void cconfig_util_log(struct cconfig *config, log_formatter_t log_formatter);
|
||||
|
||||
#endif
|
||||
@@ -2,8 +2,7 @@
|
||||
|
||||
#include "cconfig/cconfig.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "util/log.h"
|
||||
#include "util/mem.h"
|
||||
#include "util/str.h"
|
||||
|
||||
|
||||
@@ -7,9 +7,8 @@
|
||||
|
||||
#include "cconfig/cmd.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "util/hex.h"
|
||||
#include "util/log.h"
|
||||
#include "util/str.h"
|
||||
|
||||
static void
|
||||
|
||||
@@ -6,9 +6,8 @@
|
||||
|
||||
#include "cconfig/conf.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "util/fs.h"
|
||||
#include "util/log.h"
|
||||
#include "util/str.h"
|
||||
|
||||
enum cconfig_conf_error cconfig_conf_load_from_file(
|
||||
|
||||
@@ -3,7 +3,6 @@ rc_config := config.rc
|
||||
cppflags_config := -DUNICODE
|
||||
|
||||
libs_config := \
|
||||
core \
|
||||
eamio \
|
||||
geninput \
|
||||
util \
|
||||
|
||||
@@ -11,14 +11,13 @@
|
||||
#include "config/schema.h"
|
||||
#include "config/usages.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "geninput/hid-mgr.h"
|
||||
#include "geninput/input-config.h"
|
||||
#include "geninput/mapper.h"
|
||||
|
||||
#include "util/array.h"
|
||||
#include "util/defs.h"
|
||||
#include "util/log.h"
|
||||
#include "util/mem.h"
|
||||
#include "util/str.h"
|
||||
|
||||
|
||||
@@ -15,12 +15,11 @@
|
||||
#include "config/schema.h"
|
||||
#include "config/usages.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "geninput/input-config.h"
|
||||
#include "geninput/mapper.h"
|
||||
|
||||
#include "util/defs.h"
|
||||
#include "util/log.h"
|
||||
#include "util/mem.h"
|
||||
#include "util/winres.h"
|
||||
|
||||
|
||||
@@ -13,8 +13,6 @@
|
||||
#include "config/resource.h"
|
||||
#include "config/schema.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "eamio/eam-config.h"
|
||||
|
||||
#include "geninput/hid-mgr.h"
|
||||
@@ -23,6 +21,7 @@
|
||||
|
||||
#include "util/array.h"
|
||||
#include "util/defs.h"
|
||||
#include "util/log.h"
|
||||
#include "util/mem.h"
|
||||
#include "util/str.h"
|
||||
|
||||
|
||||
@@ -6,9 +6,8 @@
|
||||
#include "config/resource.h"
|
||||
#include "config/schema.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "util/defs.h"
|
||||
#include "util/log.h"
|
||||
|
||||
static INT_PTR CALLBACK
|
||||
game_type_dlg_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
|
||||
|
||||
@@ -14,19 +14,14 @@
|
||||
#include "config/spinner.h"
|
||||
#include "config/usages.h"
|
||||
|
||||
#include "core/log-bt.h"
|
||||
#include "core/log-sink-debug.h"
|
||||
#include "core/log.h"
|
||||
#include "core/thread-crt-ext.h"
|
||||
#include "core/thread-crt.h"
|
||||
#include "core/thread.h"
|
||||
|
||||
#include "eamio/eam-config.h"
|
||||
|
||||
#include "geninput/input-config.h"
|
||||
|
||||
#include "util/defs.h"
|
||||
#include "util/log.h"
|
||||
#include "util/str.h"
|
||||
#include "util/thread.h"
|
||||
#include "util/winres.h"
|
||||
|
||||
HPROPSHEETPAGE
|
||||
@@ -66,22 +61,11 @@ int main(int argc, char **argv)
|
||||
wchar_t text[1024];
|
||||
int max_light;
|
||||
size_t i;
|
||||
struct core_log_sink sink;
|
||||
|
||||
inst = GetModuleHandle(NULL);
|
||||
|
||||
core_thread_crt_ext_impl_set();
|
||||
|
||||
core_log_impl_set(
|
||||
core_log_bt_log_misc,
|
||||
core_log_bt_log_info,
|
||||
core_log_bt_log_warning,
|
||||
my_fatal);
|
||||
|
||||
core_log_sink_debug_open(&sink);
|
||||
|
||||
core_log_bt_init(&sink);
|
||||
core_log_bt_level_set(CORE_LOG_BT_LOG_LEVEL_MISC);
|
||||
log_to_writer(log_writer_debug, NULL);
|
||||
log_to_external(log_impl_misc, log_impl_info, log_impl_warning, my_fatal);
|
||||
|
||||
usages_init(inst);
|
||||
|
||||
@@ -112,17 +96,13 @@ int main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
core_log_impl_assign(input_set_loggers);
|
||||
input_init(
|
||||
core_thread_create_impl_get(),
|
||||
core_thread_join_impl_get(),
|
||||
core_thread_destroy_impl_get());
|
||||
input_set_loggers(
|
||||
log_impl_misc, log_impl_info, log_impl_warning, log_impl_fatal);
|
||||
input_init(crt_thread_create, crt_thread_join, crt_thread_destroy);
|
||||
|
||||
core_log_impl_assign(eam_io_set_loggers);
|
||||
eam_io_init(
|
||||
core_thread_create_impl_get(),
|
||||
core_thread_join_impl_get(),
|
||||
core_thread_destroy_impl_get());
|
||||
eam_io_set_loggers(
|
||||
log_impl_misc, log_impl_info, log_impl_warning, log_impl_fatal);
|
||||
eam_io_init(crt_thread_create, crt_thread_join, crt_thread_destroy);
|
||||
eam_io_config_api = eam_io_get_config_api();
|
||||
|
||||
// calculate these and check against the loaded config
|
||||
|
||||
@@ -6,11 +6,10 @@
|
||||
|
||||
#include "config/snap.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "geninput/hid-mgr.h"
|
||||
|
||||
#include "util/defs.h"
|
||||
#include "util/log.h"
|
||||
#include "util/mem.h"
|
||||
|
||||
enum snap_control_heuristic { CONTROL_CENTERING_AXIS, CONTROL_MULTISWITCH };
|
||||
|
||||
@@ -9,9 +9,8 @@
|
||||
|
||||
#include "config/resource.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "util/array.h"
|
||||
#include "util/log.h"
|
||||
#include "util/str.h"
|
||||
#include "util/winres.h"
|
||||
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
libs += core
|
||||
|
||||
libs_core := \
|
||||
util \
|
||||
|
||||
src_core := \
|
||||
log-bt-ext.c \
|
||||
log-bt.c \
|
||||
log-sink-async.c \
|
||||
log-sink-debug.c \
|
||||
log-sink-file.c \
|
||||
log-sink-list.c \
|
||||
log-sink-mutex.c \
|
||||
log-sink-null.c \
|
||||
log-sink-std.c \
|
||||
log.c \
|
||||
thread-crt-ext.c \
|
||||
thread-crt.c \
|
||||
thread.c \
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "core/log-bt.h"
|
||||
#include "core/log-sink-debug.h"
|
||||
#include "core/log-sink-file.h"
|
||||
#include "core/log-sink-list.h"
|
||||
#include "core/log-sink-mutex.h"
|
||||
#include "core/log-sink-std.h"
|
||||
#include "core/log.h"
|
||||
|
||||
void core_log_bt_ext_impl_set()
|
||||
{
|
||||
core_log_impl_set(
|
||||
core_log_bt_log_misc,
|
||||
core_log_bt_log_info,
|
||||
core_log_bt_log_warning,
|
||||
core_log_bt_log_fatal);
|
||||
}
|
||||
|
||||
void core_log_bt_ext_init_with_stdout()
|
||||
{
|
||||
struct core_log_sink sink;
|
||||
|
||||
core_log_sink_std_out_open(true, &sink);
|
||||
core_log_bt_init(&sink);
|
||||
}
|
||||
|
||||
void core_log_bt_ext_init_with_stderr()
|
||||
{
|
||||
struct core_log_sink sink;
|
||||
|
||||
core_log_sink_std_err_open(true, &sink);
|
||||
core_log_bt_init(&sink);
|
||||
}
|
||||
|
||||
void core_log_bt_ext_init_with_debug()
|
||||
{
|
||||
struct core_log_sink sink;
|
||||
|
||||
core_log_sink_debug_open(&sink);
|
||||
core_log_bt_init(&sink);
|
||||
}
|
||||
|
||||
void core_log_bt_ext_init_with_file(
|
||||
const char *path, bool append, bool rotate, uint8_t max_rotations)
|
||||
{
|
||||
struct core_log_sink sink;
|
||||
|
||||
core_log_sink_file_open(path, append, rotate, max_rotations, &sink);
|
||||
core_log_bt_init(&sink);
|
||||
}
|
||||
|
||||
void core_log_bt_ext_init_with_stdout_and_file(
|
||||
const char *path, bool append, bool rotate, uint8_t max_rotations)
|
||||
{
|
||||
struct core_log_sink sinks[2];
|
||||
struct core_log_sink sink_composed;
|
||||
struct core_log_sink sink_mutex;
|
||||
|
||||
core_log_sink_std_out_open(true, &sinks[0]);
|
||||
core_log_sink_file_open(path, append, rotate, max_rotations, &sinks[1]);
|
||||
core_log_sink_list_open(sinks, 2, &sink_composed);
|
||||
|
||||
core_log_sink_mutex_open(&sink_composed, &sink_mutex);
|
||||
|
||||
core_log_bt_init(&sink_mutex);
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
#ifndef CORE_LOG_BT_EXT_H
|
||||
#define CORE_LOG_BT_EXT_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* Set the current thread API implementation to use the bemanitools log
|
||||
* implementation
|
||||
*/
|
||||
void core_log_bt_ext_impl_set();
|
||||
|
||||
/**
|
||||
* Helper to setup the bemanitools log implementation with a stdout sink.
|
||||
*/
|
||||
void core_log_bt_ext_init_with_stdout();
|
||||
|
||||
/**
|
||||
* Helper to setup the bemanitools log implementation with a stderr sink.
|
||||
*/
|
||||
void core_log_bt_ext_init_with_stderr();
|
||||
|
||||
/**
|
||||
* Helper to setup the bemanitools log implementation with a OutputDebugStr
|
||||
* sink.
|
||||
*/
|
||||
void core_log_bt_ext_init_with_debug();
|
||||
|
||||
/**
|
||||
* Helper to setup the bemanitools log implementation with a file sink
|
||||
*
|
||||
* @param path Path to the log file to write the log output to
|
||||
* @param append If true, then append to an existing file, false to overwrite
|
||||
* any existing file
|
||||
* @param rotate If true, rotates an existing log file and creates a new one
|
||||
* for this session
|
||||
* @param max_rotations Max number of rotations for the log files
|
||||
*/
|
||||
void core_log_bt_ext_init_with_file(
|
||||
const char *path, bool append, bool rotate, uint8_t max_rotations);
|
||||
|
||||
/**
|
||||
* Helper to setup the bemanitools log implementation with a stdout and file
|
||||
* sink
|
||||
*
|
||||
* Important: This combined sink is guarded by a mutex to avoid data races on
|
||||
* logging to two different sinks.
|
||||
*
|
||||
* @param path Path to the log file to write the log output to
|
||||
* @param append If true, then append to an existing file, false to overwrite
|
||||
* any existing file
|
||||
* @param rotate If true, rotates an existing log file and creates a new one
|
||||
* for this session
|
||||
* @param max_rotations Max number of rotations for the log files
|
||||
*/
|
||||
void core_log_bt_ext_init_with_stdout_and_file(
|
||||
const char *path, bool append, bool rotate, uint8_t max_rotations);
|
||||
|
||||
#endif
|
||||
@@ -1,129 +0,0 @@
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "core/log-bt.h"
|
||||
#include "core/log-sink.h"
|
||||
#include "core/log.h"
|
||||
|
||||
#include "util/mem.h"
|
||||
#include "util/str.h"
|
||||
|
||||
static enum core_log_bt_log_level _core_log_bt_log_level;
|
||||
static struct core_log_sink *_core_log_bt_sink;
|
||||
|
||||
static void _core_log_bt_vformat_write(
|
||||
enum core_log_bt_log_level level,
|
||||
const char *module,
|
||||
const char *fmt,
|
||||
va_list ap)
|
||||
{
|
||||
static const char chars[] = "FFWIM";
|
||||
|
||||
char timestamp[64];
|
||||
/* 64k so we can log data dumps of rs232 without crashing */
|
||||
char msg[65536];
|
||||
char line[65536];
|
||||
int result;
|
||||
|
||||
time_t curtime;
|
||||
struct tm *tm;
|
||||
|
||||
curtime = 0;
|
||||
tm = NULL;
|
||||
|
||||
curtime = time(NULL);
|
||||
tm = localtime(&curtime);
|
||||
|
||||
strftime(timestamp, sizeof(timestamp), "[%Y/%m/%d %H:%M:%S]", tm);
|
||||
|
||||
str_vformat(msg, sizeof(msg), fmt, ap);
|
||||
|
||||
result = str_format(
|
||||
line,
|
||||
sizeof(line),
|
||||
"%s %c:%s: %s\n",
|
||||
timestamp,
|
||||
chars[level],
|
||||
module,
|
||||
msg);
|
||||
|
||||
_core_log_bt_sink->write(_core_log_bt_sink->ctx, line, result);
|
||||
}
|
||||
|
||||
void core_log_bt_init(const struct core_log_sink *sink)
|
||||
{
|
||||
if (sink == NULL) {
|
||||
abort();
|
||||
}
|
||||
|
||||
_core_log_bt_sink = xmalloc(sizeof(struct core_log_sink));
|
||||
memcpy(_core_log_bt_sink, sink, sizeof(struct core_log_sink));
|
||||
|
||||
_core_log_bt_log_level = CORE_LOG_BT_LOG_LEVEL_OFF;
|
||||
}
|
||||
|
||||
void core_log_bt_level_set(enum core_log_bt_log_level level)
|
||||
{
|
||||
_core_log_bt_log_level = level;
|
||||
}
|
||||
|
||||
void core_log_bt_fini()
|
||||
{
|
||||
log_assert(_core_log_bt_sink);
|
||||
|
||||
_core_log_bt_sink->close(_core_log_bt_sink->ctx);
|
||||
|
||||
free(_core_log_bt_sink);
|
||||
}
|
||||
|
||||
void core_log_bt_log_fatal(const char *module, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
if (_core_log_bt_log_level >= CORE_LOG_BT_LOG_LEVEL_FATAL) {
|
||||
va_start(ap, fmt);
|
||||
_core_log_bt_vformat_write(
|
||||
CORE_LOG_BT_LOG_LEVEL_FATAL, module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
|
||||
void core_log_bt_log_warning(const char *module, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
if (_core_log_bt_log_level >= CORE_LOG_BT_LOG_LEVEL_WARNING) {
|
||||
va_start(ap, fmt);
|
||||
_core_log_bt_vformat_write(
|
||||
CORE_LOG_BT_LOG_LEVEL_WARNING, module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
|
||||
void core_log_bt_log_info(const char *module, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
if (_core_log_bt_log_level >= CORE_LOG_BT_LOG_LEVEL_INFO) {
|
||||
va_start(ap, fmt);
|
||||
_core_log_bt_vformat_write(CORE_LOG_BT_LOG_LEVEL_INFO, module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
|
||||
void core_log_bt_log_misc(const char *module, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
if (_core_log_bt_log_level >= CORE_LOG_BT_LOG_LEVEL_MISC) {
|
||||
va_start(ap, fmt);
|
||||
_core_log_bt_vformat_write(CORE_LOG_BT_LOG_LEVEL_MISC, module, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
|
||||
void core_log_bt_direct_sink_write(const char *chars, size_t nchars)
|
||||
{
|
||||
_core_log_bt_sink->write(_core_log_bt_sink->ctx, chars, nchars);
|
||||
}
|
||||
@@ -1,87 +0,0 @@
|
||||
#ifndef CORE_LOG_BT_H
|
||||
#define CORE_LOG_BT_H
|
||||
|
||||
#include "core/log-sink.h"
|
||||
|
||||
/**
|
||||
* Log API implementation for games/applications without AVS
|
||||
*/
|
||||
|
||||
enum core_log_bt_log_level {
|
||||
CORE_LOG_BT_LOG_LEVEL_OFF = 0,
|
||||
CORE_LOG_BT_LOG_LEVEL_FATAL = 1,
|
||||
CORE_LOG_BT_LOG_LEVEL_WARNING = 2,
|
||||
CORE_LOG_BT_LOG_LEVEL_INFO = 3,
|
||||
CORE_LOG_BT_LOG_LEVEL_MISC = 4,
|
||||
};
|
||||
|
||||
/**
|
||||
* Initialize the logging backend
|
||||
*
|
||||
* This must be called as early as possible in your application to setup
|
||||
* a logging sink according to your needs. Until this is finished, no
|
||||
* log output is available.
|
||||
*
|
||||
* By default, logging is turned off entirely and must be enabled by setting
|
||||
* a desired logging level explicitly.
|
||||
*
|
||||
* @param sink Pointer to a log sink implementation. The caller owns the memory
|
||||
* of this.
|
||||
*/
|
||||
void core_log_bt_init(const struct core_log_sink *sink);
|
||||
|
||||
/**
|
||||
* Set the current logging level. This can be changed at any given time, e.g.
|
||||
* to increase/decrease verbosity.
|
||||
*
|
||||
* @param level The logging level to set.
|
||||
*/
|
||||
void core_log_bt_level_set(enum core_log_bt_log_level level);
|
||||
|
||||
/**
|
||||
* Cleanup the logging backend.
|
||||
*
|
||||
* Ensure to call this on application exit and cleanup.
|
||||
*/
|
||||
void core_log_bt_fini();
|
||||
|
||||
/**
|
||||
* Implementation of the log API.
|
||||
*/
|
||||
void core_log_bt_log_fatal(const char *module, const char *fmt, ...);
|
||||
|
||||
/**
|
||||
* Implementation of the log API.
|
||||
*/
|
||||
void core_log_bt_log_warning(const char *module, const char *fmt, ...);
|
||||
|
||||
/**
|
||||
* Implementation of the log API.
|
||||
*/
|
||||
void core_log_bt_log_info(const char *module, const char *fmt, ...);
|
||||
|
||||
/**
|
||||
* Implementation of the log API.
|
||||
*/
|
||||
void core_log_bt_log_misc(const char *module, const char *fmt, ...);
|
||||
|
||||
/**
|
||||
* Allow AVS to by-pass the core log API/engine.
|
||||
*
|
||||
* This function must only be called by AVS in an appropriate log callback
|
||||
* function that is passed to avs_boot.
|
||||
*
|
||||
* AVS has it's own logging engine and manages aspects such as async logging,
|
||||
* log levels and decorating log messages.
|
||||
*
|
||||
* Thus, proper interoperability only requires the writer/sink part to be shared
|
||||
* with AVS.
|
||||
*
|
||||
* @param chars Buffer with text data to write to the configured sinks. The
|
||||
* buffer might contain several log messages separated by newline
|
||||
* characters.
|
||||
* @param nchars Number of chars to write to the sink.
|
||||
*/
|
||||
void core_log_bt_direct_sink_write(const char *chars, size_t nchars);
|
||||
|
||||
#endif
|
||||
@@ -1,23 +0,0 @@
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/log-sink.h"
|
||||
|
||||
static void
|
||||
_core_log_sink_file_write(void *ctx, const char *chars, size_t nchars)
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
static void _core_log_sink_file_close(void *ctx)
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
void core_log_sink_async_open(struct core_log_sink *sink)
|
||||
{
|
||||
// TODO
|
||||
|
||||
sink->ctx = NULL;
|
||||
sink->write = _core_log_sink_file_write;
|
||||
sink->close = _core_log_sink_file_close;
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
#ifndef CORE_LOG_SINK_ASYNC_H
|
||||
#define CORE_LOG_SINK_ASYNC_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/log-sink.h"
|
||||
|
||||
/**
|
||||
* Open a async log sink
|
||||
*
|
||||
* The sink passes data to log to a separate thread which executes the actual
|
||||
* logging of the data.
|
||||
*
|
||||
* @param sink Pointer to allocated memory that receives the opened sink
|
||||
*/
|
||||
void core_log_sink_async_open(struct core_log_sink *sink);
|
||||
|
||||
#endif
|
||||
@@ -1,23 +0,0 @@
|
||||
#include <debugapi.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/log-sink.h"
|
||||
|
||||
static void
|
||||
_core_log_sink_debug_write(void *ctx, const char *chars, size_t nchars)
|
||||
{
|
||||
OutputDebugStringA(chars);
|
||||
}
|
||||
|
||||
static void _core_log_sink_debug_close(void *ctx)
|
||||
{
|
||||
// noop
|
||||
}
|
||||
|
||||
void core_log_sink_debug_open(struct core_log_sink *sink)
|
||||
{
|
||||
sink->ctx = NULL;
|
||||
sink->write = _core_log_sink_debug_write;
|
||||
sink->close = _core_log_sink_debug_close;
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
#ifndef CORE_LOG_SINK_DEBUG_H
|
||||
#define CORE_LOG_SINK_DEBUG_H
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/log-sink.h"
|
||||
|
||||
/**
|
||||
* Open a log sink that uses OutputDebugStr
|
||||
*
|
||||
* @param sink Pointer to allocated memory that receives the opened sink
|
||||
*/
|
||||
void core_log_sink_debug_open(struct core_log_sink *sink);
|
||||
|
||||
#endif
|
||||
@@ -1,92 +0,0 @@
|
||||
#include <windows.h>
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/log-sink.h"
|
||||
|
||||
#include "util/fs.h"
|
||||
#include "util/str.h"
|
||||
|
||||
static void _core_log_sink_file_rotate(const char *path, uint8_t max_rotations)
|
||||
{
|
||||
uint8_t i;
|
||||
char rotate_file[MAX_PATH];
|
||||
char rotate_file_next[MAX_PATH];
|
||||
char version[8];
|
||||
char version_next[8];
|
||||
|
||||
for (i = max_rotations; i > 0; i++) {
|
||||
str_cpy(rotate_file, sizeof(rotate_file), path);
|
||||
str_cpy(rotate_file_next, sizeof(rotate_file_next), path);
|
||||
|
||||
if (i - 1 != 0) {
|
||||
sprintf(version, ".%d", i);
|
||||
} else {
|
||||
memset(version, 0, sizeof(version));
|
||||
}
|
||||
|
||||
sprintf(version_next, ".%d", i);
|
||||
|
||||
str_cat(rotate_file, sizeof(rotate_file), version);
|
||||
str_cat(rotate_file_next, sizeof(rotate_file_next), version_next);
|
||||
|
||||
if (path_exists(rotate_file)) {
|
||||
CopyFile(rotate_file, rotate_file_next, FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_core_log_sink_file_write(void *ctx, const char *chars, size_t nchars)
|
||||
{
|
||||
FILE *file;
|
||||
|
||||
file = (FILE *) ctx;
|
||||
|
||||
fwrite(chars, 1, nchars, file);
|
||||
}
|
||||
|
||||
static void _core_log_sink_file_close(void *ctx)
|
||||
{
|
||||
FILE *file;
|
||||
|
||||
file = (FILE *) ctx;
|
||||
|
||||
fflush(file);
|
||||
fclose(file);
|
||||
}
|
||||
|
||||
void core_log_sink_file_open(
|
||||
const char *path,
|
||||
bool append,
|
||||
bool rotate,
|
||||
uint8_t max_rotations,
|
||||
struct core_log_sink *sink)
|
||||
{
|
||||
FILE *file;
|
||||
|
||||
if (rotate) {
|
||||
_core_log_sink_file_rotate(path, max_rotations);
|
||||
|
||||
// Appending doesn't matter when file is rotated anyway
|
||||
file = fopen(path, "w+");
|
||||
} else {
|
||||
if (append) {
|
||||
file = fopen(path, "a+");
|
||||
} else {
|
||||
file = fopen(path, "w+");
|
||||
}
|
||||
}
|
||||
|
||||
if (!file) {
|
||||
printf("Cannot open log file: %s", path);
|
||||
abort();
|
||||
}
|
||||
|
||||
sink->ctx = (void *) file;
|
||||
sink->write = _core_log_sink_file_write;
|
||||
sink->close = _core_log_sink_file_close;
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
#ifndef CORE_LOG_SINK_FILE_H
|
||||
#define CORE_LOG_SINK_FILE_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/log-sink.h"
|
||||
|
||||
/**
|
||||
* Open a log sink writing data to a file
|
||||
*
|
||||
* @param path Path to the log file to write the log output to
|
||||
* @param append If true, then append to an existing file, false to overwrite
|
||||
* any existing file
|
||||
* @param rotate If true, rotates an existing log file and creates a new one
|
||||
* for this session
|
||||
* @param max_rotations Max number of rotations for the log files
|
||||
* @param sink Pointer to allocated memory that receives the opened sink
|
||||
*/
|
||||
void core_log_sink_file_open(
|
||||
const char *path,
|
||||
bool append,
|
||||
bool rotate,
|
||||
uint8_t max_rotations,
|
||||
struct core_log_sink *sink);
|
||||
|
||||
#endif
|
||||
@@ -1,66 +0,0 @@
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/log-sink-list.h"
|
||||
#include "core/log-sink.h"
|
||||
|
||||
#include "util/mem.h"
|
||||
|
||||
#define MAX_SINKS 8
|
||||
|
||||
struct core_log_sink_list {
|
||||
struct core_log_sink entries[MAX_SINKS];
|
||||
uint8_t num;
|
||||
};
|
||||
|
||||
static void
|
||||
_core_log_sink_list_write(void *ctx, const char *chars, size_t nchars)
|
||||
{
|
||||
struct core_log_sink_list *sink_list;
|
||||
int i;
|
||||
|
||||
sink_list = (struct core_log_sink_list *) ctx;
|
||||
|
||||
for (i = 0; i < sink_list->num; i++) {
|
||||
sink_list->entries[i].write(sink_list->entries[i].ctx, chars, nchars);
|
||||
}
|
||||
}
|
||||
|
||||
static void _core_log_sink_list_close(void *ctx)
|
||||
{
|
||||
struct core_log_sink_list *sink_list;
|
||||
int i;
|
||||
|
||||
sink_list = (struct core_log_sink_list *) ctx;
|
||||
|
||||
for (i = 0; i < sink_list->num; i++) {
|
||||
sink_list->entries[i].close(sink_list->entries[i].ctx);
|
||||
}
|
||||
|
||||
free(sink_list);
|
||||
}
|
||||
|
||||
void core_log_sink_list_open(
|
||||
const struct core_log_sink *entry, uint8_t num, struct core_log_sink *sink)
|
||||
{
|
||||
struct core_log_sink_list *sink_list;
|
||||
int i;
|
||||
|
||||
if (num > MAX_SINKS) {
|
||||
abort();
|
||||
}
|
||||
|
||||
sink_list = xmalloc(sizeof(struct core_log_sink_list));
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
sink_list->entries[i].ctx = entry[i].ctx;
|
||||
sink_list->entries[i].write = entry[i].write;
|
||||
sink_list->entries[i].close = entry[i].close;
|
||||
}
|
||||
|
||||
sink_list->num = num;
|
||||
|
||||
sink->ctx = (void *) sink_list;
|
||||
sink->write = _core_log_sink_list_write;
|
||||
sink->close = _core_log_sink_list_close;
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
#ifndef CORE_LOG_SINK_LIST_H
|
||||
#define CORE_LOG_SINK_LIST_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/log-sink.h"
|
||||
|
||||
/**
|
||||
* Combine multiple log sinks into a list of sinks.
|
||||
*
|
||||
* Upon invoking a list sink, all sinks contained within the list are
|
||||
* being invoked in the configured order.
|
||||
*
|
||||
* @param entry A pointer to allocated memory with a sequence of opened sinks
|
||||
* that you want to add to the list. Ownership of these sinks
|
||||
* is transferred, i.e. closing the list sink closes its children.
|
||||
* @param num The number of elements in the sequence of opened sinks pointed to.
|
||||
* @param sink Pointer to allocated memory that receives the opened sink
|
||||
*/
|
||||
void core_log_sink_list_open(
|
||||
const struct core_log_sink *entry, uint8_t num, struct core_log_sink *sink);
|
||||
|
||||
#endif
|
||||
@@ -1,53 +0,0 @@
|
||||
#include <windows.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/log-sink.h"
|
||||
|
||||
#include "util/mem.h"
|
||||
|
||||
struct core_log_sink_mutex_ctx {
|
||||
struct core_log_sink *child;
|
||||
HANDLE mutex;
|
||||
};
|
||||
|
||||
static void
|
||||
_core_log_sink_mutex_write(void *ctx_, const char *chars, size_t nchars)
|
||||
{
|
||||
struct core_log_sink_mutex_ctx *ctx;
|
||||
|
||||
ctx = (struct core_log_sink_mutex_ctx *) ctx_;
|
||||
|
||||
WaitForSingleObject(ctx->mutex, INFINITE);
|
||||
|
||||
ctx->child->write(ctx->child->ctx, chars, nchars);
|
||||
|
||||
ReleaseMutex(ctx->mutex);
|
||||
}
|
||||
|
||||
static void _core_log_sink_mutex_close(void *ctx_)
|
||||
{
|
||||
struct core_log_sink_mutex_ctx *ctx;
|
||||
|
||||
ctx = (struct core_log_sink_mutex_ctx *) ctx_;
|
||||
|
||||
CloseHandle(ctx->mutex);
|
||||
|
||||
ctx->child->close(ctx->child->ctx);
|
||||
free(ctx);
|
||||
}
|
||||
|
||||
void core_log_sink_mutex_open(
|
||||
const struct core_log_sink *child_sink, struct core_log_sink *sink)
|
||||
{
|
||||
struct core_log_sink_mutex_ctx *ctx;
|
||||
|
||||
ctx = xmalloc(sizeof(struct core_log_sink_mutex_ctx));
|
||||
|
||||
memcpy(ctx->child, child_sink, sizeof(struct core_log_sink));
|
||||
ctx->mutex = CreateMutex(NULL, FALSE, NULL);
|
||||
|
||||
sink->ctx = ctx;
|
||||
sink->write = _core_log_sink_mutex_write;
|
||||
sink->close = _core_log_sink_mutex_close;
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
#ifndef CORE_LOG_SINK_MUTEX_H
|
||||
#define CORE_LOG_SINK_MUTEX_H
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/log-sink.h"
|
||||
|
||||
/**
|
||||
* Create a sink that surrounds another sink with a mutex.
|
||||
*
|
||||
* Use this to make other sink implementations thread-safe.
|
||||
*
|
||||
* @param child_sink Another opened sink to surround with the mutex. Ownership
|
||||
* of the sink is transferred, i.e. closing the mutex sink
|
||||
* also closes the wrapped child sink.
|
||||
* @param sink Pointer to allocated memory that receives the opened sink
|
||||
*/
|
||||
void core_log_sink_mutex_open(
|
||||
const struct core_log_sink *child_sink, struct core_log_sink *sink);
|
||||
|
||||
#endif
|
||||
@@ -1,21 +0,0 @@
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/log-sink.h"
|
||||
|
||||
static void
|
||||
_core_log_sink_null_write(void *ctx, const char *chars, size_t nchars)
|
||||
{
|
||||
// noop
|
||||
}
|
||||
|
||||
static void _core_log_sink_null_close(void *ctx)
|
||||
{
|
||||
// noop
|
||||
}
|
||||
|
||||
void core_log_sink_null_open(struct core_log_sink *sink)
|
||||
{
|
||||
sink->ctx = NULL;
|
||||
sink->write = _core_log_sink_null_write;
|
||||
sink->close = _core_log_sink_null_close;
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
#ifndef CORE_LOG_SINK_NULL_H
|
||||
#define CORE_LOG_SINK_NULL_H
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/log-sink.h"
|
||||
|
||||
/**
|
||||
* Create a null/dummy sink.
|
||||
*
|
||||
* Use this to disable any logging entirely.
|
||||
*
|
||||
* @param sink Pointer to allocated memory that receives the opened sink
|
||||
*/
|
||||
void core_log_sink_null_open(struct core_log_sink *sink);
|
||||
|
||||
#endif
|
||||
@@ -1,193 +0,0 @@
|
||||
#include <windows.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/log-sink.h"
|
||||
|
||||
#include "util/mem.h"
|
||||
|
||||
struct core_log_sink_std_ctx {
|
||||
HANDLE handle;
|
||||
bool color;
|
||||
};
|
||||
|
||||
static char _core_log_sink_std_determine_color(const char *str)
|
||||
{
|
||||
/* Add some color to make spotting warnings/errors easier.
|
||||
Based on debug output level identifier. */
|
||||
|
||||
/* Avoids colored output on strings like "Windows" */
|
||||
if (str[1] != ':') {
|
||||
return 15;
|
||||
}
|
||||
|
||||
switch (str[0]) {
|
||||
/* green */
|
||||
case 'M':
|
||||
return 10;
|
||||
/* blue */
|
||||
case 'I':
|
||||
return 9;
|
||||
/* yellow */
|
||||
case 'W':
|
||||
return 14;
|
||||
/* red */
|
||||
case 'F':
|
||||
return 12;
|
||||
/* default console color */
|
||||
default:
|
||||
return 15;
|
||||
}
|
||||
}
|
||||
|
||||
static size_t _core_log_sink_std_msg_coloring_len(const char *str)
|
||||
{
|
||||
// Expected format example: "I:boot: my log message"
|
||||
|
||||
const char *ptr;
|
||||
size_t len;
|
||||
int colon_count;
|
||||
|
||||
ptr = str;
|
||||
len = 0;
|
||||
colon_count = 0;
|
||||
|
||||
while (true) {
|
||||
// End of string = invalid log format
|
||||
if (*ptr == '\0') {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (*ptr == ':') {
|
||||
colon_count++;
|
||||
}
|
||||
|
||||
if (colon_count == 2) {
|
||||
// Skip current colon, next char is a space
|
||||
return len + 1;
|
||||
}
|
||||
|
||||
len++;
|
||||
ptr++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
_core_log_sink_std_write(void *ctx_, const char *chars, size_t nchars)
|
||||
{
|
||||
static const size_t timestamp_len = strlen("[----/--/-- --:--:--]");
|
||||
|
||||
struct core_log_sink_std_ctx *ctx;
|
||||
|
||||
char color;
|
||||
size_t color_len;
|
||||
size_t msg_len;
|
||||
const char *msg_start;
|
||||
const char *msg_end;
|
||||
DWORD written;
|
||||
DWORD write_pos;
|
||||
|
||||
ctx = (struct core_log_sink_std_ctx *) ctx_;
|
||||
|
||||
if (ctx->color) {
|
||||
write_pos = 0;
|
||||
|
||||
// Support multiple buffered log messages, e.g. from the AVS logging
|
||||
// engine
|
||||
while (write_pos < nchars) {
|
||||
// Expects the AVS timestamp format
|
||||
msg_start = chars + timestamp_len + 1; // +1 is the space
|
||||
|
||||
color_len = _core_log_sink_std_msg_coloring_len(msg_start);
|
||||
|
||||
// Check if we could detect which part to color, otherwise just
|
||||
// write the whole log message without any coloring logic
|
||||
if (color_len > 0) {
|
||||
color = _core_log_sink_std_determine_color(msg_start);
|
||||
|
||||
// Timestamp
|
||||
WriteConsole(
|
||||
ctx->handle, chars, timestamp_len + 1, &written, NULL);
|
||||
write_pos += written;
|
||||
chars += written;
|
||||
|
||||
// Log level + module colored
|
||||
SetConsoleTextAttribute(ctx->handle, color);
|
||||
WriteConsole(ctx->handle, chars, color_len, &written, NULL);
|
||||
write_pos += written;
|
||||
chars += written;
|
||||
SetConsoleTextAttribute(ctx->handle, 15);
|
||||
|
||||
msg_end = strchr(chars, '\n');
|
||||
|
||||
if (msg_end != NULL) {
|
||||
msg_len = msg_end - chars;
|
||||
|
||||
// Write \n as well
|
||||
msg_len++;
|
||||
|
||||
// Write actual message non colored
|
||||
WriteConsole(ctx->handle, chars, msg_len, &written, NULL);
|
||||
write_pos += written;
|
||||
chars += written;
|
||||
} else {
|
||||
WriteConsole(
|
||||
ctx->handle, chars, nchars - write_pos, &written, NULL);
|
||||
write_pos += written;
|
||||
chars += written;
|
||||
}
|
||||
} else {
|
||||
WriteConsole(
|
||||
ctx->handle,
|
||||
chars + write_pos,
|
||||
nchars - write_pos,
|
||||
&written,
|
||||
NULL);
|
||||
write_pos += written;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
WriteConsole(ctx->handle, chars, nchars, &written, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
static void _core_log_sink_std_close(void *ctx_)
|
||||
{
|
||||
struct core_log_sink_std_ctx *ctx;
|
||||
|
||||
ctx = (struct core_log_sink_std_ctx *) ctx_;
|
||||
|
||||
// Remark: Don't close the ctx->handle, see win API docs
|
||||
|
||||
free(ctx);
|
||||
}
|
||||
|
||||
void core_log_sink_std_out_open(bool color, struct core_log_sink *sink)
|
||||
{
|
||||
struct core_log_sink_std_ctx *ctx;
|
||||
|
||||
ctx = xmalloc(sizeof(struct core_log_sink_std_ctx));
|
||||
|
||||
ctx->handle = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
ctx->color = color;
|
||||
|
||||
sink->ctx = (void *) ctx;
|
||||
sink->write = _core_log_sink_std_write;
|
||||
sink->close = _core_log_sink_std_close;
|
||||
}
|
||||
|
||||
void core_log_sink_std_err_open(bool color, struct core_log_sink *sink)
|
||||
{
|
||||
struct core_log_sink_std_ctx *ctx;
|
||||
|
||||
ctx = xmalloc(sizeof(struct core_log_sink_std_ctx));
|
||||
|
||||
ctx->handle = GetStdHandle(STD_ERROR_HANDLE);
|
||||
ctx->color = color;
|
||||
|
||||
sink->ctx = (void *) ctx;
|
||||
sink->write = _core_log_sink_std_write;
|
||||
sink->close = _core_log_sink_std_close;
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
#ifndef CORE_LOG_SINK_STD_H
|
||||
#define CORE_LOG_SINK_STD_H
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/log-sink.h"
|
||||
|
||||
/**
|
||||
* Create a sink that writes to stdout.
|
||||
*
|
||||
* @param color If true, messages are colored by log level.
|
||||
* @param sink Pointer to allocated memory that receives the opened sink
|
||||
*/
|
||||
void core_log_sink_std_out_open(bool color, struct core_log_sink *sink);
|
||||
|
||||
/**
|
||||
* Create a sink that writes to stderr.
|
||||
*
|
||||
* @param color If true, messages are colored by log level.
|
||||
* @param sink Pointer to allocated memory that receives the opened sink
|
||||
*/
|
||||
void core_log_sink_std_err_open(bool color, struct core_log_sink *sink);
|
||||
|
||||
#endif
|
||||
@@ -1,45 +0,0 @@
|
||||
#ifndef CORE_LOG_SINK_H
|
||||
#define CORE_LOG_SINK_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* Write function for a log sink implementation.
|
||||
*
|
||||
* Write the given data to your target output destination.
|
||||
*
|
||||
* @param ctx Context defined by the implementation when opening the sink.
|
||||
* @param chars Buffer with text data to log. This can contain partial data of
|
||||
* a single log line, a full log line terminated by a newline
|
||||
* character or multiple log lines (each terminated by a newline
|
||||
* character).
|
||||
* @param nchars Number of characters to write.
|
||||
*/
|
||||
typedef void (*core_log_sink_write_t)(
|
||||
void *ctx, const char *chars, size_t nchars);
|
||||
|
||||
/**
|
||||
* Close your log sink and cleanup resources
|
||||
*
|
||||
* Depending on your implementation, you might want to flush any
|
||||
* outstanding/buffered data.
|
||||
*
|
||||
* @param ctx Context defined by the implementation when opening the sink.
|
||||
*/
|
||||
typedef void (*core_log_sink_close_t)(void *ctx);
|
||||
|
||||
/**
|
||||
* Log sink structure.
|
||||
*
|
||||
* This must be set-up and populated when opening your log sink implementation.
|
||||
* The ctx field contains any arbitrary data that you need for your log sink
|
||||
* to operate, e.g. a file handle, additional buffers etc. Make sure these
|
||||
* resources are cleaned up upon closing the sink.
|
||||
*/
|
||||
struct core_log_sink {
|
||||
void *ctx;
|
||||
core_log_sink_write_t write;
|
||||
core_log_sink_close_t close;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,74 +0,0 @@
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
core_log_message_t _core_log_misc_impl;
|
||||
core_log_message_t _core_log_info_impl;
|
||||
core_log_message_t _core_log_warning_impl;
|
||||
core_log_message_t _core_log_fatal_impl;
|
||||
|
||||
void core_log_impl_set(
|
||||
core_log_message_t misc,
|
||||
core_log_message_t info,
|
||||
core_log_message_t warning,
|
||||
core_log_message_t fatal)
|
||||
{
|
||||
if (misc == NULL || info == NULL || warning == NULL || fatal == NULL) {
|
||||
abort();
|
||||
}
|
||||
|
||||
_core_log_misc_impl = misc;
|
||||
_core_log_info_impl = info;
|
||||
_core_log_warning_impl = warning;
|
||||
_core_log_fatal_impl = fatal;
|
||||
}
|
||||
|
||||
void core_log_impl_assign(core_log_impl_set_t impl_set)
|
||||
{
|
||||
if (_core_log_misc_impl == NULL || _core_log_info_impl == NULL ||
|
||||
_core_log_warning_impl == NULL || _core_log_fatal_impl == NULL) {
|
||||
abort();
|
||||
}
|
||||
|
||||
impl_set(
|
||||
_core_log_misc_impl,
|
||||
_core_log_info_impl,
|
||||
_core_log_warning_impl,
|
||||
_core_log_fatal_impl);
|
||||
}
|
||||
|
||||
core_log_message_t core_log_misc_impl_get()
|
||||
{
|
||||
if (_core_log_misc_impl == NULL) {
|
||||
abort();
|
||||
}
|
||||
|
||||
return _core_log_misc_impl;
|
||||
}
|
||||
|
||||
core_log_message_t core_log_info_impl_get()
|
||||
{
|
||||
if (_core_log_info_impl == NULL) {
|
||||
abort();
|
||||
}
|
||||
|
||||
return _core_log_info_impl;
|
||||
}
|
||||
|
||||
core_log_message_t core_log_warning_impl_get()
|
||||
{
|
||||
if (_core_log_warning_impl == NULL) {
|
||||
abort();
|
||||
}
|
||||
|
||||
return _core_log_warning_impl;
|
||||
}
|
||||
|
||||
core_log_message_t core_log_fatal_impl_get()
|
||||
{
|
||||
if (_core_log_fatal_impl == NULL) {
|
||||
abort();
|
||||
}
|
||||
|
||||
return _core_log_fatal_impl;
|
||||
}
|
||||
@@ -1,197 +0,0 @@
|
||||
#ifndef CORE_LOG_H
|
||||
#define CORE_LOG_H
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "util/defs.h"
|
||||
|
||||
/**
|
||||
* The core log API of bemanitools.
|
||||
*
|
||||
* To a large extent, this reflects the AVS logging API and allows for swapping
|
||||
* out the backends with different implementations. Most games should have some
|
||||
* version of the AVS API available while some (legacy) games do not. These
|
||||
* can use a bemanitools private logging implementation by configuring it
|
||||
* in the bootstrapping process.
|
||||
*/
|
||||
|
||||
/* BUILD_MODULE is passed in as a command-line #define by the makefile */
|
||||
|
||||
#ifndef LOG_MODULE
|
||||
#define LOG_MODULE STRINGIFY(BUILD_MODULE)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Log a message on misc level
|
||||
*
|
||||
* Always use this interface in your application which hides the currently
|
||||
* configured implementation.
|
||||
*
|
||||
* The macro is required to make things work with varargs.
|
||||
* The log message is only printed if the log level is set to misc
|
||||
*
|
||||
* @param fmt printf format string
|
||||
* @param ... Additional arguments according to the specified arguments in the
|
||||
* printf format string
|
||||
*/
|
||||
#define log_misc(...) _core_log_misc_impl(LOG_MODULE, __VA_ARGS__)
|
||||
|
||||
/**
|
||||
* Log a message on info level
|
||||
*
|
||||
* Always use this interface in your application which hides the currently
|
||||
* configured implementation.
|
||||
*
|
||||
* The macro is required to make things work with varargs.
|
||||
* The log message is only printed if the log level is set to info or lower
|
||||
*
|
||||
* @param fmt printf format string
|
||||
* @param ... Additional arguments according to the specified arguments in the
|
||||
* printf format string
|
||||
*/
|
||||
#define log_info(...) _core_log_info_impl(LOG_MODULE, __VA_ARGS__)
|
||||
|
||||
/**
|
||||
* Log a message on warning level
|
||||
*
|
||||
* Always use this interface in your application which hides the currently
|
||||
* configured implementation.
|
||||
*
|
||||
* The macro is required to make things work with varargs.
|
||||
* The log message is only printed if the log level is set to warning or lower
|
||||
*
|
||||
* @param fmt printf format string
|
||||
* @param ... Additional arguments according to the specified arguments in the
|
||||
* printf format string
|
||||
*/
|
||||
#define log_warning(...) _core_log_warning_impl(LOG_MODULE, __VA_ARGS__)
|
||||
|
||||
/**
|
||||
* Log a message on fatal level
|
||||
*
|
||||
* Always use this interface in your application which hides the currently
|
||||
* configured implementation.
|
||||
*
|
||||
* The macro is required to make things work with varargs.
|
||||
* The log message is only printed if the log level is set to fatal.
|
||||
*
|
||||
* This call will also terminate the application.
|
||||
*
|
||||
* @param fmt printf format string
|
||||
* @param ... Additional arguments according to the specified arguments in the
|
||||
* printf format string
|
||||
*/
|
||||
#define log_fatal(...) \
|
||||
do { \
|
||||
_core_log_fatal_impl(LOG_MODULE, __VA_ARGS__); \
|
||||
abort(); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
* Log a message and terminate the application if given condition fails
|
||||
*
|
||||
* Always use this interface in your application which hides the currently
|
||||
* configured implementation.
|
||||
*
|
||||
* The macro is required to make things work with varargs.
|
||||
*
|
||||
* @param x Condition to evaluate. If false, the application terminates
|
||||
*/
|
||||
#define log_assert(x) \
|
||||
do { \
|
||||
if (!(x)) { \
|
||||
_core_log_fatal_impl( \
|
||||
"assert", \
|
||||
"%s:%d: function `%s'", \
|
||||
__FILE__, \
|
||||
__LINE__, \
|
||||
__FUNCTION__); \
|
||||
abort(); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
* Log a message in an exception handler
|
||||
*
|
||||
* Only use this function in an exception handler, e.g. for stack traces. It
|
||||
* logs the message on fatal level but does not terminate.
|
||||
*
|
||||
* @param fmt printf format string
|
||||
* @param ... Additional arguments according to the specified arguments in the
|
||||
* printf format string
|
||||
*/
|
||||
#define log_exception_handler(...) \
|
||||
_core_log_fatal_impl("exception", __VA_ARGS__)
|
||||
|
||||
typedef void (*core_log_message_t)(const char *module, const char *fmt, ...);
|
||||
|
||||
typedef void (*core_log_impl_set_t)(
|
||||
core_log_message_t misc,
|
||||
core_log_message_t info,
|
||||
core_log_message_t warning,
|
||||
core_log_message_t fatal);
|
||||
|
||||
/**
|
||||
* Configure the log API implementations
|
||||
*
|
||||
* Advised to do this as early in your application/library module as possible
|
||||
* as calls to the getter functions below will return the currently configured
|
||||
* implementations.
|
||||
*
|
||||
* @param misc Pointer to a function implementing logging on misc level
|
||||
* @param info Pointer to a function implementing logging on info level
|
||||
* @param warning Pointer to a function implementing logging on warning level
|
||||
* @param fatal Pointer to a function implementing logging on fatal level
|
||||
*/
|
||||
void core_log_impl_set(
|
||||
core_log_message_t misc,
|
||||
core_log_message_t info,
|
||||
core_log_message_t warning,
|
||||
core_log_message_t fatal);
|
||||
|
||||
/**
|
||||
* Supporting function to inject/assign the currently set implementation
|
||||
* with the given setter function.
|
||||
*
|
||||
* @param impl_set Setter function to call with the currently configured log
|
||||
* function implementations
|
||||
*/
|
||||
void core_log_impl_assign(core_log_impl_set_t impl_set);
|
||||
|
||||
/**
|
||||
* Get the currently configured implementation of the misc level log function
|
||||
*
|
||||
* @return Pointer to the currently configured implementation of the function
|
||||
*/
|
||||
core_log_message_t core_log_misc_impl_get();
|
||||
|
||||
/**
|
||||
* Get the currently configured implementation of the info level log function
|
||||
*
|
||||
* @return Pointer to the currently configured implementation of the function
|
||||
*/
|
||||
core_log_message_t core_log_info_impl_get();
|
||||
|
||||
/**
|
||||
* Get the currently configured implementation of the warning level log function
|
||||
*
|
||||
* @return Pointer to the currently configured implementation of the function
|
||||
*/
|
||||
core_log_message_t core_log_warning_impl_get();
|
||||
|
||||
/**
|
||||
* Get the currently configured implementation of the fatal level log function
|
||||
*
|
||||
* @return Pointer to the currently configured implementation of the function
|
||||
*/
|
||||
core_log_message_t core_log_fatal_impl_get();
|
||||
|
||||
// Do not use these directly.
|
||||
// These are only here to allow usage in the macros above.
|
||||
extern core_log_message_t _core_log_misc_impl;
|
||||
extern core_log_message_t _core_log_info_impl;
|
||||
extern core_log_message_t _core_log_warning_impl;
|
||||
extern core_log_message_t _core_log_fatal_impl;
|
||||
|
||||
#endif
|
||||
@@ -1,8 +0,0 @@
|
||||
#include "core/thread-crt.h"
|
||||
#include "core/thread.h"
|
||||
|
||||
void core_thread_crt_ext_impl_set()
|
||||
{
|
||||
core_thread_impl_set(
|
||||
core_thread_crt_create, core_thread_crt_join, core_thread_crt_destroy);
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
#ifndef CORE_THREAD_CRT_EXT_H
|
||||
#define CORE_THREAD_CRT_EXT_H
|
||||
|
||||
/**
|
||||
* Set the current thread API implementation to use the C runtime thread API
|
||||
*/
|
||||
void core_thread_crt_ext_impl_set();
|
||||
|
||||
#endif
|
||||
@@ -1,15 +0,0 @@
|
||||
#ifndef CORE_THREAD_CRT_H
|
||||
#define CORE_THREAD_CRT_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* Thread API implementation using the C runtime API
|
||||
*/
|
||||
|
||||
int core_thread_crt_create(
|
||||
int (*proc)(void *), void *ctx, uint32_t stack_sz, unsigned int priority);
|
||||
void core_thread_crt_join(int thread_id, int *result);
|
||||
void core_thread_crt_destroy(int thread_id);
|
||||
|
||||
#endif
|
||||
@@ -1,78 +0,0 @@
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/log.h"
|
||||
#include "core/thread.h"
|
||||
|
||||
core_thread_create_t core_thread_create_impl;
|
||||
core_thread_join_t core_thread_join_impl;
|
||||
core_thread_destroy_t core_thread_destroy_impl;
|
||||
|
||||
int core_thread_create(
|
||||
int (*proc)(void *), void *ctx, uint32_t stack_sz, unsigned int priority)
|
||||
{
|
||||
log_assert(core_thread_create_impl);
|
||||
|
||||
return core_thread_create_impl(proc, ctx, stack_sz, priority);
|
||||
}
|
||||
|
||||
void core_thread_join(int thread_id, int *result)
|
||||
{
|
||||
log_assert(core_thread_join_impl);
|
||||
|
||||
core_thread_join_impl(thread_id, result);
|
||||
}
|
||||
|
||||
void core_thread_destroy(int thread_id)
|
||||
{
|
||||
log_assert(core_thread_destroy_impl);
|
||||
|
||||
core_thread_destroy_impl(thread_id);
|
||||
}
|
||||
|
||||
void core_thread_impl_set(
|
||||
core_thread_create_t create,
|
||||
core_thread_join_t join,
|
||||
core_thread_destroy_t destroy)
|
||||
{
|
||||
if (create == NULL || join == NULL || destroy == NULL) {
|
||||
abort();
|
||||
}
|
||||
|
||||
core_thread_create_impl = create;
|
||||
core_thread_join_impl = join;
|
||||
core_thread_destroy_impl = destroy;
|
||||
}
|
||||
|
||||
void core_thread_impl_assign(core_thread_impl_set_t impl_set)
|
||||
{
|
||||
if (core_thread_create_impl == NULL || core_thread_join_impl == NULL ||
|
||||
core_thread_destroy_impl == NULL) {
|
||||
abort();
|
||||
}
|
||||
|
||||
impl_set(
|
||||
core_thread_create_impl,
|
||||
core_thread_join_impl,
|
||||
core_thread_destroy_impl);
|
||||
}
|
||||
|
||||
core_thread_create_t core_thread_create_impl_get()
|
||||
{
|
||||
log_assert(core_thread_create_impl);
|
||||
|
||||
return core_thread_create_impl;
|
||||
}
|
||||
|
||||
core_thread_join_t core_thread_join_impl_get()
|
||||
{
|
||||
log_assert(core_thread_join_impl);
|
||||
|
||||
return core_thread_join_impl;
|
||||
}
|
||||
|
||||
core_thread_destroy_t core_thread_destroy_impl_get()
|
||||
{
|
||||
log_assert(core_thread_destroy_impl);
|
||||
|
||||
return core_thread_destroy_impl;
|
||||
}
|
||||
@@ -1,117 +0,0 @@
|
||||
#ifndef CORE_THREAD_H
|
||||
#define CORE_THREAD_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* The core thread API of bemanitools.
|
||||
*
|
||||
* This essentially reflects the AVS threading API and allows for swapping out
|
||||
* the backends with different implementations. Most games should have some
|
||||
* version of the AVS API available while some (legacy) games do not. These
|
||||
* can use a bemanitools private threading implementation by configuring it
|
||||
* in the bootstrapping process.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Create a thread
|
||||
*
|
||||
* Always use this interface in your application which hides the currently
|
||||
* configured implementation.
|
||||
*
|
||||
* @param proc The function to run in a separate thread
|
||||
* @param ctx Additional data to pass to the function as a parameter
|
||||
* @param stack_sz The stack size to allocate for the thread in bytes
|
||||
* @param priority The thread's priority
|
||||
* @return The ID of the thread once created and started
|
||||
*/
|
||||
int core_thread_create(
|
||||
int (*proc)(void *), void *ctx, uint32_t stack_sz, unsigned int priority);
|
||||
|
||||
/**
|
||||
* Wait for a thread to finish
|
||||
*
|
||||
* Always use this interface in your application which hides the currently
|
||||
* configured implementation.
|
||||
*
|
||||
* The caller of this function blocks until the thread has finished executing.
|
||||
*
|
||||
* @param thread_id ID of the thread to wait for
|
||||
* @param result Pointer to a variable to write the return value of the function
|
||||
* the thread executed to
|
||||
*/
|
||||
void core_thread_join(int thread_id, int *result);
|
||||
|
||||
/**
|
||||
* Destroy a thread
|
||||
*
|
||||
* Always use this interface in your application which hides the currently
|
||||
* configured implementation.
|
||||
*
|
||||
* The thread must have finished execution before calling this. It is advised
|
||||
* to make threads terminate their execution flow, join them and destroy.
|
||||
*
|
||||
* @param thread_id The ID of the thread to destroy.
|
||||
*/
|
||||
void core_thread_destroy(int thread_id);
|
||||
|
||||
typedef int (*core_thread_create_t)(
|
||||
int (*proc)(void *), void *ctx, uint32_t stack_sz, unsigned int priority);
|
||||
typedef void (*core_thread_join_t)(int thread_id, int *result);
|
||||
typedef void (*core_thread_destroy_t)(int thread_id);
|
||||
|
||||
typedef void (*core_thread_impl_set_t)(
|
||||
core_thread_create_t create,
|
||||
core_thread_join_t join,
|
||||
core_thread_destroy_t destroy);
|
||||
|
||||
/**
|
||||
* Configure the thread API implementations
|
||||
*
|
||||
* Advised to do this as early in your application/library module as possible
|
||||
* as calls to the getter functions below will return the currently configured
|
||||
* implementations.
|
||||
*
|
||||
* @param create Pointer to a function implementing thread creation
|
||||
* @param join Pointer to a function implementing joining of a thread
|
||||
* @param destroy Pointer to a function implementing destroying of a thread
|
||||
*/
|
||||
void core_thread_impl_set(
|
||||
core_thread_create_t create,
|
||||
core_thread_join_t join,
|
||||
core_thread_destroy_t destroy);
|
||||
|
||||
/**
|
||||
* Supporting function to inject/assign the currently set implementation
|
||||
* with the given setter function.
|
||||
*
|
||||
* @param impl_set Setter function to call with the currently configured thread
|
||||
* function implementations
|
||||
*/
|
||||
void core_thread_impl_assign(core_thread_impl_set_t impl_set);
|
||||
|
||||
/**
|
||||
* Get the currently configured implementation for thread_create
|
||||
*
|
||||
* @return Pointer to the currently configured implementation of the
|
||||
* thread_create function
|
||||
*/
|
||||
core_thread_create_t core_thread_create_impl_get();
|
||||
|
||||
/**
|
||||
* Get the currently configured implementation for thread_join
|
||||
*
|
||||
* @return Pointer to the currently configured implementation of the thread_join
|
||||
* function
|
||||
*/
|
||||
core_thread_join_t core_thread_join_impl_get();
|
||||
|
||||
/**
|
||||
* Get the currently configured implementation for thread_destroy
|
||||
*
|
||||
* @return Pointer to the currently configured implementation of the
|
||||
* thread_destroy function
|
||||
*/
|
||||
core_thread_destroy_t core_thread_destroy_impl_get();
|
||||
|
||||
#endif
|
||||
@@ -4,10 +4,10 @@
|
||||
|
||||
#include "cconfig/cconfig-util.h"
|
||||
|
||||
#include "core/log.h"
|
||||
|
||||
#include "d3d9exhook/config-gfx.h"
|
||||
|
||||
#include "util/log.h"
|
||||
|
||||
#define D3D9EXHOOK_CONFIG_GFX_FRAMED_KEY "gfx.framed"
|
||||
#define D3D9EXHOOK_CONFIG_GFX_WINDOWED_KEY "gfx.windowed"
|
||||
#define D3D9EXHOOK_CONFIG_GFX_CONFINED_KEY "gfx.confined"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user