본문 바로가기

프로그래밍/API

(32)
TIP. fork() 시 callback 처리 LINUX에서 fork() 함수를 사용하는 경우, fork 전후의 처리를 해야하는 상황이 있다. 일반적으로는 pid_t pid; if ((pid = fork()) 0) { // parent } 와 같은 형태로 처리해도 되지만, pthread_atfork()를 사용하면 좀더 효율적인 처리가 가능하다. void fork_ready() { fprintf(stderr, "fork() 전\n"); } void fork_child() { fprintf(stderr, "fork() 이후 - CHILD\n"); } void fork_parent() { fprintf(stderr, "fork() 이후 - PA..
TIP. EPOLLONESHOT 사용 이슈 LINUX에서 네트워크 이벤트를 처리하기 위해 사용하는 방식으로 epoll을 많이 사용한다. 장점이 많은데 epoll의 장점 중 하나가 EPOLLONESHOT이라는 플레그가 있다. EPOLLONESHOT의 용도는 이벤트가 발생될때 한번만 발생되고, 대기상태로 진입하게 하는 특성을 가진다. 그런데, 문제가 하나 있다. - 이벤트가 발생된 이후에, 이벤트를 재 설정(epoll_ctl(EPOLL_CTL_MOD)) 하면서 발생하게 된다. - 설정 이후에, 소켓의 이벤트가 발생되지 않는 문제가 바로 그것이다. 이는 최근 커널에서 EPOLLWAKEUP 으로 해결이 되었는데, 지원하지 않은 경우는 다음 방식을 사용하면 된다. ioctl(fd, FIONREAD, &nread); 단, 소켓에서만 해당 syscall을 사..
함수 invoke~ 예전에도 몇번 올린 내용이지만, 처음 만들게 된 계기는 바로 coroutine을 구현 하면서 였다.. 함수에 대한 주소만 가지고 함수를 호출해야 하는 상황이 되는데, 문제는 기존의 방식으로는 제한된 함수의 인자만을 가질수 있다는 것이다. 즉, 다양한 인자를 갖는 함수를 다룰수가 없다는 문제가 있다. 기본의 방식은.. DWORD (*CALLBACK)( LPVOID args) = &CALLBACK_FUNC; 와 같이 접근해 처리해 주어야 한다는 것이었다. 얼마 지나지 않아, coroutine에 적재되는 함수의 형태에 따라 다양한 인자를 유동적으로 주고 싶어 졌다. 그래서 만든것이 invoke 함수이다. 이 함수는 기존방식 처럼 함수의 주소를 기반으로 접근을 하게 되지만, N개의 인자를 함수별로 별도로 줄수 ..
(remote) function dispatch~ 전에 관련 글을 쓰고 나서 오랜만에 그에 대한 글을 추가합니다. 이제 테스트를 마쳤습니다~ 간단한 자료형(point가 포함되지 않은)인 경우가 아닌, point 가 포함된 데이터를 넘겨서 처리하게 하려고 하니 파생적으로 여러가지 모듈이 추가로 개발되었네요.. 이제 IDL로 이러한 루틴을 Simple하게 만들 방법을 궁리해 봐야겠습니다~ struct sub_arg { int a; char *b; }; // 실행할 함수 int invoke_test( struct stat *fs, char *name, struct sub_arg *sub) { fprintf( stderr, " invoke: '%s'\n", name); fprintf( stderr, "\t fs.st_size: %ld\n", fs->st_siz..
IDL 컴파일러... IDL을 사용해 보려고, 우선 컴파일러 부터 찾아 보았습니다. 그중에 XPIDL이라는 컴파일러가 상당히 마음에 들었습니다. Mozilla 프로젝트의 XPCOM에 포함되어 있는 컴파일러 이면서, Gnome의 libIDL기반으로 개발이 되어 약간의 수정 만으로 원하는 컴파일러의 output을 만들수 있다는 장점이 있어 좋네요~ http://developer.mozilla.org/en/docs/XPIDL 제가 원하는 접근 방식과는 약간의 차이가 있지만, IDL이라는 interface가 살짝 마음에 드네요~ ^^~ 참, Windows Live Writer을 사용해 처음으로 BLOG글을 작성해 봤습니다~
패킷과 함수의 1:1 맵핑~ EncoreNet의 RMI가 IDL을 사용해 코드를 만들어 준다는 jacking님 말씀에.. IDL을 찾아 보았습니다. 윈도우에서 COM을 사용해 보지 않은 저로서는 상당히 어려워 보이더군요.. 초보자도 바로 사용하기에는 어려워 보였습니다^^; 그래서 제 나름대로 맵핑시키는 구조를 만들어 보기 위해, CoSingleInvoke() 라는 놈을 만들어 나름대로 최적화를 (어제 올린 부분의 오버헤드가 많아 asm으로 새로 만들었죠~) 해서 구조를 만들어 보려 하고 있습니다. 제가 원하는 스타일은 class Player: public wsaio::handler, public relevant::actor { public: // 자동 생성 필요 // INTERFACE { // BOOL PACKET_MOVE( Pla..
EncoreNet이라는 네트워크 프레임워크의 RMI??... GPGStudy를 통해 최근 배현직(imays)님이 만드신 EncoreNet이라는 네트워크 엔진을 보았습니다. 엔진에 대한 설명을 보면서, 게임에 상당히 최적화 되어 있다는 느낌을 받았습니다. 그 중에 RMI(Remote Method Invocation)라는 기능을 보았습니다. 함수 개발에 있어 상당히 매력적으로 보였습니다. Remote Method Invocation의 약자입니다. 일반적인 네트워크 프로그래밍에서, 메시지 타입, 메시지 헤더 구조체, 송신 함수, 수신 처리 함수를 개발자가 직접 만드는 것이 일반적인데, RMI를 이용할 경우 메시지에 들어갈 내용물을 함수 선언처럼 작성하기만 하면 메시지 타입부터 송수신 처리 루틴까지 모두 컴파일러에 의해 자동 생성됩니다. 또한 EncoreNet™의 RMI..
[C++] STL을 사용한 linked map 구현~ 최근 LRU Cache 구현을 위해 STL을 사용한 template 기반의 class를 찾았습니다~ (예전 같으면 그냥 구현을 했을텐데.. 이것도 귀찮아 지네요^^) 필요하신 분들이 있을것 같아 올립니다~ #include #include #include template > struct linked_map { typedef KeyType key_type; typedef MappedType mapped_type; typedef std::pair value_type; private: typedef std::list< ..