mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-21 09:46:31 +00:00
Merge pull request #16741 from s-hadinger/lvgl_fix_leak
LVGL fix potential memory leak
This commit is contained in:
commit
35c6d148c4
@ -12,6 +12,10 @@
|
|||||||
#include "be_vm.h"
|
#include "be_vm.h"
|
||||||
#include "be_mem.h"
|
#include "be_mem.h"
|
||||||
|
|
||||||
|
// Tasmota Logging
|
||||||
|
extern void tasmota_log_C(uint32_t loglevel, const char * berry_buf, ...);
|
||||||
|
enum LoggingLevels {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE};
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
* Callback structures
|
* Callback structures
|
||||||
*
|
*
|
||||||
@ -185,6 +189,7 @@ static int32_t be_cb_make_cb(bvm *vm) {
|
|||||||
\*********************************************************************************************/
|
\*********************************************************************************************/
|
||||||
static int32_t be_cb_gen_cb(bvm *vm) {
|
static int32_t be_cb_gen_cb(bvm *vm) {
|
||||||
int32_t top = be_top(vm);
|
int32_t top = be_top(vm);
|
||||||
|
// tasmota_log_C(LOG_LEVEL_DEBUG, "BRY: gen_cb() called");
|
||||||
if (top >= 1 && be_isfunction(vm, 1)) {
|
if (top >= 1 && be_isfunction(vm, 1)) {
|
||||||
// find first available slot
|
// find first available slot
|
||||||
int32_t slot;
|
int32_t slot;
|
||||||
|
@ -32,9 +32,16 @@ class LVGL_glob
|
|||||||
end
|
end
|
||||||
|
|
||||||
#- register an lv.lv_* object in the mapping -#
|
#- register an lv.lv_* object in the mapping -#
|
||||||
|
#
|
||||||
|
# returns `true` if it was already present, false instead
|
||||||
def register_obj(obj)
|
def register_obj(obj)
|
||||||
if self.cb_obj == nil self.cb_obj = {} end
|
if self.cb_obj == nil self.cb_obj = {} end
|
||||||
self.cb_obj[obj._p] = obj
|
if self.cb_obj.contains(obj._p)
|
||||||
|
return true
|
||||||
|
else
|
||||||
|
self.cb_obj[obj._p] = obj
|
||||||
|
return false
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# get event callback by rank number, expand the list if needed
|
# get event callback by rank number, expand the list if needed
|
||||||
@ -115,13 +122,32 @@ class LVGL_glob
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# remove all references to an object when `lv.EVENT_DELETE` is triggered
|
||||||
|
def remove_cb(obj)
|
||||||
|
import introspect
|
||||||
|
var obj_ptr = obj._p
|
||||||
|
# print(">>> DELETE",obj,obj_ptr)
|
||||||
|
self.deregister_obj(obj_ptr)
|
||||||
|
# print(self.cb_event_closure)
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# Warning: `make_cb` is called by `cb.gen_cb()` as a cb handler.
|
||||||
|
# Calling back `cb.gen_cb()` should be done with caution to avoid infinite loops.
|
||||||
|
#
|
||||||
def make_cb(f, obj, name)
|
def make_cb(f, obj, name)
|
||||||
|
# fast exit if not for us
|
||||||
|
if name == nil return nil end
|
||||||
|
|
||||||
import cb
|
import cb
|
||||||
# print('>> make_cb', f, name, obj)
|
# print('>> make_cb', f, name, obj)
|
||||||
# record the object, whatever the callback
|
# record the object, whatever the callback
|
||||||
|
|
||||||
if name == "lv_event_cb"
|
if name == "lv_event_cb"
|
||||||
self.register_obj(obj) # keep a record of the object to prevent from being gc'ed
|
var first_cb = !self.register_obj(obj) # keep a record of the object to prevent from being gc'ed
|
||||||
|
if first_cb # first time we register a CB for this object, register also a DELETE event
|
||||||
|
obj.add_event_cb(/ o -> self.remove_cb(o), lv.EVENT_DELETE, 0)
|
||||||
|
end
|
||||||
var rank = self.add_cb_event_closure(obj._p, f)
|
var rank = self.add_cb_event_closure(obj._p, f)
|
||||||
# if self.cb_event_closure.contains(obj._p)
|
# if self.cb_event_closure.contains(obj._p)
|
||||||
# tasmota.log("LVG: object:" + str(obj) + "has already an event callback", 2)
|
# tasmota.log("LVG: object:" + str(obj) + "has already an event callback", 2)
|
||||||
|
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user