diff --git a/.gitignore b/.gitignore index d7fe4be24..4c88e89c2 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,5 @@ koreader-arm-linux-gnueabi koreader-arm-linux-gnueabihf koreader-i686-w64-mingw32 koreader-x86_64-linux-gnu +koreader-x86_64-pc-linux-gnu diff --git a/frontend/ui/message/streammessagequeue.lua b/frontend/ui/message/streammessagequeue.lua index bf51a005b..58ed30931 100644 --- a/frontend/ui/message/streammessagequeue.lua +++ b/frontend/ui/message/streammessagequeue.lua @@ -57,7 +57,13 @@ end function StreamMessageQueue:waitEvent() local data = "" - while czmq.zpoller_wait(self.poller, 0) ~= nil do + -- Successive zframes may be tens or hundreds in some cases + -- if they are concatenated in a single loop it may run up memory of the + -- machine. And it did happened when receiving file data from Calibre server. + -- Here we receive only receive 10 packages at most in one waitEvent loop, and + -- call receiveCallback immediately. + local wait_packages = 10 + while czmq.zpoller_wait(self.poller, 0) ~= nil and wait_packages > 0 do local id_frame = czmq.zframe_recv(self.socket) if id_frame ~= nil then local id = self:handleZframe(id_frame) @@ -66,6 +72,7 @@ function StreamMessageQueue:waitEvent() if frame ~= nil then data = data .. (self:handleZframe(frame) or "") end + wait_packages = wait_packages - 1 end if self.receiveCallback and data ~= "" then self.receiveCallback(data) diff --git a/frontend/ui/uimanager.lua b/frontend/ui/uimanager.lua index e9a1de150..de9beb7d8 100644 --- a/frontend/ui/uimanager.lua +++ b/frontend/ui/uimanager.lua @@ -322,7 +322,9 @@ function UIManager:run() local force_partial_refresh = false local force_fast_refresh = false for _, widget in ipairs(self._window_stack) do - if self.repaint_all or self._dirty[widget.widget] then + -- paint if repaint_all is request + -- paint also if current widget or any widget underneath is dirty + if self.repaint_all or dirty or self._dirty[widget.widget] then widget.widget:paintTo(Screen.bb, widget.x + Screen:offsetX(), widget.y + Screen:offsetY()) diff --git a/plugins/calibrecompanion.koplugin/main.lua b/plugins/calibrecompanion.koplugin/main.lua index 69afa6310..440c079e8 100644 --- a/plugins/calibrecompanion.koplugin/main.lua +++ b/plugins/calibrecompanion.koplugin/main.lua @@ -332,6 +332,7 @@ function CalibreCompanion:sendBook(arg) -- switching to raw data receiving mode self.calibre_socket.receiveCallback = function(data) --DEBUG("receive file data", #data) + --DEBUG("Memory usage KB:", collectgarbage("count")) local to_write_data = data:sub(1, to_write_bytes) outfile:write(to_write_data) to_write_bytes = to_write_bytes - #to_write_data