參考資訊:
https://jan.newmarch.name/Wayland/index.html
https://wayland.freedesktop.org/docs/html/apa.html
https://bugaevc.gitbooks.io/writing-wayland-clients/content/
main.c
#include <stdio.h> #include <wayland-client.h> void cb_handle(void *dat, struct wl_registry *reg, uint32_t id, const char *intf, uint32_t ver) { printf("%s, intf:%s, ver:%u, id:%u\n", __func__, intf, ver, id); } void cb_remove(void *dat, struct wl_registry *reg, uint32_t id) { printf("%s, %u\n", __func__, id); } int main(int argc, char **argv) { struct wl_display *dis = wl_display_connect(NULL); struct wl_registry *reg = wl_display_get_registry(dis); struct wl_registry_listener cb = { .global = cb_handle, .global_remove = cb_remove }; wl_registry_add_listener(reg, &cb, NULL); wl_display_dispatch(dis); wl_display_roundtrip(dis); wl_display_disconnect(dis); return 0; }
編譯、執行
$ gcc main.c -o main -lwayland-client -ggdb $ valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --verbose --log-file=log.txt ./main $ cat log.txt ==2893== HEAP SUMMARY: ==2893== in use at exit: 80 bytes in 1 blocks ==2893== total heap usage: 27 allocs, 26 frees, 22,144 bytes allocated ==2893== ==2893== Searching for pointers to 1 not-freed blocks ==2893== Checked 93,032 bytes ==2893== ==2893== 80 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==2893== at 0x486D71C: calloc (vg_replace_malloc.c:1328) ==2893== by 0x4899B3F: ??? (in /usr/lib64/libwayland-client.so.0.3.0) ==2893== by 0x489A1CB: wl_proxy_marshal_array_constructor_versioned (in /usr/lib64/libwayland-client.so.0.3.0) ==2893== by 0x489A4B7: wl_proxy_marshal_constructor (in /usr/lib64/libwayland-client.so.0.3.0) ==2893== by 0x4008E7: wl_display_get_registry (wayland-client-protocol.h:1052) ==2893== by 0x4009C7: main (main.c:17) ==2893== ==2893== LEAK SUMMARY: ==2893== definitely lost: 80 bytes in 1 blocks ==2893== indirectly lost: 0 bytes in 0 blocks ==2893== possibly lost: 0 bytes in 0 blocks ==2893== still reachable: 0 bytes in 0 blocks ==2893== suppressed: 0 bytes in 0 blocks ==2893== ==2893== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
P.S. 經由Valgrind的Log,可以發現wl_display_get_registry()配置的記憶體沒有被釋放掉,也就是沒有呼叫wl_registry_destroy()去釋放記憶體
main.c(修改後)
#include <stdio.h> #include <wayland-client.h> void cb_handle(void *dat, struct wl_registry *reg, uint32_t id, const char *intf, uint32_t ver) { printf("%s, intf:%s, ver:%u, id:%u\n", __func__, intf, ver, id); } void cb_remove(void *dat, struct wl_registry *reg, uint32_t id) { printf("%s, %u\n", __func__, id); } int main(int argc, char **argv) { struct wl_display *dis = wl_display_connect(NULL); struct wl_registry *reg = wl_display_get_registry(dis); struct wl_registry_listener cb = { .global = cb_handle, .global_remove = cb_remove }; wl_registry_add_listener(reg, &cb, NULL); wl_display_dispatch(dis); wl_display_roundtrip(dis); wl_registry_destroy(reg); wl_display_disconnect(dis); return 0; }
編譯、執行
$ gcc main.c -o main -lwayland-client -ggdb $ valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --verbose --log-file=log.txt ./main $ cat log.txt ==3014== HEAP SUMMARY: ==3014== in use at exit: 0 bytes in 0 blocks ==3014== total heap usage: 27 allocs, 27 frees, 22,144 bytes allocated ==3014== ==3014== All heap blocks were freed -- no leaks are possible ==3014== ==3014== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)