2013-06-19 2 views
3

luajit에서 콜백을 시도하려면 다음과 같은 qsort 예제가 있습니다. 그러나 그것은 나에게 명백하지 않은 메모리 누수 (실행시 luajit: not enough memory)가 있습니다.luajit qsort 콜백 예제 메모리 누수

누군가 적절한 콜백 예제를 만드는 방법에 대한 힌트를 줄 수 있습니까?

local ffi = require("ffi") 

-- =============================================================================== 

ffi.cdef[[ 
    void qsort(void *base, size_t nel, size_t width, int (*compar)(const void *, const void *)); 
]] 


function compare(a, b) 
    return a[0] - b[0] 
end 

-- =============================================================================== 

-- Explicitly convert to a callback via cast 
local callback = ffi.cast("int (*)(const char *, const char *)", compare) 

local data  = "efghabcd" 
local size  = 8 
local loopSize = 1000 * 1000 * 100. 

local bytes = ffi.new("char[15]") 

-- =============================================================================== 

for i=1,loopSize do 
    ffi.copy(bytes, data, size) 
    ffi.C.qsort(bytes, size, 1, callback) 
end 

플랫폼 : OSX 10.8 는 luajit : 2.0.1

+0

더 구체적으로 설명을 업데이트하고 코드에 잘못된 var에 이름을 고정. – camillobruni

+0

당신은'collectgarbage()'콜을 루프 – finnw

+1

에 넣어 다른 사람들을위한 정보를 추가 할 수 있습니다 - 마이크가 방금 고쳤습니다 - http://www.freelists.org/post/luajit/Beginners-FFI-callback- memory-leak, 2 – malkia

답변

1

문제는 루아가 결코 꽉 루프 내에서 전체 가비지 컬렉션 사이클을 수행 할 수있는 기회를 얻을 수 없을 것으로 보인다. 의견에 암시 된 바와 같이, collectgarbage()을 루프 내부에서 직접 호출하여이를 수정할 수 있습니다.

반복 할 때마다 collectgarbage()을 호출하면 벤치를 실행하는 시간에 영향을 미칩니다. 이 문제를 최소화하기 위해, 당신은 collectgarbage()가 호출되는 빈도를 제한하는 임계 값을 설정해야합니다

local memthreshold = 2^20/1024 
local start = os.clock() 
for i = 1, loopSize do 
    ffi.copy(bytes, data, size) 
    ffi.C.qsort(bytes, size, 1, callback) 
    if collectgarbage'count' > memthreshold then 
     collectgarbage() 
    end 
end 
local elapse = os.clock() - start 
print("elapsed:", elapse..'s') 
+0

이 경우'collectgarbage()'를 사용하면 증상을 해결합니다. 위의 설명에서 설명한 바와 같이 이것은 버그였습니다. – camillobruni

+1

@ dh82 최신 LuaJIT-2.0.2 다운로드에는 여전히이 버그가있는 것 같습니다. 방금 mingw로 빌드하고 예제 스크립트를 다시 테스트했습니다. 아직 mem이 부족하여 오류가 발생합니다. – greatwolf

+1

@greatwolf, LuaJIT-2.0.2가 2013-06-03에 릴리스되었으며 버그가 2013-06-20 (17 일 후)에 수정되어 메일 링리스트에 나타납니다. 따라서이 문제를 해결하려면 git HEAD를 컴파일하십시오. 가능한 경우 Mike Pall이 권장합니다. 그의 워크 플로우에서 git head는 출시되지 않은 경우에도 항상 최신 수정판이 포함 된 안정 버전을 포함합니다. – Aktau