본문 바로가기

프로그래밍/API

luaL_newthread() - gc를 피하는 방법~

lua의 state를 분리하는 함수중에 lua_newthread()라는 함수가 있다.
처음 lua를 접하는 개발자라면 이름만 보고, thread를 만들어 주는 함수로 이해하는 경우가 많다.

그러나, 해당 함수는 lua의 state를 만들어 주는 역활을 하기 때문이다.
문제는 해당 함수를 통해 만드는 state는 상위(parent)의 메모리 영역에 존재하기 때문에 parent의 state에서
gc가 발생될 경우 만들어진 state가 메모리에서 제거되어 오동작 하는 경우를 만나게 된다.

이때 사용하면 좋은 방식으로, lua가 만들어진 state를 강제로 gc하지 못하도록 하는 역활을 한다.

lua_State *luaL_newthread( lua_State *L, int *pSave)
{
 lua_State *NL; {
  if ((NL = lua_newthread( L ?: lua_open())) == NULL)
   return NULL;
  else {
   (*pSave) = lua_ref( L, 1);
  } /* luaL_namespace( NL); */
 } return NL;
}

간단하지 않는가~ 단지, 생성된 state를 ref처리 하므로써 gc되지 못하게 했다.
반대로, state를 gc되도록 하고자 한다면 lua_unref()로 *pSave에 저장된 ref를 해제하면 된다.