|
OpenSolaris.org |
|
fsflush() 의 동작은 콜백 프로토콜이 어떻게 동작하는지에 대한 좋은 예시 입니다.
#include <sys/callb.h>
fsflush 쓰레드의 초기화 과정에서 메인 서비스 루프에 진입 하기 전에 fsflush는 CALLB_CPR_INIT 매크로를 실행 합니다. 이것은 자료구조를 초기화 하고 콜백 테이블에 있는 쓰레드에 진입합니다. (callb.c 참조)
예를 들어,
- CALLB_CPR_INIT(&cprinfo, &fsflush_lock, callb_generic_cpr, "fsflush");
- cprinfo 는 쓰레드 기반에 "callb_cpr_t cprinfo"로 정의 됩니다. 이것은 로컬 혹은 정적이 될 수 있지만 반드시 CALLB_CPR_EXIT 이 호출 될때 까지 존재 해야 합니다. 이 것은 쓰레드가 블록 되거나 cpr을 위한 다른 cv가 블록 될때 사용 되는 플래그들의 셋 혹은 조건 변수들을 포함 합니다. 그러나 내용은 불투명합니다; 구조에 접근 하는 것은 오직 외부적으로 범용 콜백 코드나 매크로에 의해서 가능합니다.
- fsflush_lock 은 mutext 로써 자료 구조를 보호 합니다. 종종 커널 쓰레드는 이 콜백 프로토콜에 을 사용하여 기존에 존재 하는 뮤텍스에 오버로드 되어질 수 있습니다. Fsflush() 는 클럭 쓰레드가 다시 실행하도록 시그널을 줄때 까지 블록하고 있는 cv와 같은 뮤텍스를 사용합니다.
- callb_generic_cpr 은 함수 포인터로써 CALLB_CPR_INIT 매크로 콜에 3번째 매개변수로 하드코딩되어야 합니다.
- "fsflush" 는 콜백 테이블에서 이 특정한 쓰레드를 인식하는 문자열 입니다. 이 것은 묘사적이어야 하고 짧아야 하고 유일해야 하고 최대 길이는 23 문자 입니다.
커널 쓰레드의 서비스 루프 내에서:
쓰레드가 안전하게 정지 할 수 있는 상태에 도달 했을때 그것은 CALLB_CPR_SAFE_BEGIN 매크로를 호출합니다. 이 호출에 가장 최적의 장소는 쓰레드가 특정한 일을 완료한 직후나 다른 일을 시작하기 전에 입니다.
예를 들어,
- CALLB_CPR_SAFE_BEGIN(&cprinfo);
- cprinfo 는 반드시 위의 CALLB_CPR_INIT 매크로의 첫번째 인수와 동일 해야 합니다. 다시 말해서 이 것은 쓰레드와 cpr이 동시에 접근하는 자료 구조로써 콜백 메카니즘이 동작하도록 합니다. 이 콜을 실행 시키기 전에 쓰레드는 반드시 CALLB_CPR_INIT 의 두번째 인수로 명시된 락을 소유 하고 있어야 합니다.
예를 들어,
- CALLB_CPR_SAFE_END(&cprinfo, &fsflush_lock);
- cprinfo 는 반드시 위의 CALLB_CPR_INIT 매크로의 첫번째 인수와 동일해야 합니다.
- fsflush_lock 은 cv_wait() 콜에서 사용될 락을 나타 냅니다. cv_wait() 은 자료구조 내의 플래그에서 cpr이 아직 쓰레드가 기다리기도록 가르 킬때 실행 됩니다. 대부분의 경우에서 이 인수는 CALLB_CPR_INIT 의 두번째 인수와 동일 합니다. 알아 두어야 할 점은 fsflush() 가 동일한 락을 사용한다는 것입니다.
예를 들어,
- CALLB_CPR_EXIT(&cprinfo);
- cprinfo 는 반드시 CALLB_CPR_INIT 매크로의 첫번째 인수와 동일해야 합니다.
주의: callb.h 내의 매크로 정의는 더 이상 필요로 하지 않는 플래그를 참조 하고 있습니다. 또한 여기에 설명된 프로토콜을 준수해야 하는지에 대한 이유가 thread.h 와 thread.c 에 커멘트될 것입니다.
"오픈솔라리스" 카테고리의 다른 글
- 오픈솔라리스의 빌드와 설치 (Part 2) (댓글 1개 / 트랙백 0개) 2006/03/23
- OpenSolaris 코드 브라우저를 이용하여 코드베이스 탐색하기 (댓글 1개 / 트랙백 1개) 2005/09/23
- 커널 프로그래머를 위한 에너지 스타 가이드라인 (댓글 1개 / 트랙백 0개) 2006/07/23
- 오픈솔라리스 domU 를 리눅스 dom0 에 설치하기 (댓글 0개 / 트랙백 0개) 2008/03/11
- Indiana 란 무엇이고 어떻게 참여할 수 있나요? (댓글 0개 / 트랙백 0개) 2008/04/17
- FAQ: 오픈솔라리스 ON(OS/Net) 번역 FAQ (댓글 0개 / 트랙백 0개) 2008/02/18
- 오픈 솔라리스를 위한 무선 네트워킹 (댓글 1개 / 트랙백 0개) 2006/01/23
- Xen: 다운로드, 설치 및 설정 정보 (댓글 0개 / 트랙백 0개) 2008/01/21
- FAQ: OpenSolaris.org (댓글 3개 / 트랙백 0개) 2006/09/23
- OpenSolaris 2008.05 발표 (댓글 0개 / 트랙백 0개) 2008/05/13
2006/07/23 15:11
2006/07/23 15:11
댓글을 달아 주세요
좋은 정보 감사해요~
2007/09/19 04:18