aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorcbdev <cb@cbcdn.com>2020-03-28 01:09:58 +0100
committercbdev <cb@cbcdn.com>2020-03-28 01:09:58 +0100
commit5fdb638454ce90eb565555dfece5030a2ec4a576 (patch)
treeaad6dff626be4eac5779e5661f978ab6557e70ac
parent253125ea28925e5207c375987ac36468327bed66 (diff)
downloadmidimonster-5fdb638454ce90eb565555dfece5030a2ec4a576.tar.gz
midimonster-5fdb638454ce90eb565555dfece5030a2ec4a576.tar.bz2
midimonster-5fdb638454ce90eb565555dfece5030a2ec4a576.zip
Fix reference counting bug and lua timing
-rw-r--r--backends/lua.c6
-rw-r--r--backends/python.c7
2 files changed, 7 insertions, 6 deletions
diff --git a/backends/lua.c b/backends/lua.c
index 127933a..e2f3b0e 100644
--- a/backends/lua.c
+++ b/backends/lua.c
@@ -533,7 +533,8 @@ static int lua_set(instance* inst, size_t num, channel** c, channel_value* v){
}
static int lua_handle(size_t num, managed_fd* fds){
- uint64_t delta = timer_interval;
+ uint64_t delta = mm_timestamp() - last_timestamp;
+ last_timestamp = mm_timestamp();
size_t n;
#ifdef MMBACKEND_LUA_TIMERFD
@@ -547,9 +548,6 @@ static int lua_handle(size_t num, managed_fd* fds){
LOGPF("Failed to read timer: %s", strerror(errno));
return 1;
}
- #else
- delta = mm_timestamp() - last_timestamp;
- last_timestamp = mm_timestamp();
#endif
//no timers active
diff --git a/backends/python.c b/backends/python.c
index 4c9248d..94f8e24 100644
--- a/backends/python.c
+++ b/backends/python.c
@@ -1,4 +1,5 @@
#define BACKEND_NAME "python"
+#define DEBUG
#define PY_SSIZE_T_CLEAN
#include <string.h>
@@ -269,9 +270,11 @@ static PyObject* mmpy_cleanup_handler(PyObject* self, PyObject* args){
}
if(data->cleanup_handler == Py_None){
+ DBGPF("Cleanup handler removed on %s (previously %s)", inst->name, current_handler ? "active" : "inactive");
data->cleanup_handler = NULL;
}
else{
+ DBGPF("Cleanup handler installed on %s (previously %s)", inst->name, current_handler ? "active" : "inactive");
Py_INCREF(data->cleanup_handler);
}
@@ -280,7 +283,7 @@ static PyObject* mmpy_cleanup_handler(PyObject* self, PyObject* args){
return Py_None;
}
- Py_DECREF(current_handler);
+ //do not decrease refcount on current_handler here as the reference may be used by python code again
return current_handler;
}
@@ -595,6 +598,7 @@ static int python_handle(size_t num, managed_fd* fds){
//if timer expired, call handler
if(interval[u].delta >= interval[u].interval){
interval[u].delta %= interval[u].interval;
+ DBGPF("Calling interval handler %" PRIsize_t ", last delta %" PRIu64, u, delta);
//swap to interpreter
PyEval_RestoreThread(interval[u].interpreter);
@@ -603,7 +607,6 @@ static int python_handle(size_t num, managed_fd* fds){
Py_XDECREF(result);
//release interpreter
PyEval_ReleaseThread(interval[u].interpreter);
- DBGPF("Calling interval handler %" PRIsize_t, u);
}
}
}