mirror of
https://github.com/mauiaaron/apple2.git
synced 2024-06-01 13:41:28 +00:00
Enforce module ctor priorities
This commit is contained in:
parent
c5ed0bb5c6
commit
3120b75e00
|
@ -413,11 +413,3 @@ jstring Java_org_deadc0de_apple2ix_Apple2Activity_nativeLoadState(JNIEnv *env, j
|
||||||
return jstr;
|
return jstr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// Constructor
|
|
||||||
|
|
||||||
__attribute__((constructor(CTOR_PRIORITY_LATE)))
|
|
||||||
static void _init_jnihooks(void) {
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -623,7 +623,6 @@ static long openal_systemResume(AudioContext_s *audio_context) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((constructor(CTOR_PRIORITY_EARLY)))
|
|
||||||
static void _init_openal(void) {
|
static void _init_openal(void) {
|
||||||
LOG("Initializing OpenAL sound system");
|
LOG("Initializing OpenAL sound system");
|
||||||
|
|
||||||
|
@ -637,3 +636,7 @@ static void _init_openal(void) {
|
||||||
audio_backend = &openal_audio_backend;
|
audio_backend = &openal_audio_backend;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __attribute__((constructor)) void __init_openal(void) {
|
||||||
|
emulator_registerStartupCallback(CTOR_PRIORITY_EARLY, &_init_openal);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -758,7 +758,6 @@ static long opensles_systemResume(AudioContext_s *audio_context) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((constructor(CTOR_PRIORITY_EARLY)))
|
|
||||||
static void _init_opensl(void) {
|
static void _init_opensl(void) {
|
||||||
LOG("Initializing OpenSLES sound system");
|
LOG("Initializing OpenSLES sound system");
|
||||||
|
|
||||||
|
@ -772,3 +771,7 @@ static void _init_opensl(void) {
|
||||||
audio_backend = &opensles_audio_backend;
|
audio_backend = &opensles_audio_backend;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __attribute__((constructor)) void __init_opensl(void) {
|
||||||
|
emulator_registerStartupCallback(CTOR_PRIORITY_EARLY, &_init_opensl);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,8 +60,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((constructor(CTOR_PRIORITY_EARLY)))
|
static void __attribute__((constructor)) _breakpad_registration(void) {
|
||||||
static void _breakpad_registration(void) {
|
|
||||||
LOG("Registering Breakpad as native crash handler");
|
LOG("Registering Breakpad as native crash handler");
|
||||||
breakpadHandler.init = &initBreakpadHandler;
|
breakpadHandler.init = &initBreakpadHandler;
|
||||||
breakpadHandler.shutdown = &shutdownBreakpadHandler;
|
breakpadHandler.shutdown = &shutdownBreakpadHandler;
|
||||||
|
|
|
@ -86,10 +86,6 @@
|
||||||
#import <CoreFoundation/CoreFoundation.h>
|
#import <CoreFoundation/CoreFoundation.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define CTOR_PRIORITY_FIRST 101
|
|
||||||
#define CTOR_PRIORITY_EARLY 111
|
|
||||||
#define CTOR_PRIORITY_LATE 201
|
|
||||||
|
|
||||||
#if VIDEO_OPENGL
|
#if VIDEO_OPENGL
|
||||||
#include "video_util/glUtil.h"
|
#include "video_util/glUtil.h"
|
||||||
// 2015/04/01 ... early calls to glGetError()--before a context exists--causes segfaults on MacOS X
|
// 2015/04/01 ... early calls to glGetError()--before a context exists--causes segfaults on MacOS X
|
||||||
|
|
|
@ -21,8 +21,7 @@
|
||||||
static double orwl_timebase = 0.0;
|
static double orwl_timebase = 0.0;
|
||||||
static uint64_t orwl_timestart = 0;
|
static uint64_t orwl_timestart = 0;
|
||||||
|
|
||||||
__attribute__((constructor(CTOR_PRIORITY_LATE)))
|
static void _init_darwin_shim(void) {
|
||||||
static void __init_darwin_shim() {
|
|
||||||
LOG("Initializing Darwin Shim");
|
LOG("Initializing Darwin Shim");
|
||||||
mach_timebase_info_data_t tb = { 0 };
|
mach_timebase_info_data_t tb = { 0 };
|
||||||
mach_timebase_info(&tb);
|
mach_timebase_info(&tb);
|
||||||
|
@ -31,6 +30,10 @@ static void __init_darwin_shim() {
|
||||||
orwl_timestart = mach_absolute_time();
|
orwl_timestart = mach_absolute_time();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __attribute__((constructor)) void __init_darwin_shim(void) {
|
||||||
|
emulator_registerStartupCallback(CTOR_PRIORITY_LATE, &_init_darwin_shim);
|
||||||
|
}
|
||||||
|
|
||||||
int clock_gettime(int clk_id, struct timespec *tp) {
|
int clock_gettime(int clk_id, struct timespec *tp) {
|
||||||
double diff = (mach_absolute_time() - orwl_timestart) * orwl_timebase;
|
double diff = (mach_absolute_time() - orwl_timestart) * orwl_timebase;
|
||||||
tp->tv_sec = diff * ORWL_NANO;
|
tp->tv_sec = diff * ORWL_NANO;
|
||||||
|
|
|
@ -78,7 +78,6 @@ static uint8_t translate_table_6[0x40] = {
|
||||||
|
|
||||||
static uint8_t rev_translate_table_6[0x80] = { 0x01 };
|
static uint8_t rev_translate_table_6[0x80] = { 0x01 };
|
||||||
|
|
||||||
__attribute__((constructor(CTOR_PRIORITY_LATE)))
|
|
||||||
static void _init_disk6(void) {
|
static void _init_disk6(void) {
|
||||||
LOG("Disk ][ emulation module early setup");
|
LOG("Disk ][ emulation module early setup");
|
||||||
memset(&disk6, 0x0, sizeof(disk6));
|
memset(&disk6, 0x0, sizeof(disk6));
|
||||||
|
@ -92,6 +91,10 @@ static void _init_disk6(void) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __attribute__((constructor)) void __init_disk6(void) {
|
||||||
|
emulator_registerStartupCallback(CTOR_PRIORITY_LATE, &_init_disk6);
|
||||||
|
}
|
||||||
|
|
||||||
static inline bool is_nib(const char * const name) {
|
static inline bool is_nib(const char * const name) {
|
||||||
size_t len = strlen(name);
|
size_t len = strlen(name);
|
||||||
if (len <= _NIBLEN) {
|
if (len <= _NIBLEN) {
|
||||||
|
|
|
@ -1524,7 +1524,6 @@ uint8_t floating_bus_hibit(const bool hibit) {
|
||||||
return (b & ~0x80) | (hibit ? 0x80 : 0);
|
return (b & ~0x80) | (hibit ? 0x80 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((constructor(CTOR_PRIORITY_LATE)))
|
|
||||||
static void _init_interface(void) {
|
static void _init_interface(void) {
|
||||||
LOG("Initializing display subsystem");
|
LOG("Initializing display subsystem");
|
||||||
_initialize_interface_fonts();
|
_initialize_interface_fonts();
|
||||||
|
@ -1534,3 +1533,7 @@ static void _init_interface(void) {
|
||||||
_initialize_color();
|
_initialize_color();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __attribute__((constructor)) void __init_interface(void) {
|
||||||
|
emulator_registerStartupCallback(CTOR_PRIORITY_LATE, &_init_interface);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -1313,7 +1313,6 @@ void display_help() {
|
||||||
num_buffer_lines = i;
|
num_buffer_lines = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((constructor(CTOR_PRIORITY_LATE)))
|
|
||||||
static void _init_debugger(void) {
|
static void _init_debugger(void) {
|
||||||
|
|
||||||
LOG("Initializing virtual machine debugger subsystem");
|
LOG("Initializing virtual machine debugger subsystem");
|
||||||
|
@ -1330,6 +1329,10 @@ static void _init_debugger(void) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __attribute__((constructor)) void __init_debugger(void) {
|
||||||
|
emulator_registerStartupCallback(CTOR_PRIORITY_LATE, &_init_debugger);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef INTERFACE_CLASSIC
|
#ifdef INTERFACE_CLASSIC
|
||||||
/* -------------------------------------------------------------------------
|
/* -------------------------------------------------------------------------
|
||||||
do_debug_command ()
|
do_debug_command ()
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
static int trace_fd = -1;
|
static int trace_fd = -1;
|
||||||
static int trace_pid = -1;
|
static int trace_pid = -1;
|
||||||
|
|
||||||
__attribute__((constructor(CTOR_PRIORITY_LATE)))
|
|
||||||
static void _trace_init(void) {
|
static void _trace_init(void) {
|
||||||
TEMP_FAILURE_RETRY(trace_fd = open(TRACING_FILE, O_WRONLY));
|
TEMP_FAILURE_RETRY(trace_fd = open(TRACING_FILE, O_WRONLY));
|
||||||
if (trace_fd == -1) {
|
if (trace_fd == -1) {
|
||||||
|
@ -38,6 +37,11 @@ static void _trace_init(void) {
|
||||||
trace_pid = getpid();
|
trace_pid = getpid();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static __attribute__((constructor)) void __trace_init(void) {
|
||||||
|
emulator_registerStartupCallback(CTOR_PRIORITY_LATE, &_trace_init);
|
||||||
|
}
|
||||||
|
|
||||||
__attribute__((destructor(255)))
|
__attribute__((destructor(255)))
|
||||||
static void _trace_shutdown(void) {
|
static void _trace_shutdown(void) {
|
||||||
if (trace_fd != -1) {
|
if (trace_fd != -1) {
|
||||||
|
|
61
src/misc.c
61
src/misc.c
|
@ -18,6 +18,14 @@
|
||||||
#define SAVE_MAGICK "A2VM"
|
#define SAVE_MAGICK "A2VM"
|
||||||
#define SAVE_MAGICK_LEN sizeof(SAVE_MAGICK)
|
#define SAVE_MAGICK_LEN sizeof(SAVE_MAGICK)
|
||||||
|
|
||||||
|
typedef struct module_ctor_node_s {
|
||||||
|
struct module_ctor_node_s *next;
|
||||||
|
long order;
|
||||||
|
startup_callback_f ctor;
|
||||||
|
} module_ctor_node_s;
|
||||||
|
|
||||||
|
static module_ctor_node_s *head = NULL;
|
||||||
|
|
||||||
bool do_logging = true; // also controlled by NDEBUG
|
bool do_logging = true; // also controlled by NDEBUG
|
||||||
FILE *error_log = NULL;
|
FILE *error_log = NULL;
|
||||||
int sound_volume = 2;
|
int sound_volume = 2;
|
||||||
|
@ -27,17 +35,20 @@ char **argv = NULL;
|
||||||
int argc = 0;
|
int argc = 0;
|
||||||
CrashHandler_s *crashHandler = NULL;
|
CrashHandler_s *crashHandler = NULL;
|
||||||
|
|
||||||
__attribute__((constructor(CTOR_PRIORITY_FIRST)))
|
#if defined(CONFIG_DATADIR)
|
||||||
static void _init_common(void) {
|
static void _init_common(void) {
|
||||||
LOG("Initializing common...");
|
LOG("Initializing common...");
|
||||||
#if defined(CONFIG_DATADIR)
|
|
||||||
data_dir = strdup(CONFIG_DATADIR PATH_SEPARATOR PACKAGE_NAME);
|
data_dir = strdup(CONFIG_DATADIR PATH_SEPARATOR PACKAGE_NAME);
|
||||||
#elif defined(ANDROID)
|
}
|
||||||
// data_dir is set up in JNI
|
|
||||||
#elif !defined(__APPLE__)
|
static __attribute__((constructor)) void __init_common(void) {
|
||||||
|
emulator_registerStartupCallback(CTOR_PRIORITY_FIRST, &_init_common);
|
||||||
|
}
|
||||||
|
#elif defined(ANDROID) || defined(__APPLE__)
|
||||||
|
// data_dir is set up elsewhere
|
||||||
|
#else
|
||||||
# error "Specify a CONFIG_DATADIR and PACKAGE_NAME"
|
# error "Specify a CONFIG_DATADIR and PACKAGE_NAME"
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
|
|
||||||
static bool _save_state(int fd, const uint8_t * outbuf, ssize_t outmax) {
|
static bool _save_state(int fd, const uint8_t * outbuf, ssize_t outmax) {
|
||||||
ssize_t outlen = 0;
|
ssize_t outlen = 0;
|
||||||
|
@ -227,7 +238,45 @@ static void _shutdown_threads(void) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void emulator_registerStartupCallback(long order, startup_callback_f ctor) {
|
||||||
|
|
||||||
|
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
pthread_mutex_lock(&mutex);
|
||||||
|
|
||||||
|
module_ctor_node_s *node = MALLOC(sizeof(module_ctor_node_s));
|
||||||
|
assert(node);
|
||||||
|
node->next = NULL;
|
||||||
|
node->order = order;
|
||||||
|
node->ctor = ctor;
|
||||||
|
|
||||||
|
module_ctor_node_s *p0 = NULL;
|
||||||
|
module_ctor_node_s *p = head;
|
||||||
|
while (p && (order > p->order)) {
|
||||||
|
p0 = p;
|
||||||
|
p = p->next;
|
||||||
|
}
|
||||||
|
if (p0) {
|
||||||
|
p0->next = node;
|
||||||
|
} else {
|
||||||
|
head = node;
|
||||||
|
}
|
||||||
|
node->next = p;
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&mutex);
|
||||||
|
}
|
||||||
|
|
||||||
void emulator_start(void) {
|
void emulator_start(void) {
|
||||||
|
|
||||||
|
module_ctor_node_s *p = head;
|
||||||
|
head = NULL;
|
||||||
|
while (p) {
|
||||||
|
p->ctor();
|
||||||
|
module_ctor_node_s *next = p->next;
|
||||||
|
FREE(p);
|
||||||
|
p = next;
|
||||||
|
}
|
||||||
|
head = NULL;
|
||||||
|
|
||||||
#ifdef INTERFACE_CLASSIC
|
#ifdef INTERFACE_CLASSIC
|
||||||
load_settings(); // user prefs
|
load_settings(); // user prefs
|
||||||
c_keys_set_key(kF8); // show credits before emulation start
|
c_keys_set_key(kF8); // show credits before emulation start
|
||||||
|
|
11
src/misc.h
11
src/misc.h
|
@ -16,6 +16,14 @@
|
||||||
#ifndef _MISC_H_
|
#ifndef _MISC_H_
|
||||||
#define _MISC_H_
|
#define _MISC_H_
|
||||||
|
|
||||||
|
enum {
|
||||||
|
CTOR_PRIORITY_FIRST = 101,
|
||||||
|
CTOR_PRIORITY_EARLY = 111,
|
||||||
|
CTOR_PRIORITY_LATE = 201,
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef void (*startup_callback_f)(void);
|
||||||
|
|
||||||
// top installation directory
|
// top installation directory
|
||||||
extern const char *data_dir;
|
extern const char *data_dir;
|
||||||
|
|
||||||
|
@ -23,6 +31,9 @@ extern const char *data_dir;
|
||||||
extern char **argv;
|
extern char **argv;
|
||||||
extern int argc;
|
extern int argc;
|
||||||
|
|
||||||
|
// register a startup function
|
||||||
|
void emulator_registerStartupCallback(long order, startup_callback_f callback);
|
||||||
|
|
||||||
// start emulator (CPU, audio, and video)
|
// start emulator (CPU, audio, and video)
|
||||||
void emulator_start(void);
|
void emulator_start(void);
|
||||||
|
|
||||||
|
|
|
@ -84,13 +84,6 @@ pthread_cond_t cpu_thread_cond = PTHREAD_COND_INITIALIZER;
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
__attribute__((constructor(CTOR_PRIORITY_LATE)))
|
|
||||||
static void _init_timing(void) {
|
|
||||||
pthread_mutexattr_t attr;
|
|
||||||
pthread_mutexattr_init(&attr);
|
|
||||||
pthread_mutex_init(&interface_mutex, &attr);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct timespec timespec_diff(struct timespec start, struct timespec end, bool *negative) {
|
struct timespec timespec_diff(struct timespec start, struct timespec end, bool *negative) {
|
||||||
struct timespec t;
|
struct timespec t;
|
||||||
|
|
||||||
|
|
|
@ -369,7 +369,6 @@ static void _animation_setEnableShowTrackSector(bool enabled) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((constructor(CTOR_PRIORITY_LATE)))
|
|
||||||
static void _init_glalert(void) {
|
static void _init_glalert(void) {
|
||||||
LOG("Initializing message animation subsystem");
|
LOG("Initializing message animation subsystem");
|
||||||
|
|
||||||
|
@ -393,3 +392,7 @@ static void _init_glalert(void) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __attribute__((constructor)) void __init_glalert(void) {
|
||||||
|
emulator_registerStartupCallback(CTOR_PRIORITY_LATE, &_init_glalert);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -252,7 +252,6 @@ static void glnode_mainLoop(void) {
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
__attribute__((constructor(CTOR_PRIORITY_EARLY)))
|
|
||||||
static void _init_glnode_manager(void) {
|
static void _init_glnode_manager(void) {
|
||||||
LOG("Initializing GLNode manager subsystem");
|
LOG("Initializing GLNode manager subsystem");
|
||||||
|
|
||||||
|
@ -273,3 +272,8 @@ static void _init_glnode_manager(void) {
|
||||||
interface_getModelDataSetter = &glnode_getModelDataSetter;
|
interface_getModelDataSetter = &glnode_getModelDataSetter;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __attribute__((constructor)) void __init_glnode_manager(void) {
|
||||||
|
emulator_registerStartupCallback(CTOR_PRIORITY_EARLY, &_init_glnode_manager);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -955,7 +955,6 @@ static bool gltouchjoy_isCalibrating(void) {
|
||||||
return joyglobals.isCalibrating;
|
return joyglobals.isCalibrating;
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((constructor(CTOR_PRIORITY_LATE)))
|
|
||||||
static void _init_gltouchjoy(void) {
|
static void _init_gltouchjoy(void) {
|
||||||
LOG("Registering OpenGL software touch joystick");
|
LOG("Registering OpenGL software touch joystick");
|
||||||
|
|
||||||
|
@ -1040,6 +1039,10 @@ static void _init_gltouchjoy(void) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __attribute__((constructor)) void __init_gltouchjoy(void) {
|
||||||
|
emulator_registerStartupCallback(CTOR_PRIORITY_LATE, &_init_gltouchjoy);
|
||||||
|
}
|
||||||
|
|
||||||
void gltouchjoy_registerVariant(touchjoy_variant_t variantType, GLTouchJoyVariant *touchJoyVariant) {
|
void gltouchjoy_registerVariant(touchjoy_variant_t variantType, GLTouchJoyVariant *touchJoyVariant) {
|
||||||
switch (variantType) {
|
switch (variantType) {
|
||||||
case EMULATED_JOYSTICK:
|
case EMULATED_JOYSTICK:
|
||||||
|
@ -1058,7 +1061,6 @@ void gltouchjoy_registerVariant(touchjoy_variant_t variantType, GLTouchJoyVarian
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void gldriver_joystick_reset(void) {
|
void gldriver_joystick_reset(void) {
|
||||||
#warning FIXME TODO expunge this olde API ...
|
#warning FIXME TODO expunge this olde API ...
|
||||||
}
|
}
|
||||||
|
|
|
@ -256,7 +256,6 @@ static void gltouchjoy_setTapDelay(float secs) {
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
__attribute__((constructor(CTOR_PRIORITY_EARLY)))
|
|
||||||
static void _init_gltouchjoy_joy(void) {
|
static void _init_gltouchjoy_joy(void) {
|
||||||
LOG("Registering OpenGL software touch joystick (joystick variant)");
|
LOG("Registering OpenGL software touch joystick (joystick variant)");
|
||||||
|
|
||||||
|
@ -282,3 +281,7 @@ static void _init_gltouchjoy_joy(void) {
|
||||||
gltouchjoy_registerVariant(EMULATED_JOYSTICK, &happyHappyJoyJoy);
|
gltouchjoy_registerVariant(EMULATED_JOYSTICK, &happyHappyJoyJoy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __attribute__((constructor)) void __init_gltouchjoy_joy(void) {
|
||||||
|
emulator_registerStartupCallback(CTOR_PRIORITY_EARLY, &_init_gltouchjoy_joy);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -473,7 +473,6 @@ static void touchkpad_setKeyRepeatThreshold(float repeatThresholdSecs) {
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
__attribute__((constructor(CTOR_PRIORITY_EARLY)))
|
|
||||||
static void _init_gltouchjoy_kpad(void) {
|
static void _init_gltouchjoy_kpad(void) {
|
||||||
LOG("Registering OpenGL software touch joystick (keypad variant)");
|
LOG("Registering OpenGL software touch joystick (keypad variant)");
|
||||||
|
|
||||||
|
@ -503,3 +502,7 @@ static void _init_gltouchjoy_kpad(void) {
|
||||||
gltouchjoy_registerVariant(EMULATED_KEYPAD, &kpadJoy);
|
gltouchjoy_registerVariant(EMULATED_KEYPAD, &kpadJoy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __attribute__((constructor)) void __init_gltouchjoy_kpad(void) {
|
||||||
|
emulator_registerStartupCallback(CTOR_PRIORITY_EARLY, &_init_gltouchjoy_kpad);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -1039,7 +1039,6 @@ static void _initialize_keyboard_templates(void) {
|
||||||
kbdTemplateAlt [MAINROW+3][9] = ICONTEXT_RETURN_R;
|
kbdTemplateAlt [MAINROW+3][9] = ICONTEXT_RETURN_R;
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((constructor(CTOR_PRIORITY_LATE)))
|
|
||||||
static void _init_gltouchkbd(void) {
|
static void _init_gltouchkbd(void) {
|
||||||
LOG("Registering OpenGL software touch keyboard");
|
LOG("Registering OpenGL software touch keyboard");
|
||||||
|
|
||||||
|
@ -1081,3 +1080,7 @@ static void _init_gltouchkbd(void) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __attribute__((constructor)) void __init_gltouchkbd(void) {
|
||||||
|
emulator_registerStartupCallback(CTOR_PRIORITY_LATE, &_init_gltouchkbd);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -553,7 +553,6 @@ static void gltouchmenu_setGlyphScale(int glyphScale) {
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Constructor
|
// Constructor
|
||||||
|
|
||||||
__attribute__((constructor(CTOR_PRIORITY_LATE)))
|
|
||||||
static void _init_gltouchmenu(void) {
|
static void _init_gltouchmenu(void) {
|
||||||
LOG("Registering OpenGL software touch menu");
|
LOG("Registering OpenGL software touch menu");
|
||||||
|
|
||||||
|
@ -580,3 +579,7 @@ static void _init_gltouchmenu(void) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __attribute__((constructor)) void __init_gltouchmenu(void) {
|
||||||
|
emulator_registerStartupCallback(CTOR_PRIORITY_LATE, &_init_gltouchmenu);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -449,7 +449,6 @@ static int64_t glvideo_onTouchEvent(interface_touch_event_t action, int pointer_
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
__attribute__((constructor(CTOR_PRIORITY_LATE)))
|
|
||||||
static void _init_glvideo(void) {
|
static void _init_glvideo(void) {
|
||||||
LOG("Initializing OpenGL renderer");
|
LOG("Initializing OpenGL renderer");
|
||||||
|
|
||||||
|
@ -466,3 +465,7 @@ static void _init_glvideo(void) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __attribute__((constructor)) void __init_glvideo(void) {
|
||||||
|
emulator_registerStartupCallback(CTOR_PRIORITY_LATE, &_init_glvideo);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -874,7 +874,6 @@ static void xdriver_render(void) {
|
||||||
// no-op
|
// no-op
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((constructor(CTOR_PRIORITY_EARLY)))
|
|
||||||
static void _init_xvideo(void) {
|
static void _init_xvideo(void) {
|
||||||
LOG("Initializing X11 renderer");
|
LOG("Initializing X11 renderer");
|
||||||
|
|
||||||
|
@ -889,3 +888,7 @@ static void _init_xvideo(void) {
|
||||||
video_backend = &xvideo_backend;
|
video_backend = &xvideo_backend;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __attribute__((constructor)) void __init_xvideo(void) {
|
||||||
|
emulator_registerStartupCallback(CTOR_PRIORITY_EARLY, &_init_xvideo);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user