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:
parent
b2e6a6438f
commit
287b3f1758
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue