천재태지의 세상 돌려보기

seoz.egloos.com

- About Me... - Enlightenment, EFL - 타이젠 Tizen



[EFL] ecore main loop의 이해 ├ Enlightenment, EFL

[ EFL 게시물 목차 : http://seoz.egloos.com/3458699 ]


안녕하세요? 천재태지 서주영입니다.
이번 포스트에서는 EFL의 핵심중 하나인 ecore main loop[1]에 대해서 알아보겠습니다.

여느 GUI 프로그래밍과 마찬가지로 EFL로 작성한 GUI 프로그램도 이벤트 드리븐(event driven) 방식으로, 프로그램은 이벤트를 체크/처리하는 루틴을 반복합니다. 이 반복되는 구문을 EFL에서는 ecore main loop이라고 합니다. 말 그대로 ecore라는 라이브러리에 포함되어 있으며 프로그램의 main이 되는 loop입니다. fd handling, event handling, timing handling 등 모든 일 처리가 ecore main loop에서 시작됩니다. 그러므로 ecore main loop은 EFL GUI 프로그램의 핵심이라 할 수 있습니다.

반복적으로 이벤트를 체크하고 처리하는 루틴은 [대기 <---> 처리]를 반복합니다. 처리할 이벤트가 없으면 가만히 대기하고 있다가 처리를 해야 할 이벤트가 있을 때 이를 처리하는 방식입니다. 그러므로 대기중에는 CPU를 소모하지 않아 효율적입니다. 이 대기중인 상태를 idle 상태라고 합니다.

ecore main loop을 시작하려면 ecore_main_loop_begin() API를 호출하면 되며 elementary의 elm_run()이 ecore_main_loop_begin()의 wrapper입니다. ecore main loop을 종료하려면 ecore_main_loop_quit() API를 호출하면 되며 elementary의 elm_exit()이 ecore_main_loop_quit()의 wrapper입니다. 보통 elementary로 어플리케이션을 작성하면 elm_run()과 elm_exit()을 사용합니다.

ecore main loop의 전체적인 구조는 아래와 같습니다. 복잡해 보이지만 알고 보면 어렵지 않습니다.


그럼, 하나 하나 나누어서 설명 드리겠습니다.


1. idle(대기) 상태

idle 상태와 관련된 내용은 크게 idle enter, idle, idle exit으로 나눌 수 있습니다.
- idle enter는 idle 상태에 진입하는 것을 의미하고
- idle은 실제 idle 상태를 의미하고
- idle exit은 idle 상태에서 빠져 나오는 것을 의미합니다.

1.A idle enter
idle 상태에 진입하는 상태를 말합니다. ecore_idle_enterer에 등록되어 있는 콜백을 호출합니다. 그런데 이 때, evas의 rendering과 관련된 루틴도 idle enterer를 사용하기 때문에 이 부분에서 rendering이 발생하게 됩니다. 그 후, app, library 개발자가 추가한 기타 다른 ecore_idle_enterer 콜백이 불립니다.

1.B idle
이제 idle 상태가 되기 바로 직전입니다. 이 때 여러 조건에 따라서 구체적인 동작이 달라집니다.

  1.B.a 이벤트 존재
   만약 처리해야할 이벤트가 존재하는 경우 타임아웃이 0.0인 select만 호출하고 idle 상태에서 그냥 빠져 나갑니다.

  1.B.b idler 존재
   만약 처리해야할 이벤트는 없는데, ecore_idler에 등록된 콜백이 있다면, 해당 콜백을 호출하고 idle 상태에서 빠져나갑니다.

  1.B.c select
   처리해야할 이벤트도 없고 호출할 ecore_idler 콜백도 없다면 진정한 idle 상태에 빠지게 됩니다. 이 때, select() 함수를 호출하여 이벤트가 발생하기를 기다립니다.

1.C idle exit
1.B 상태에서 빠져 나온 상태를 의미합니다. 이 때, ecore_idle_exiter에 등록되어 있는 콜백이 호출됩니다.

2. fd handling

fd(file descriptor)를 처리하는 부분입니다. socket이나 pipe를 처리하는 루틴이 이에 해당하는데요, ecore_con, ecore_pipe, ecore_ipc 등이 있습니다. fd handler가 등록된 것만 처리합니다.

3. sig to event

시스템 시그널을 ecore event로 변경해주는 부분입니다. SIGUSR1, SIGHUP, SIGQUIT 등의 시스템 시그널을 ECORE_EVENT_SIGNAL_USER, ECORE_EVENT_SIGNAL_HUP, ECORE_EVENT_SIGNAL_EXIT 등의 ecore event로 변환합니다.

4. event handling

ecore event를 처리하는 루틴입니다. 여기서 말한 event는 키보드나 마우스 등의 일반적인 이벤트가 아니라 ecore 내부적으로 사용하는 ecore_event를 말합니다. ecore_event_handler_add()를 이용하여 handler가 등록된 event를 처리합니다. 대표적인 예로는 ecore_job이 있습니다. ecore_job은 라이브러리나 어플리케이션에서 event를 사용하기 쉽게 미리 정의해둔 job 타입의 이벤트입니다. 그러므로 ecore_job은 내부적으로는 ecore_event를 사용하고 있으며, 다른 ecore_event와 같은 큐(queue)를 사용하고 있어 FIFO(First In First Out) 방식으로 처리됩니다.

5. timing handling

ecore timer를 처리하는 루틴입니다. 사용자가 추가한 ecore_timer 혹은 ecore_animator, ecore_poller와 관련된 콜백을 호출합니다. ecore_animator와 ecore_poller는 내부적으로 ecore_timer를 사용하고 있습니다.

6. sig to event

3번과 동일한 작업이 일어납니다.

Ecore main loop은 위의 6가지 작업을 수행하며 한 loop을 구성합니다. 이 loop이 while 문 안에서 계속 반복되면서 ecore main loop이 완성됩니다.

이렇게 간단하게 ecore main loop에 대해서 알아보았습니다. 하지만 이 내용이 다가 아닙니다. 한 포스팅에 모든 것을 다 담을 수는 없으므로 위에 있는 각 항목 혹은 중요한 내용별로 별도의 포스팅을 올릴 생각입니다.

그리고 Ecore Main Loop에 대한 Overview를 간단하게 Prezi[2]로 만들어보았습니다.
프리젠테이션에 재미있는 효과가 들어가 있으니 한번 살펴보세요 ^^

[2] http://prezi.com 

[ EFL 게시물 목차 : http://seoz.egloos.com/3458699 ]



핑백

  • EFL 한국 사용자 모임 : EFL 한국 사용자 모임 2012-04-15 00:12:42 #

    ... 7) 사용하기E17 테마(theme) 변경하기 [EFL 어플리케이션 개발] 첫번째 예제 [ecore] ecore_timer 사용 시 흔히 하기 쉬운 실수 및 올바른 사용법ecore main loop의 이해 [elementary] elementary란?elementary widget focus 정책 변경 (mouse down -&gt; clicked)[EFL] ele ... more

  • 천재태지의 세상 돌려보기 : [EFL] elementary로 어플리케이션 작성하기 (1) 윈도우 만들기 2012-06-08 01:31:29 #

    ... 여기[5]</a>를 참고하세요.) 메인 루프는 무한히 돌게 됩니다.(무한루프) 이 루프에서 빠져나오려면 elm_exit()을 호출하면 됩니다. 8. 다음은 elementary의 리소스를 해제하는 루틴입니다. elm_shutdown()은 elementary에서 사용했던 자원을 해제하는 부분입니다. elm_init()와 대칭되는 개념입니다. elm_init()은 어플리케이션 시작 부분에서 호출하고 elm_shutdown()은 어플리케이션의 마지 ... more

  • 천재태지의 세상 돌려보기 : [EFL] elementary로 어플리케이션 작성하기 (2) 배경, 레이블, 버튼 만들기 2012-09-04 03:08:38 #

    ... [EFL] ecore main loop의 이해[5]</a>"를 참고 하시기 바랍니다. 자, 이제 우리가 작성한 코드를 다시 컴파일해서 실행해보면 이전과 마찬가지로 다음과 같은 애플리케이션이 실행되지만, 이제 버튼을 클릭하면 애플리케이션이 종료되는 것을 확인하실 수 있습니다. 이렇게 간단히 elementary를 이용하여 애플리케이션을 작성하는 방법을 알아봤는데요,다음 시간에는 elementary에서 권장하는 매크로를 이용하여 애플리케이션의 메인 함수를 ... more

  • 천재태지의 세상 돌려보기 : [EFL] Ecore 콜백 (timer, idler, animator, job 등) 사용 시 주의 점 2013-06-07 21:44:00 #

    ... ecore main loop[2]</a>이 돌다가 처리해야할 일이 없어서 idle 상태에 들어가면 _idler_cb()라는 콜백 함수가 불리고 함수의 인자로 void *형 data가 넘어오게 됩니다. 그럼, 위와 같이 ecore_idler를 생성했다고 가정하고, ecore 콜백 사용 시 주의해야할 점에 대해서 알아보겠습니다. 1. ecore_idler_del() 호출 시 처리해야 할 부분 Ecore의 콜백을 사용하다보면 원하는 시점에 이 콜 ... more

