천재태지의 세상 돌려보기

seoz.egloos.com

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



[EFL] eina_list_free와 EINA_LIST_FREE 올바르게 사용하기 ├ Enlightenment, EFL

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

안녕하세요? 천재태지 서주영입니다.
이번 포스트에서는 간단하지만 흔히 실수하기 쉬운 eina_list_free와 EINA_LIST_FREE에 대해서 설명드리겠습니다.

eina_list[1]는 다음 그림과 같이 리스트 노드 및 이 노드가 가리키고 있는 데이터로 구성되어 있습니다.

eina_list_free[2]는 리스트 노드가 가지고 있는 데이터는 그냥 두고, 리스트 노드를 모두 삭제하는 API입니다.
간단하죠. (그림 퀄리티는... 무념...)


eina_list_free(list);

만약 리스트 노드가 가지고 있는 데이터도 지우고 리스트 노드도 모두 삭제하려면 어떻게 해야 할까요?
우선, 다음과 같이 할 수 있습니다.

EINA_LIST_FOREACH(list, l, data)  --- 1
  free(data);
 
eina_list_free(list); --- 2

1) EINA_LIST_FOREACH는 내부적으로 for문으로 구성되어 있으며 이를 이용해서 각 노드의 data에 접근할 수 있습니다. 이 예제에서는 free() 함수를 이용해 각 노드의 데이터를 삭제합니다.
2) 이제 남아 있는 모든 리스트 노드를 삭제합니다.

이 방식은 각 리스트 노드가 가리키고 있는 데이터를 먼저 삭제한 다음에 리스트 노드 전체를 삭제하는 방식입니다.

그런데 eina에서는 이런 작업을 위해 편의 매크로를 제공해주고 있습니다. 바로 EINA_LIST_FREE[3]입니다.

EINA_LIST_FREE(list, data)
  free(data);

이와 같이 실행을 하면 for문을 돌면서 각 data를 원하는 방식으로 free할 수 있으며 동시에 각 리스트 노드도 삭제됩니다.
그래서 EINA_LIST_FREE를 사용하면 추가로 리스트 노드를 삭제할 필요가 없습니다.

그렇다면 EINA_LIST_FOREACH와 eina_list_free를 혼합해서 사용하는 것과 EINA_LIST_FREE를 사용하는 것, 어떤 것이 좋을까요?
물론 개인의 취향에 따라 다르겠지만, 효율과 성능 면에서 EINA_LIST_FREE가 더 좋습니다.
EINA_LIST_FREE를 사용하는 것 보다 EINA_LIST_FOREACH와 eina_list_free를 사용하는 것은 다음 측면에서 안 좋습니다.
1. 한 리스트에 대해서 for문을 두 번 돌게 됩니다. 그만큼 시간도 많이 걸리겠죠.
2. 변수 Eina_List *l이 추가적으로 필요합니다.
3. 라인 수가 더 깁니다.

이와 같이 eina_list_free와 EINA_LIST_FREE가 하는 역할은 매우 간단하지만 사용하는 입장에서 헷갈리기 쉬우니 잘 숙지하고 사용하시면 좋겠습니다.

감사합니다.



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



