본문 바로가기

프로그래밍

(38)
lua에서 비트연산을 사용하기 위한 패치를.... lua를 사용해서 알고리즘을 만들다 보면, 불편한것 중에 하나가 비트연산이 없다는 것이다. 아래에 비트연산을 하기위한 패치 파일을 올린다.. 많은 도움이 되시길~~ 이 패치파일은 필요에 따라서 약간의 커스터마이징(일부 연산자를 약간 수정했다)을 한 패치파일임을 밝혀둔다. 지원하는 연산자는 >>(RSHIFT), >4)) a,b=0xF,4 print(hex(a)..""..b,"=",hex(a>>b))
메모리풀 이야기~ 프로그래밍을 할때 가장 많이 호출되는 함수중에 하나가 메모리 할당과 해제에 관련된 함수이다. C개발자라면 메모리 할당과 해제를 직접 제어할수 있지만, C++ 개발자라면 알게 모르게 호출되어진다. 그러다 보니, 메모리의 효율성을 많이 따지게 되는데.. 나 또한 C++ 기반에서 프로그램을 많이 하게 된다. 그래서 자연스럽게 메모리 풀에 관심을 가지게 되고 사용을 한다. 아래에 소개하는 소스는 내가 사용하는 메모리 풀의 헤더파일로, STL과 같은 allocator를 대신해 사용할수 있도록 만들어져 있다. (STL을 사용할때 많은 도움이 된다. -- boost를 사용해도 좋을듯 하다.) template 기반으로 되어 있으니 도움이 되지 않을까 생각해 올린다~ * pool.hpp #ifndef __POOL_HPP..
Linux에서 stack trace 출력 Java로 개발을 해본 개발자라면 프로그램에 문제가 발생되었을때 stack trace가 출력된다는데 상당한 매력을 느낀 개발자가 많을 것이라는 것이다. 이러한 출력이 C/C++에서도 구현이 된다면 얼마나 좋을까 하는 생각을 많이들 해봤을 것이다. 그래서 준비했다.. 즐겨 보시길~ #include void debugTrace( int ndepth) { void *array[ndepth]; int size = backtrace( array, ndepth); char **symbols = backtrace_symbols( array, size); while ((--size) >= 0) fprintf( stderr, " %2.i: %s\n", size + 1, symbols[size]); } 이 함수를 호출하는..
Linux에서의 Coroutine... Windows는 Fiber라는 우수한 coroutine 함수가 존재한다. 그렇지만, Linux에서는 이러한 함수가 없다. 즉, 구현을 해야 한다는 말이다. 일부에서는 이러한 처리를 위해 setjmp()함수의 REG값을 조작하여 처리하는 방식을 사용하기도 한다. 여기에서는 setjmp() 계열의 함수를 사용하는 것이 아니라, Windows의 GetThreadContext(), SetThreadContext() 와 유사한 함수를 사용한 방법을 소개 하도록 하겠다. ** setjmp에 관련된 처리는 인터넷을 통해 어렵지 않게 찾을수 있을 것이다. 리눅스에는 #include void makecontext(ucontext_t *ucp, void (*func)(), int argc...); int swapconte..
Windows에서 Coroutine 구현에 필요한 함수 Windows에는 LPVOID WINAPI CreateFiber( __in SIZE_T dwStackSize, __in LPFIBER_START_ROUTINE lpStartAddress, __in_opt LPVOID lpParameter ); 계열의 함수가 존재한다. MSDN의 CreateFiber()를 사용한 예제이다. #include #include #include VOID __stdcall ReadFiberFunc(LPVOID lpParameter); VOID __stdcall WriteFiberFunc(LPVOID lpParameter); void DisplayFiberInfo(void); typedef struct { DWORD dwParameter; // DWORD parameter to fi..
luaL_call() 함수 구현 - 파라메터를 넣어 호출하는 방법에 대해~ 스크립터를 embed시켜 사용하는 경우, 가장 많이 사용하는 함수가 바로, 스크립터에 존재하는 함수를 C/C++에서 호출하는 경우이다. 이때, 문제가 생겼을때 traceback이 기본적으로 필요하게 되고, 여기에 여러개의 arg를 넘겨줘야 하는 경우 함수를 호출하기 위해 개발자의 수고가 필요하다. 다음 함수는 이러한 처리를 간단히 만들어 주는 역활을 하는 함수이다~ int luaL_pcall( lua_State *L, int f, int nargs) /* f arg1 arg2 ... argn */ { int base = lua_gettop( L) - nargs; /* arg1 arg2 ... argn */ switch (f) { default: if (!lua_isfunction( L, f)) break..
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 *..
luaL_namespace() - 독립된 namespace 생성... lua로 개발하다 보면 기본 namespace와 독립적인 공간이 필요할때가 있다. 즉, _G와 분리된 공간.. 아래 소스는 이러한 처리를 해 주는 소스로, _G와 독립된 namespace를 갖도록 만들어 준다. void luaL_namespace( lua_State *L) { lua_newtable( L); { /* T1: global */ lua_newtable( L); { /* T2: metatable */ lua_pushliteral( L, "__index"); { lua_pushvalue( L, LUA_GLOBALSINDEX); } lua_settable( L, -3); /* T2에 __index 항목을 추가한다. */ } lua_setmetatable( L, -2); /* T1를 metatabl..