덧글

  • heyday 2012/04/17 09:27 # 삭제 답글

    안녕하세요~ 어제 R3 에서 세미나 잘 들었습니다.
    이전에도 TIZEN SDK 설치가 잘 안된다고 문의 한적있었는데
    어제 세미나 들으면서도 천재태지님과 동일인물인지도 모르고 들었네요 ^^;
    인사라도 할껄 아쉽네요~ㅋ
    앞으로 궁금한게 많을꺼 같으니 자주 들르겠습니다~ㅋ
  • 천재태지서주영 2012/04/17 23:38 #

    안녕하세요? 전에 질문 올리셨던 분이시군요 ^^
    저도 못 알아봐서 아쉽네요. 간단히 인사라도 나눴으면 좋았을텐데...
    오랜시간동안 지루한 세미나 들으시느라 고생 많으셨어요.
    상태가 좋았으면 재밌게 하려고 했을텐데, 목상태가 너무 안좋아서 더 지루해지지 않았나 하는 아쉬움이 많이 남네요.
    그럼 언제 또 기회가 되면 뵙겠습니다~
  • kingpotato 2012/11/20 20:03 # 삭제 답글

    안녕하세요.
    현재 아래와 같은 에러 때문에 고생을 하고 있는데, 해결하기가 정말 쉽지 않네요.
    ERR<155>:ecore ecore_main.c:1464 _ecore_main_fd_handlers_bads_rem() No bad fd found. Maybe a foreign fd from glib?

    혹시 이런 에러 보신적 있는지 이 에러에 대한 대략적인 정보를 좀 얻을 수 있을까 싶어 글 남겨요.
  • 천재태지서주영 2012/11/22 10:13 #

    안녕하세요? 서주영입니다.
    저는 이 메시지를 본 적은 없는데요, 혹시 어느 경우에 이런 문제가 발생하나요?
    샘플 코드가 있으면 좋겠습니다~
  • helloefl 2015/07/30 13:16 # 삭제 답글

    안녕하세요
    천재태지님 블로그를 통해 efl에 대해서 하나씩 알아가고 있는 도중에 궁금한게 있어 질문드립니다..
    efl_run 아랫쪽에 반복적으로 실행되어야 하는 코드들이 있는데요
    efl_run을 호출하면 efl_exit이 호출될 때까지 멈춰있는것 같아요.
    해결하기 위해 새로운 thread를 만들어서 efl_run을 따로 호출하면 crash가 발생하던데.. 어떻게 해결할 수 있을지 모르겠어요..
    efl_init, efl_run, efl_exit은 한 thread 내에서 실행되어야 하나요?
  • 천재태지서주영 2015/07/31 23:42 #

    안녕하세요?

    우선 질문 감사합니다. 답변을 드리기 전에 정정해야 할 부분이 있는것 같은데요, efl_xxx라고 표현하신 것은 elm_xxx가 맞는 것이지요?
    해당하는 부분은 이벤트 드리븐 방식의 프로그래밍을 할 때 사용되는 빙식인데요, 프로그램이 순차적으로 진행되어 main() 함수가 그대로 종료되면 사용자는 아무것도 못하고 그냥 프로그램이 종료되어 버립니다. 그래서 언제든지 키보드나 마우스 입력을 받기 위해 대기를 하다가 필요한 순간에 프로그램을 종료하도록 구현을 합니다. 이 "반복"을 위해 반복문이 사용되는데요, elm_run() 이 바로 그 역할을 합니다.
    elm_run()을 호출하면 무한 루프에 빠지게 되고 계속 이벤트를 감시하다가 필요한 동작을 하게 됩니다. 사용자가 창의 X 버튼을 누르거나 elm_exit()과 같은 함수를 호출하게 되면 elm_run() 내 무한 루프에서 빠져나와 main() 함수의 나머지 부분이 실행되고 프로그램이 종료되게 됩니다.

    그러므로 필요하신 코드는 elm_run() 전에 처리하셔야 합니다. elm_run() 이후에는 프로그램이 종료될 때 실행되어야 하는 코드를 넣으세요.
    여기서 thread는 전혀 필요가 없습니다.

    감사합니다.
  • helloefl 2015/08/03 10:12 # 삭제

    답글 감사드립니다 ^^ 큰 도움 되었습니다.
댓글 입력 영역