clients: simple-im: handle proper destruction of objects

Add signal handler for SIGINT to enable graceful exit and
release allocated memory. This resolves the memory leak
observed with Valgrind:

  LEAK SUMMARY:
    definitely lost: 2,520 bytes in 2 blocks
    indirectly lost: 16,820 bytes in 11 blocks
      possibly lost: 0 bytes in 0 blocks
    still reachable: 0 bytes in 0 blocks
         suppressed: 0 bytes in 0 blocks

Fixes: https://gitlab.freedesktop.org/wayland/weston/-/issues/872

Signed-off-by: Chirag Khurana <quic_ckhurana@quicinc.com>
This commit is contained in:
Chirag Khurana 2024-05-21 17:06:40 +05:30 committed by Marius Vlad
parent b2e6a6438f
commit 287b3f1758
1 changed files with 33 additions and 1 deletions

View File

@ -30,6 +30,7 @@
#include <unistd.h> #include <unistd.h>
#include <errno.h> #include <errno.h>
#include <sys/mman.h> #include <sys/mman.h>
#include <signal.h>
#include <linux/input.h> #include <linux/input.h>
@ -105,6 +106,8 @@ static const uint32_t ignore_keys_on_compose[] = {
XKB_KEY_Shift_R XKB_KEY_Shift_R
}; };
static int running = 1;
static void static void
handle_surrounding_text(void *data, handle_surrounding_text(void *data,
struct zwp_input_method_context_v1 *context, struct zwp_input_method_context_v1 *context,
@ -481,10 +484,17 @@ simple_im_key_handler(struct simple_im *keyboard,
text); text);
} }
static void
signal_int(int signum)
{
running = 0;
}
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
struct simple_im simple_im; struct simple_im simple_im;
struct sigaction sigint;
int ret = 0; int ret = 0;
memset(&simple_im, 0, sizeof(simple_im)); memset(&simple_im, 0, sizeof(simple_im));
@ -514,9 +524,31 @@ main(int argc, char *argv[])
simple_im.context = NULL; simple_im.context = NULL;
simple_im.key_handler = simple_im_key_handler; simple_im.key_handler = simple_im_key_handler;
while (ret != -1) sigint.sa_handler = signal_int;
sigemptyset(&sigint.sa_mask);
sigint.sa_flags = SA_RESETHAND;
sigaction(SIGINT, &sigint, NULL);
while (running && ret != -1)
ret = wl_display_dispatch(simple_im.display); ret = wl_display_dispatch(simple_im.display);
if (simple_im.input_method)
zwp_input_method_v1_destroy(simple_im.input_method);
if (simple_im.context)
zwp_input_method_context_v1_destroy(simple_im.context);
if (simple_im.keyboard)
wl_keyboard_destroy(simple_im.keyboard);
xkb_context_unref(simple_im.xkb_context);
xkb_state_unref(simple_im.state);
xkb_keymap_unref(simple_im.keymap);
wl_registry_destroy(simple_im.registry);
wl_display_flush(simple_im.display);
wl_display_disconnect(simple_im.display);
if (ret == -1) { if (ret == -1) {
fprintf(stderr, "Dispatch error: %s\n", strerror(errno)); fprintf(stderr, "Dispatch error: %s\n", strerror(errno));
return -1; return -1;