• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос как устранить утечку памяти

shavrin777

New member
вот сервер что смог устранил , но память течёт
Код:
-- Close old Server
if httpd then
httpd:close()
httpd = nil
collectgarbage()
end

httpd=net.createServer(net.TCP)

-- decode URI
local function decodeURI(s)
    if(s) then
        s = string.gsub(s, '%%(%x%x)',
        function (hex) return string.char(tonumber(hex,16)) end )
    end
    return s
end

local function receive_http(sck, data)
  -- sendfile class
  sendfile = {}
  sendfile.__index = sendfile
  function sendfile.new(sck, fname)
    local self = setmetatable({}, sendfile)
    self.sck = sck
    self.fd = file.open(fname, "r")
    if self.fd then
       function send(localSocket)
        local response = self.fd:read(128)
        if response then
          localSocket:send(response)
        else
          if self.fd then
            self.fd:close()
          end
          localSocket:close()
        end
        response = nil
        collectgarbage()
      end
      self.sck:on("sent", send)
      send(self.sck)
    else
        localSocket:close()
    end
    localSocket = nil
    fname = nil
    collectgarbage()
    collectgarbage()
    return self
  end
  -----
  local host_name = string.match(data,"Host: ([0-9,\.]*)\r",1)
  local url_file = string.match(data,"[^/]*\/([^ ?]*)[ ?]",1)
  local uri = decodeURI(string.match(data,"[^?]*\?([^ ]*)[ ]",1))
  -- parse GET parameters
  local GET={}
  if uri then
    for key, value in string.gmatch(uri, "([^=&]*)=([^&]*)") do
     GET[key]=value
     print(key, value)
     key = nil
     value = nil
     cillectgarbage()
    end
  end
  -- parse POST parameters
  local post = string.match(data,"\n([^\n]*)$",1):gsub("+", " ")
  local POST={}
  if post then
    for key, value in string.gmatch(post, "([^=&]*)=([^&]*)") do
     POST[key]=decodeURI(value)
     print(key, POST[key])
     key = nil
     value = nil
     cillectgarbage()
    end
  end

  print("HTTP request:", data)

  request_OK = false

  -- if file not specified then send index.html
  if url_file == '' then
    sendfile.new(sck, 'index.html')
    self = nil
    sendfile = nil
    fext = nil
    sck = nil
    collectgarbage()
    request_OK = true
  else
    local fext=url_file:match("^.+(%..+)$")
    if fext == '.html' or
       fext == '.txt' or
       fext == '.js' or
       fext == '.json' or
       fext == '.css' or
       fext == '.png' or
       fext == '.gif' or
       fext == '.ico' then
       if file.exists(url_file) then
           sendfile.new(sck, url_file)
           self = nil
           sendfile = nil
           fext = nil
           url_file = nil
           sck = nil
           collectgarbage()
           request_OK = true
       end
    end

    -- execute LUA file
    -- IT IS HAZARDOUS
    if fext == '.lua' or fext == '.lc' then
      if file.exists(url_file) then
        local response=dofile(url_file)
        sck:on("sent", function() sck:close() end)
        sck:send(response)
        response = nil
        self = nil
        sendfile = nil
        fext = nil
        sck = nil
        collectgarbage()
        request_OK = true
      end
    end
    fext = nil
  end

  if request_OK == false then
    sck:on("sent", function() sck:close() end)
    sck:send('<html><h1>Error 404</h1></html>')
    sck = nil
  end
 
  response = nil
  data = nil
  POST = nil
  request_OK = nil
  post = nil
  self = nil
  fext = nil
  value = nil
  GET = nil
  key = nil
  host_name = nil
  url_file = nil
  uri = nil
  sck = nil
  collectgarbage()
  collectgarbage()
  collectgarbage()
  collectgarbage()
 
end

if httpd then
  httpd:listen(80, function(conn)
    conn:on("receive", receive_http)
    conn = nil
    collectgarbage()
  end)
end
 

nikolz

Well-known member
вот сервер что смог устранил , но память течёт
Попробуйте изменить структуру программы
типа так:
сначала инициализация
потом запуск таймера в колбэке которого что-то делаете
а в колбеке сервера обработка ответа от сервера.
А то у вас какая-то странная программа для луа получилась нет цикла ожидания или колбека таймера.
 
Сверху Снизу