verb: fix memory leaks

This commit is contained in:
2026-05-30 19:51:29 +01:00
parent 5d6f2a5ce8
commit 3b39f794f9
2 changed files with 36 additions and 24 deletions
+2
View File
@@ -124,6 +124,8 @@ FX_TYPE_CLASS_DECLARATION_BEGIN(bshell_verb)
FX_TYPE_CLASS_DECLARATION_END(bshell_verb) FX_TYPE_CLASS_DECLARATION_END(bshell_verb)
extern enum bshell_status bshell_init_all_verbs(void); extern enum bshell_status bshell_init_all_verbs(void);
extern enum bshell_status bshell_cleanup_all_verbs(void);
extern fx_hashtable *bshell_get_all_verbs(void); extern fx_hashtable *bshell_get_all_verbs(void);
extern bshell_verb *bshell_verb_get_by_id(enum bshell_verb_id id); extern bshell_verb *bshell_verb_get_by_id(enum bshell_verb_id id);
extern bshell_verb *bshell_verb_get_by_name(const char *name); extern bshell_verb *bshell_verb_get_by_name(const char *name);
+34 -24
View File
@@ -25,9 +25,8 @@ bshell_verb *bshell_verb_create(
return NULL; return NULL;
} }
struct bshell_verb_p *verb_p = fx_object_get_private( struct bshell_verb_p *verb_p
verb, = fx_object_get_private(verb, BSHELL_TYPE_VERB);
BSHELL_TYPE_VERB);
verb_p->v_id = id; verb_p->v_id = id;
verb_p->v_name = name; verb_p->v_name = name;
@@ -75,9 +74,8 @@ static fx_status get_name(
{ {
bshell_verb *verb = NULL; bshell_verb *verb = NULL;
fx_value_get_object(verb_v, &verb); fx_value_get_object(verb_v, &verb);
struct bshell_verb_p *verb_p = fx_object_get_private( struct bshell_verb_p *verb_p
verb, = fx_object_get_private(verb, BSHELL_TYPE_VERB);
BSHELL_TYPE_VERB);
*out = FX_CSTR(verb_p->v_name); *out = FX_CSTR(verb_p->v_name);
return FX_SUCCESS; return FX_SUCCESS;
@@ -90,9 +88,8 @@ static fx_status get_alias_prefix(
{ {
bshell_verb *verb = NULL; bshell_verb *verb = NULL;
fx_value_get_object(verb_v, &verb); fx_value_get_object(verb_v, &verb);
struct bshell_verb_p *verb_p = fx_object_get_private( struct bshell_verb_p *verb_p
verb, = fx_object_get_private(verb, BSHELL_TYPE_VERB);
BSHELL_TYPE_VERB);
*out = FX_CSTR(verb_p->v_alias_prefix); *out = FX_CSTR(verb_p->v_alias_prefix);
return FX_SUCCESS; return FX_SUCCESS;
} }
@@ -104,9 +101,8 @@ static fx_status get_group(
{ {
bshell_verb *verb = NULL; bshell_verb *verb = NULL;
fx_value_get_object(verb_v, &verb); fx_value_get_object(verb_v, &verb);
struct bshell_verb_p *verb_p = fx_object_get_private( struct bshell_verb_p *verb_p
verb, = fx_object_get_private(verb, BSHELL_TYPE_VERB);
BSHELL_TYPE_VERB);
*out = FX_CSTR(verb_p->v_group); *out = FX_CSTR(verb_p->v_group);
return FX_SUCCESS; return FX_SUCCESS;
} }
@@ -118,13 +114,17 @@ static fx_status get_description(
{ {
bshell_verb *verb = NULL; bshell_verb *verb = NULL;
fx_value_get_object(verb_v, &verb); fx_value_get_object(verb_v, &verb);
struct bshell_verb_p *verb_p = fx_object_get_private( struct bshell_verb_p *verb_p
verb, = fx_object_get_private(verb, BSHELL_TYPE_VERB);
BSHELL_TYPE_VERB);
*out = FX_CSTR(verb_p->v_description); *out = FX_CSTR(verb_p->v_description);
return FX_SUCCESS; return FX_SUCCESS;
} }
static void verb_fini(fx_object *obj, void *priv)
{
struct bshell_verb_p *verb = priv;
}
FX_TYPE_CLASS_BEGIN(bshell_verb) FX_TYPE_CLASS_BEGIN(bshell_verb)
FX_TYPE_VTABLE_INTERFACE_BEGIN(fx_object, FX_TYPE_OBJECT) FX_TYPE_VTABLE_INTERFACE_BEGIN(fx_object, FX_TYPE_OBJECT)
FX_INTERFACE_ENTRY(to_string) = NULL; FX_INTERFACE_ENTRY(to_string) = NULL;
@@ -143,6 +143,7 @@ FX_TYPE_DEFINITION_BEGIN(bshell_verb)
FX_TYPE_NAME("bshell.verb"); FX_TYPE_NAME("bshell.verb");
FX_TYPE_CLASS(bshell_verb_class); FX_TYPE_CLASS(bshell_verb_class);
FX_TYPE_INSTANCE_PRIVATE(struct bshell_verb_p); FX_TYPE_INSTANCE_PRIVATE(struct bshell_verb_p);
FX_TYPE_INSTANCE_FINI(verb_fini);
FX_TYPE_DEFINITION_END(bshell_verb) FX_TYPE_DEFINITION_END(bshell_verb)
static fx_hashtable *all_verbs_by_name = NULL; static fx_hashtable *all_verbs_by_name = NULL;
@@ -405,18 +406,18 @@ enum bshell_status bshell_init_all_verbs(void)
"dc", "dc",
"Communications", "Communications",
"Breaks the link between a source and a destination"); "Breaks the link between a source and a destination");
PUT_VERB(
READ,
"Read",
"rd",
"Communications",
"Acquires information from a source");
PUT_VERB( PUT_VERB(
RECEIVE, RECEIVE,
"Receive", "Receive",
"rc", "rc",
"Communications", "Communications",
"Accepts information sent from a source"); "Accepts information sent from a source");
PUT_VERB(
READ,
"Read",
"rd",
"Communications",
"Acquires information from a source");
PUT_VERB( PUT_VERB(
SEND, SEND,
"Send", "Send",
@@ -788,6 +789,16 @@ enum bshell_status bshell_init_all_verbs(void)
return BSHELL_SUCCESS; return BSHELL_SUCCESS;
} }
enum bshell_status bshell_cleanup_all_verbs(void)
{
for (size_t i = 0; i < __BSHELL_VERB_MAX; i++) {
all_verbs_by_id[i] = NULL;
}
fx_hashtable_unref(all_verbs_by_name);
return BSHELL_SUCCESS;
}
fx_hashtable *bshell_get_all_verbs(void) fx_hashtable *bshell_get_all_verbs(void)
{ {
return all_verbs_by_name; return all_verbs_by_name;
@@ -804,9 +815,8 @@ bshell_verb *bshell_verb_get_by_id(enum bshell_verb_id id)
bshell_verb *bshell_verb_get_by_name(const char *name) bshell_verb *bshell_verb_get_by_name(const char *name)
{ {
const fx_value *val = fx_hashtable_get( const fx_value *val
all_verbs_by_name, = fx_hashtable_get(all_verbs_by_name, &FX_CSTR(name));
&FX_CSTR(name));
if (!val) { if (!val) {
return NULL; return NULL;
} }