diff options
| author | 2025-01-24 18:14:52 -0500 | |
|---|---|---|
| committer | 2025-01-24 18:14:52 -0500 | |
| commit | f638237a6b4f3d3edf9bdd995c15df537f8d7e7c (patch) | |
| tree | 44efce6d912c43f67548690256879d036e22e742 /src/portal | |
| parent | 2daa31c0629f2eb4af84d6f4fed8ac89813de056 (diff) | |
| download | camu-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.c | 26 | ||||
| -rw-r--r-- | src/portal/src/post.h | 1 | ||||
| -rw-r--r-- | src/portal/src/post_cache.c | 22 | ||||
| -rw-r--r-- | src/portal/src/post_cache.h | 3 | ||||
| -rw-r--r-- | src/portal/src/search.c | 70 | ||||
| -rw-r--r-- | src/portal/src/search.h | 1 |
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); |