diff options
Diffstat (limited to 'src/portal')
| -rw-r--r-- | src/portal/src/search.c | 43 | ||||
| -rw-r--r-- | src/portal/src/search.h | 11 |
2 files changed, 31 insertions, 23 deletions
diff --git a/src/portal/src/search.c b/src/portal/src/search.c index 2b81c97..e8f30c0 100644 --- a/src/portal/src/search.c +++ b/src/portal/src/search.c @@ -8,14 +8,17 @@ bool camu_python_init(void) { - PyPreConfig pre; - PyPreConfig_InitPythonConfig(&pre); - pre.utf8_mode = 1; - pre.dev_mode = 0; - Py_PreInitialize(&pre); + PyPreConfig config; + PyPreConfig_InitPythonConfig(&config); + config.dev_mode = 0; + config.utf8_mode = 1; + PyStatus status = Py_PreInitialize(&config); + if (PyStatus_Exception(status)) { + al_log_error("portal", "Preinitialization failed."); + return false; + } if (PyImport_AppendInittab("portal", PyInit_portal) == -1) { al_log_error("portal", "Could not extend in-built modules table."); - camu_python_close(); return false; } Py_Initialize(); @@ -23,10 +26,12 @@ bool camu_python_init(void) if (!module) { PyErr_Print(); al_log_error("portal", "Could not import module."); - camu_python_close(); - return false; + goto err; } return true; +err: + Py_Finalize(); + return false; } void camu_python_close(void) @@ -54,7 +59,10 @@ static aki_thread_result AKI_THREADCALL queue_thread(void *userdata) if (bridge->quit) break; if (!have_python) { // Defer python init. - have_python = camu_python_init(); + if (!(have_python = camu_python_init())) { + al_log_error("portal", "Failed to initialize python."); + break; + } } struct camu_portal_cmd *cmd; al_array_foreach_ptr(bridge->queue, i, cmd) { @@ -107,14 +115,12 @@ static aki_thread_result AKI_THREADCALL queue_thread(void *userdata) } } camu_queue_push(bridge->results, result); - aki_signal_send(&bridge->results_signal); - al_array_remove_at_iter(bridge->queue, i); } + bridge->queue.size = 0; + aki_signal_send(&bridge->results_signal); } while (1); aki_mutex_unlock(&bridge->mutex); - if (have_python) { - camu_python_close(); - } + if (have_python) camu_python_close(); return 0; } @@ -126,12 +132,12 @@ static void results_signal_callback(void *userdata) do { camu_queue_try_pop(bridge->results, size, result); if (size == 0) break; - result.callback(result.userdata, &result); + result.callback(bridge->userdata, result.userdata, &result); } while (1); } void camu_portal_init(struct camu_portal_bridge *bridge, struct camu_post_cache *cache, - struct aki_event_loop *loop) + struct aki_event_loop *loop, void *userdata) { al_array_init(bridge->searches); bridge->cache = cache; @@ -142,11 +148,12 @@ void camu_portal_init(struct camu_portal_bridge *bridge, struct camu_post_cache camu_queue_init(bridge->results); aki_signal_init(&bridge->results_signal, loop, results_signal_callback, bridge); aki_signal_start(&bridge->results_signal); + bridge->userdata = userdata; aki_thread_create(&bridge->thread, queue_thread, bridge); } void camu_portal_create_search(struct camu_portal_bridge *bridge, str *module, str *query, - void (*callback)(void *, struct camu_portal_result *), void *userdata) + void (*callback)(void *, void *, struct camu_portal_result *), void *userdata) { struct camu_portal_cmd cmd; cmd.op = CAMU_CLIENT_CREATE_SEARCH; @@ -163,7 +170,7 @@ void camu_portal_create_search(struct camu_portal_bridge *bridge, str *module, s } void camu_portal_get_page(struct camu_portal_bridge *bridge, s32 id, u32 num, - void (*callback)(void *, struct camu_portal_result *), void *userdata) + void (*callback)(void *, void *, struct camu_portal_result *), void *userdata) { struct camu_portal_cmd cmd; cmd.op = CAMU_CLIENT_GET_PAGE; diff --git a/src/portal/src/search.h b/src/portal/src/search.h index 85f4f6d..199f491 100644 --- a/src/portal/src/search.h +++ b/src/portal/src/search.h @@ -27,7 +27,7 @@ struct camu_portal_result { u8 op; s32 id; struct camu_result_page *page; - void (*callback)(void *, struct camu_portal_result *); + void (*callback)(void *, void *, struct camu_portal_result *); void *userdata; }; @@ -37,7 +37,7 @@ struct camu_portal_cmd { str query; s32 id; u32 num; - void (*callback)(void *, struct camu_portal_result *); + void (*callback)(void *, void *, struct camu_portal_result *); void *userdata; }; @@ -51,18 +51,19 @@ struct camu_portal_bridge { array(struct camu_portal_cmd) queue; queue(struct camu_portal_result) results; struct aki_signal results_signal; + void *userdata; }; bool camu_python_init(void); void camu_python_close(void); void camu_portal_init(struct camu_portal_bridge *bridge, struct camu_post_cache *cache, - struct aki_event_loop *loop); + struct aki_event_loop *loop, void *userdata); void camu_portal_create_search(struct camu_portal_bridge *bridge, str *module, str *query, - void (*callback)(void *, struct camu_portal_result *), void *userdata); + void (*callback)(void *, void *, struct camu_portal_result *), void *userdata); void camu_portal_get_page(struct camu_portal_bridge *bridge, s32 id, u32 num, - void (*callback)(void *, struct camu_portal_result *), void *userdata); + void (*callback)(void *, void *, struct camu_portal_result *), void *userdata); void camu_portal_close(struct camu_portal_bridge *bridge); |