summaryrefslogtreecommitdiff
path: root/src/portal
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2025-01-24 18:14:52 -0500
committerAndrew Opalach <andrew@akon.city> 2025-01-24 18:14:52 -0500
commitf638237a6b4f3d3edf9bdd995c15df537f8d7e7c (patch)
tree44efce6d912c43f67548690256879d036e22e742 /src/portal
parent2daa31c0629f2eb4af84d6f4fed8ac89813de056 (diff)
downloadcamu-f638237a6b4f3d3edf9bdd995c15df537f8d7e7c.tar.gz
camu-f638237a6b4f3d3edf9bdd995c15df537f8d7e7c.tar.bz2
camu-f638237a6b4f3d3edf9bdd995c15df537f8d7e7c.zip
Fix multiple bugs encountered during stress test
- Basic server resource cleanup Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/portal')
-rw-r--r--src/portal/src/post.c26
-rw-r--r--src/portal/src/post.h1
-rw-r--r--src/portal/src/post_cache.c22
-rw-r--r--src/portal/src/post_cache.h3
-rw-r--r--src/portal/src/search.c70
-rw-r--r--src/portal/src/search.h1
6 files changed, 85 insertions, 38 deletions
diff --git a/src/portal/src/post.c b/src/portal/src/post.c
index 4cb0bcc..6ca8f23 100644
--- a/src/portal/src/post.c
+++ b/src/portal/src/post.c
@@ -27,8 +27,8 @@ void camu_post_clone(struct camu_post *dest, struct camu_post *src)
dest->quotes = src->quotes;
dest->comments = src->comments;
dest->views = src->views;
- struct camu_post_media *media;
struct camu_post_media media_copy;
+ struct camu_post_media *media;
al_array_foreach_ptr(src->media, i, media) {
al_bzero(&media_copy, sizeof(struct camu_post_media));
media_copy.type = media->type;
@@ -44,6 +44,30 @@ void camu_post_clone(struct camu_post *dest, struct camu_post *src)
al_str_clone(&dest->in_reply_to.unique_id, &src->in_reply_to.unique_id);
}
+void camu_post_free(struct camu_post *post)
+{
+ al_str_free(&post->unique_id);
+ al_str_free(&post->url);
+ al_str_free(&post->author.unique_id);
+ al_wstr_free(&post->author.username);
+ al_wstr_free(&post->author.display_name);
+ al_str_free(&post->author.profile_picture_url);
+ al_wstr_free(&post->title);
+ al_wstr_free(&post->text);
+ struct camu_post_media *media;
+ al_array_foreach_ptr(post->media, i, media) {
+ al_str_free(&media->key);
+ al_str_free(&media->url);
+ al_str_free(&media->ext);
+ al_str_free(&media->thumbnail_url);
+ al_str_free(&media->thumbnail_ext);
+ }
+ al_array_free(post->media);
+ al_str_free(&post->post.unique_id);
+ al_str_free(&post->quoted.unique_id);
+ al_str_free(&post->in_reply_to.unique_id);
+}
+
void camu_post_add_media(struct camu_post *post, u8 type, str *key, str *url, str *ext, str *thumbnail_url, str *thumbnail_ext)
{
al_array_push(post->media, ((struct camu_post_media){
diff --git a/src/portal/src/post.h b/src/portal/src/post.h
index a946968..4bb3785 100644
--- a/src/portal/src/post.h
+++ b/src/portal/src/post.h
@@ -105,6 +105,7 @@ struct camu_post {
void camu_post_reset(struct camu_post *post);
void camu_post_clone(struct camu_post *dest, struct camu_post *src);
+void camu_post_free(struct camu_post *post);
// Python internal.
void camu_post_add_date(struct camu_post *post, u8 type, f32 range_start, f32 range_end, u32 meta);
diff --git a/src/portal/src/post_cache.c b/src/portal/src/post_cache.c
index ad50404..d6b885b 100644
--- a/src/portal/src/post_cache.c
+++ b/src/portal/src/post_cache.c
@@ -5,13 +5,18 @@ void camu_post_cache_init(struct camu_post_cache *cache)
al_array_init(cache->cache);
}
-void camu_post_cache_push(struct camu_post_cache *cache, struct camu_post *post)
+void camu_post_cache_push(struct camu_post_cache *cache, struct camu_post *post, bool clone)
{
struct camu_post *check = camu_post_cache_get(cache, &post->unique_id);
if (!check) {
- struct camu_post *npost = al_alloc_object(struct camu_post);
- camu_post_clone(npost, post);
- al_array_push(cache->cache, npost);
+ if (clone) {
+ struct camu_post *cloned = al_alloc_object(struct camu_post);
+ camu_post_clone(cloned, post);
+ post = cloned;
+ }
+ al_array_push(cache->cache, post);
+ } else if (!clone) {
+ camu_post_free(post);
}
}
@@ -28,3 +33,12 @@ struct camu_post *camu_post_cache_get(struct camu_post_cache *cache, str *unique
}
return NULL;
}
+
+void camu_post_cache_free(struct camu_post_cache *cache)
+{
+ struct camu_post *post;
+ al_array_foreach(cache->cache, i, post) {
+ camu_post_free(post);
+ }
+ al_array_free(cache->cache);
+}
diff --git a/src/portal/src/post_cache.h b/src/portal/src/post_cache.h
index a406c72..8d0f975 100644
--- a/src/portal/src/post_cache.h
+++ b/src/portal/src/post_cache.h
@@ -9,5 +9,6 @@ struct camu_post_cache {
};
void camu_post_cache_init(struct camu_post_cache *cache);
-void camu_post_cache_push(struct camu_post_cache *cache, struct camu_post *post);
+void camu_post_cache_push(struct camu_post_cache *cache, struct camu_post *post, bool clone);
struct camu_post *camu_post_cache_get(struct camu_post_cache *cache, str *unique_id);
+void camu_post_cache_free(struct camu_post_cache *cache);
diff --git a/src/portal/src/search.c b/src/portal/src/search.c
index e5d5dca..2584878 100644
--- a/src/portal/src/search.c
+++ b/src/portal/src/search.c
@@ -59,13 +59,14 @@ static struct camu_search *get_search_by_id(struct camu_portal_bridge *bridge, s
static nn_thread_result NNWT_THREADCALL queue_thread(void *userdata)
{
- struct camu_portal_bridge *bridge = (struct camu_portal_bridge *)userdata;
nn_thread_setcanceltype(NNWT_THREAD_CANCEL_ASYNCHRONOUS);
+ struct camu_portal_bridge *bridge = (struct camu_portal_bridge *)userdata;
bool have_python = false;
nn_mutex_lock(&bridge->mutex);
for (;;) {
nn_cond_wait(&bridge->cond, &bridge->mutex);
if (bridge->quit) break;
+
if (!have_python) {
// Defer python init.
if (!(have_python = camu_python_init())) {
@@ -73,6 +74,7 @@ static nn_thread_result NNWT_THREADCALL queue_thread(void *userdata)
break;
}
}
+
struct camu_portal_cmd *cmd;
al_array_foreach_ptr(bridge->queue, i, cmd) {
struct camu_portal_result result = { 0 };
@@ -84,15 +86,15 @@ static nn_thread_result NNWT_THREADCALL queue_thread(void *userdata)
s32 id = portal_bridge_search(&cmd->module, &cmd->query);
if (id >= 0) {
struct camu_search *search = al_alloc_object(struct camu_search);
- search->page = 0;
- al_array_init(search->pages);
search->id = id;
+ result.id = search->id;
al_str_clone(&search->module, &cmd->module);
al_str_clone(&search->query, &cmd->query);
+ search->page = 0;
+ al_array_init(search->pages);
search->bridge = bridge;
al_array_push(bridge->searches, search);
al_log_info("portal", "New search %x (%.*s).", id, al_str_fmt(&cmd->query));
- result.id = search->id;
} else {
}
al_str_free(&cmd->module);
@@ -103,22 +105,24 @@ static nn_thread_result NNWT_THREADCALL queue_thread(void *userdata)
struct camu_search *search = get_search_by_id(bridge, cmd->id);
if (search) {
result.id = search->id;
+
struct camu_result_page *page;
al_array_foreach_ptr(search->pages, j, page) {
if (page->num == cmd->num) break;
}
+
al_log_info("portal", "Loading page %i (%.*s).", cmd->num, al_str_fmt(&search->query));
if (portal_bridge_get_page(search, search->id, cmd->num) == -1) {
break;
}
- page = &al_array_at(search->pages, cmd->num);
+
+ result.page = &al_array_at(search->pages, cmd->num);
if (bridge->cache) {
struct camu_post *post;
- al_array_foreach_ptr(page->posts, j, post) {
- camu_post_cache_push(bridge->cache, post);
+ al_array_foreach_ptr(result.page->posts, j, post) {
+ camu_post_cache_push(bridge->cache, post, false);
}
}
- result.page = page;
}
break;
}
@@ -205,39 +209,41 @@ void camu_portal_close(struct camu_portal_bridge *bridge)
nn_mutex_unlock(&bridge->mutex);
nn_thread_join(&bridge->thread);
nn_signal_stop(&bridge->results_signal);
- camu_queue_free(bridge->results);
- al_array_free(bridge->queue);
- nn_cond_destroy(&bridge->cond);
- nn_mutex_destroy(&bridge->mutex);
}
-/*
-struct camu_search *camu_portal_get_search(struct camu_portal_bridge *bridge, s32 id)
+void camu_portal_free(struct camu_portal_bridge *bridge)
{
+ nn_cond_destroy(&bridge->cond);
+ nn_mutex_destroy(&bridge->mutex);
+ camu_queue_free(bridge->results);
+
struct camu_search *search;
al_array_foreach(bridge->searches, i, search) {
- if (search->id == id) return search;
+ al_str_free(&search->module);
+ al_str_free(&search->query);
+ struct camu_result_page *page;
+ al_array_foreach_ptr(search->pages, j, page) {
+ al_array_free(page->posts);
+ str *unique_id;
+ al_array_foreach_ptr(page->list, k, unique_id) {
+ al_str_free(unique_id);
+ }
+ al_array_free(page->list);
+ }
+ al_array_free(search->pages);
}
- return NULL;
-}
-void camu_portal_discard_search(struct camu_portal_bridge *bridge, s32 id)
-{
- (void)bridge;
- (void)id;
-}
-
-void camu_search_free(struct camu_search *search)
-{
- struct camu_result_page *page;
- al_array_foreach_ptr(search->pages, i, page) {
- // TODO: Free camu_post ?
- al_array_free(page->posts);
- al_array_free(page->list);
+ struct camu_portal_cmd *cmd;
+ al_array_foreach_ptr(bridge->queue, i, cmd) {
+ switch (cmd->op) {
+ case CAMU_CLIENT_CREATE_SEARCH:
+ al_str_free(&cmd->module);
+ al_str_free(&cmd->query);
+ break;
+ }
}
- al_array_free(search->pages);
+ al_array_free(bridge->queue);
}
-*/
static struct camu_result_page *page_at_index(struct camu_search *search, u32 num)
{
diff --git a/src/portal/src/search.h b/src/portal/src/search.h
index f870522..f7e42a2 100644
--- a/src/portal/src/search.h
+++ b/src/portal/src/search.h
@@ -66,6 +66,7 @@ void camu_portal_get_page(struct camu_portal_bridge *bridge, s32 id, u32 num,
void (*callback)(void *, void *, struct camu_portal_result *), void *userdata);
void camu_portal_close(struct camu_portal_bridge *bridge);
+void camu_portal_free(struct camu_portal_bridge *bridge);
/*
struct camu_search *camu_portal_get_search(struct camu_portal_bridge *bridge, s32 id);