events on quit

This commit is contained in:
2026-04-18 16:31:12 +02:00
parent 5214b9f925
commit ce72177973

View File

@@ -37,6 +37,27 @@
//#define DEBUG //#define DEBUG
#ifdef __linux
static int sleep_ms(long msec)
{
struct timespec ts;
int res;
if (msec < 0) {
return -1;
}
ts.tv_sec = msec / 1000;
ts.tv_nsec = (msec % 1000) * 1000000;
res = nanosleep(&ts, &ts);
return res;
}
#endif
#define YIELD() sleep_ms(5)
///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
// Utility functions // Utility functions
///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
@@ -70,6 +91,8 @@ typedef struct {
bool alive_go_on; bool alive_go_on;
std::thread *alive_thread; std::thread *alive_thread;
bool alive_error; bool alive_error;
bool verbose;
} Handle_t; } Handle_t;
Handle_t *handler = nullptr; Handle_t *handler = nullptr;
@@ -200,22 +223,35 @@ bool runRktWebview(Handle_t *handler)
#define EVT_GUARD_STOP -93273 #define EVT_GUARD_STOP -93273
#define EVT_ALIVE_ERROR -94328 #define EVT_ALIVE_ERROR -94328
#define WAIT_ON_EVENT_MS (10 * 1000) #define WAIT_ON_EVENT_MS (2 * 1000)
#define ALIVE_MESSAGE_INTERVAL_S 5 // Should be smaller than 10 seconds #define ALIVE_MESSAGE_INTERVAL_S 5 // Should be smaller than 10 seconds
#define MAX_WAIT_RESULT (2 * 1000) // Maximum wait in milliseconds for a result per time #define MAX_WAIT_RESULT (2 * 1000) // Maximum wait in milliseconds for a result per time
#define MAX_ALIVE_ACK_TIME (10 * 1000) #define MAX_ALIVE_ACK_TIME (10 * 1000)
void rkt_evt_guard(void) void rkt_evt_guard(void)
{ {
INFO0("Starting rkt_evt_guard\n");
while(handler->guard_go_on) { while(handler->guard_go_on) {
int wv; int wv;
std::string data; std::string data;
if (handler->event_queue->dequeue(wv, data, WAIT_ON_EVENT_MS)) { if (handler->event_queue->dequeue(wv, data, WAIT_ON_EVENT_MS)) {
if (handler->verbose) {
INFO2("Got event wv = %d, %s\n", wv, data.c_str());
}
if (wv != EVT_GUARD_STOP) { if (wv != EVT_GUARD_STOP) {
handler->evt_queue->enqueue(wv, data); if (handler->evt_cb != nullptr) { // evt_cb could be cleared to null
handler->evt_cb(1); handler->evt_queue->enqueue(wv, data);
handler->evt_cb(1);
} else {
INFO0("evt_cb = null\n");
}
} else { } else {
INFO0("Got stop message (evt_guard)\n"); INFO0("Got stop message (evt_guard)\n");
handler->guard_go_on = false;
}
} else {
if (handler->verbose) {
INFO0("Got nothing, verbose = true\n");
} }
} }
} }
@@ -260,13 +296,19 @@ void rkt_webview_cleanup()
// So we would need to cleanup at exit of racket/drracket. // So we would need to cleanup at exit of racket/drracket.
// Cleaning up when exiting the current custodian is not enough. // Cleaning up when exiting the current custodian is not enough.
handler->verbose = true;
sleep_ms(3000);
if (handler->valid) { if (handler->valid) {
if (handler->evt_cb != nullptr) { if (handler->evt_cb != nullptr) {
INFO0("Stopping evt_guard\n"); INFO0("Stopping evt_guard (enqueuing evt_guard_stop)\n");
handler->guard_go_on = false;
handler->event_queue->enqueue(EVT_GUARD_STOP);
handler->event_queue->enqueue(EVT_GUARD_STOP); handler->event_queue->enqueue(EVT_GUARD_STOP);
INFO0("yielding current thread and hopefully activating evt_guard thread\n");
YIELD();
sleep_ms(1000);
INFO0("joining guard thread\n");
handler->guard_thread->join(); handler->guard_thread->join();
INFO0("Deleting guard thread\n");
delete handler->guard_thread; delete handler->guard_thread;
handler->guard_thread = nullptr; handler->guard_thread = nullptr;
} }
@@ -336,6 +378,7 @@ void rkt_webview_init()
handler->name = buf; handler->name = buf;
handler->function_calls = 0; handler->function_calls = 0;
handler->events = 0; handler->events = 0;
handler->verbose = true;
handler->shm_size = SHM_SIZE; handler->shm_size = SHM_SIZE;
handler->shm = new Shm(handler->name.data(), handler->shm_size, true); handler->shm = new Shm(handler->name.data(), handler->shm_size, true);