사용자 입력을 기다리는 함수를 어떻게 만들어야 할까요?

55 views
Skip to first unread message

soryu

unread,
Oct 18, 2007, 9:12:17 AM10/18/07
to squirrelusers-kr
안녕하세요

신규 MMO 게임 프로젝트의 스크립트 언어를 squirrel을 사용하기로 하였습니다^^

서버 사이드에서 사용하려 하고 있는데요..

FreeBSD 64bits 환경이라서 sqplus 와 같은 추가 라이브러리들을 전혀 사용하지 못하고 있습니다-_-

지금 c-sq 간의 함수 바인딩 정도만 작업을 하였는데요..

사용자의 입력을 기다려야 하는 함수를 만들어야 하는 상황입니다

그런데 squirrel은 c 측에서 스크립트를 중단 시키는 방법이 없는 것 같습니다.

lua에서는 lua_yield 와 같은 API를 이용했던거 같은데.. sq에는 아직 이런 API가 없는듯 하네요..

sq의 포럼을 찾아보니까 sq_suspendvm 을 쓰라고 하는데.. 이 API를 이용하면 vm이 완전히 정지하지 않나요?

사용자의 입력을 기다리는 스크립트 부분만 block 되고 다른 스크립트들은 계속 돌아가야 되는데..

어떻게 만들어야 할지 감이 안오네요..

혹시 같은 문제로 고민해보셨던 분 계시면 도움 부탁드립니다^^;;

idkay0

unread,
Oct 18, 2007, 12:28:21 PM10/18/07
to squirrelusers-kr
에구... 저는 Squirrel을 처음 사용할 때부터 럭셔리한 Sqplus를 사용하다 보니...
Squirrel의 전반적인 경험이 매우 딸리는 상황이라 별 도움은 될 것 같지 않지만, 떠오르는 생각이 있어
몇 자 적습니다.

Thread를 지원하는 Squirrel의 장점을 살려서요. 스크립트가 진행 되는 도중에 사용자 입력을
기다릴 때, 사용자 입력을 받는 부분을 Thread로 돌리면 어떨까요? 사용자 입력을 받을 때까지
Thread를 살려 놓다가 입력이 끝나면 죽이는 방식이요. 스크립트를 죽일 필요도 없고 추가되는
코드도 적을 것 같고... Thread쪽을 검토해 보심이 어떨른지요?

yagur

unread,
Oct 19, 2007, 10:43:17 PM10/19/07
to squirrelusers-kr
Squirrel은 coroutine을 두가지 정도로 지원합니다. 하나는 Generator 또 하나는 Thread입니다.
Thread는 루아의 Coroutine과 같은 개념이고 OS의 쓰레드가 아니니 이것을 사용하셔도 됩니다. Generator는
Phyton의 Generator와 같은 비대칭형 코루틴이며 Thread보다 메모리면에서 가볍다고 합니다.
Generator는 스크립트에서 yield와 resume을 통해 , thread는 suspend와 wakeup을 통해서 제어합니
다. 제어권을 넘기는것은 똑같지만 코루틴을 C에서 쓰려면 thread를 통해 사용하셔야 할것 같습니다. thread의
suspend를 squirrel구현에서 보면 sq_suspendvm()을 사용하고 있습니다. 이는 쓰레드를 만들때 state를
공유 하는 또 다른 VM을 만들기 때문에 그 VM을 정지해도 작업하고 계신 VM(다른 스크립트 로딩한 VM)을 suspend하는
것은 아닙니다.
sq_suspendvm으로 정지후 실행해야할 스크립트를 본 vm에서 실행하고 다시 제어권을 wakeup으로 넘기시면 될것같습니다
(아니면 생성한 쓰레드를 원래의 VM에 등록하는 방법도 있겠군요)

int MySquirrelThreadFunc(HSQUIRRELVM v)
{
// 진행...
return sq_suspendvm(v);
}

sq_newthread, sq_suspendvm, thread_wakeup의 구현부를 보시면 될것같습니다.

아 그리고 sqplus도 다른 OS에서 컴파일 하는데 많은 변경이 필요할것 같진 않습니다.

soryu

unread,
Oct 20, 2007, 12:41:08 AM10/20/07
to squirrelusers-kr
답변 감사 드립니다ㅠ.ㅠ