덧글

  • 카이네우스 2013/08/13 17:36 # 삭제 답글

    안녕하세요.
    위 글과는 관련이 없는 글인데 EFL 관련 질문은 어디에 해야될지 몰라서 여기에 질문을 드립니다.
    EFL 개발하면서 elm_object_item_signal_emit 같은 함수를 종종 보게 되는데 doc 를 봐도 어떤 기능을 하는지 모르겠습니다.
    elm_object_item_signal_emit(event_info, "elm,state,bottom", "");
    genlist 에서 realized 함수에서 위와 같은 함수가 있다면 어떤 기능을 하는지 아시는지요..
    종종 답답하면 여기서 답을 얻어가고 있습니다.
    오늘도 즐거운 하루 되시고 시간되시면 답변 부탁드릴게요 ^^
  • 천재태지서주영 2013/08/14 13:02 #

    안녕하세요? 서주영입니다.
    일단 elm_object_item_signal_emit()을 설명드리기 전에, widget item과 edje, genlist item realize에 대해서 이해를 하셔야 합니다.
    edje는 알고 계신다고 가정하겠습니다.

    Genlist, gengrid, toolbar, photocam, multibuttonentry 등 일부 elementary widget은 그 안에 item을 가지고 있습니다.
    일단 elm_object_item_xxx() 류의 API는 이런 item을 다루기 위해 존재하는 공통 API입니다.
    즉, genlist 뿐만 아니라 item을 가지는 gengrid, toolbar 등 여러 widget의 item에 사용할 수 있습니다.

    Genlist의 경우 한 행이 한 item인데요, 각 item은 그 모양(layout)을 표현하기 위해 내부적으로 edje_object로 되어 있습니다.
    edje object는 signal, message 등을 EFL 애플리케이션과 주고 받으면서 통신을 합니다. edje object를 구성하는 edc 스크립트를 보시면, "어떤 시그널이 왔을 때 어떤 동작을 한다"와 같은 내용이 정의되어 있습니다. 그래서 애플리케이션에서 해당 edje object에게 원하는 동작을 요구할 때 시그널을 보냅니다. 예를 들어, edje object의 어느 part를 숨기고 어느 part는 보여주고 어느 part는 자리를 이동하고 등등의 작업을 시그널을 통해 요청합니다.

    그런데 genlist를 포함한 대부분 widget item의 내부 edje object의 포인터(pointer, 핸들)는 노출이 되어 있지 않아서 애플리케이션에서 edje object에 직접 시그널을 보낼 수 없습니다. 그래서 이를 대신해주는 통로 역할을 하는 것이 elm_object_item_signal_emit()입니다.
    만약 elm_object_item_signal_emit(item, "elm,state,bottom", "elm"); 같이 호출한다면 이는 해당하는 item의 내부 edje object에 source는 "elm"이고 signal은 "elm,state,bottom"이라는 시그널을 보내게 됩니다. 그럼 각 edc에 정의된 내용에 따라서 시그널을 처리하게 됩니다. 처리 내용은 해당 item의 edje object를 edc로 어떻게 구성하느냐에 따라 달라집니다.

    그럼, genlist의 "realized" 콜백에서 elm_object_item_signal_emit(event_info, "elm,state,bottom", "");를 호출하는 경우를 설명드리겠습니다. genlist는 item이 아무리 많더라도 모든 item의 오브젝트를 다 생생하고 있는게 아니라 item이 스크롤 등을 통해 화면에 들어오는 시점(혹은 직전)에 실제로 item 오브젝트(내부적으로는 edje object)를 구성합니다. 이 때 텍스트를 채우기 위해 text_get, 오브젝트를 채우기 위해 content_get 콜백을 마구 불러주죠. 이 과정을 realize라고 합니다. 반대로 item이 화면 밖으로 나가 삭제가 되는 과정을 unrealize라고 합니다.

    "realized" 콜백은 genlist의 item 오브젝트가 화면에 들어와서 edje object가 생성될 때 불립니다. 이 때, event_info 인자는 realize가 된 item을 기리킵니다. 그런데 만약 애플리케이션에서 item realize 시점에 item의 edje object에 원하는 시그널을 보내서 원하는 동작을 하도록 하고 싶다면 "realized" 콜백에서 elm_object_item_signal_emit()을 호출해주시면 됩니다.

    말씀하신 예제에서는 genlist item이 realize될 때, 해당 item에 source는 ""이고 signal은 "elm,state,bottom"이라는 시그널을 보내주게 됩니다. 그럼 해당하는 edje object내에 기술되어 있는 내용에 따라서 이 시그널을 처리하게 됩니다.

    감사합니다.
  • 카이네우스 2013/08/14 16:04 # 삭제 답글

    아 그렇군요... 엄청 자세한 답변에 머라 감사의 말씀을 드려야할지....^^
    덕분에 해당 함수 뿐만 아니라 여러가지를 이해할 수 있게 되었습니다.
    고맙습니다.
    오늘도 더운데 수고하시고 즐거운 하루 보내시길 바랍니다.~~~~
  • 천재태지서주영 2013/08/15 22:33 #

    도움이 되었으면 다행입니다 ^^
    수요가 있을지 모르겠지만 아래 타이젠 질문/답변 포스팅 처럼 EFL 질문/답변 포스팅을 만드는 것도 고려해봐야겠네요.
    http://seoz.egloos.com/3907148
댓글 입력 영역