summaryrefslogtreecommitdiff
path: root/src/portal
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2024-12-18 11:06:44 -0500
committerAndrew Opalach <andrew@akon.city> 2024-12-18 11:06:44 -0500
commit3d55d2722a3129449ab1418e73abd97caa7fd2ae (patch)
tree0cba3f876c9b339d20d8e4a38a7a5d786fa2102d /src/portal
parent692785bc9da6904cf17e986fb034730ed3d78231 (diff)
downloadcamu-3d55d2722a3129449ab1418e73abd97caa7fd2ae.tar.gz
camu-3d55d2722a3129449ab1418e73abd97caa7fd2ae.tar.bz2
camu-3d55d2722a3129449ab1418e73abd97caa7fd2ae.zip
Extend server resource loading, work on client
Also, cleanup in preparation for changing code style. Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/portal')
-rw-r--r--src/portal/src/search.c43
-rw-r--r--src/portal/src/search.h11
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);