현재 thread를 이용해서 작업하고 있습니다^^

generator는 c 쪽에서 제어권을 컨트롤 할 방법이 없더군요-_-

squirrel 의 문서가 그렇게 자세하질 못해서 소르를 봐가면서 하니 작업 속도가 영 좋질 않네요^^;;


sqplus 같은경우.. 다른 OS가 문제가 아니고..

64bits 처리가 거의 안되있는 것 같습니다.

FreeBSD 상에서 32bits로 컴파일 할 경우 문제 없이 동작이 가능하지만,

64bits로 컴파일 할 경우 메모리 관련 오류를 내며 프로그램이 죽어버립니다.

> > 혹시 같은 문제로 고민해보셨던 분 계시면 도움 부탁드립니다^^;;- Hide quoted text -
>
> - Show quoted text -

vicpose

unread,
Oct 20, 2007, 9:29:31 PM10/20/07
to squirrelusers-kr
저는 현재 generator를 써서 작업하고 있는데 꽤 만족 스럽습니다.

> 현재 thread를 이용해서 작업하고 있습니다^^
> generator는 c 쪽에서 제어권을 컨트롤 할 방법이 없더군요-_-

c쪽에서 제어권을 컨트롤 할 방법이 없다는게 어떤 말씀 이신지요 ?
어떤 예를 들어서 설명해주시면 혹시 generator를 쓸 수 있는 좋은 방법을 알수 있을지도 모르겠습니다.

> 64bits로 컴파일 할 경우 메모리 관련 오류를 내며 프로그램이 죽어버립니다.

제가 지금 64bit로 컴파일할 환경이 안됩니다.
어떤 오류를 뱉던가요 ? 쉽게 디버깅할 수 없을 정도로 난해한 것이었나요 ?
sqplus 64bit 포팅을 시도해 보심은 어떤지요 ?

> > - Show quoted text -- 따온 텍스트 숨기기 -
>
> - 따온 텍스트 보기 -

soryu

unread,
Oct 21, 2007, 2:14:40 AM10/21/07
to squirrelusers-kr
예를 sq 스크립트로 한번 적어보면..

function test()
{
local val = getch() ;
print("user input: "+val) ;
}

위와 같은 스크립트가 있을 때, getch() 함수가 call 되는 시점에서 sq는 pause 되고 c로 돌아가 사용자의 입력
을 기다리면서,

다른 sq 스크립트나, c 루틴을 실행을 하고, 사용자의 입력이 들어오면 pause 되었던 sq 스크립트가 다시 진행되는 것을
원하는겁니다;;

generator 을 사용할 경우 sq 스크립트가 끝나지 않으면, c로 다시 돌아가질 못한다는 걸 말하고 싶은겁니다..

위의 스크립트 코드로 설명하자면, getch가 generator일 경우, val에 generator가 저장되고 스크립트가 계속
진행되어 버리기 때문에,

원하는 blocking call 이 되지 않는 다는 겁니다.

즉, 요약하면 다음과 같은 기능들이 필요한겁니다.

1. sq 스크립트는 언제나 pause 되면서, c 코드가 계속 진행 할 수 있도록 해야 한다.
2. pause 된 sq 스크립트가 있어도, 다른 sq 스크립트의 진행을 방해하면 안된다.


현재는 getch를 c bind function으로 만들고, c에서 sq_suspendvm 을 이용해 정지 하도록 작업을 하고
있습니다.

그후 sq_wakeupvm 을 이용해 return 값 등을 전달 할 수 있는 것 같은데 영 애매하네요..

64bits 문제는 segmentation fault 오류 입니다.

문제 자체는 int의 크기가 32bits냐 64bits냐 하는 단순한 부분을 고려하지 않고 sqplus 를 제작해서

발생하는 문제입니다.

고쳐서 쓰자는 생각으로 sqplus 의 소스를 한동안 처다봤었는데요,

어느 부분에서는 64bits에 대해서 고려를 하고, 어느 부분에서는 고려를 하지 않고 하는 식으로 되어 있어서

엄두가 나질 않더군요-_- 차라리 아예 32bits로만 되어 있었으면 간단했었을텐데..

게다가 gdb 환경이라 ..ㅠ.ㅠ

> > - 따온 텍스트 보기 -- Hide quoted text -

Reply all
Reply to author
Forward
0 new messages