libev 학습 노트 (1) - 주요 데이터 구조

3702 단어 libev
1.EV_P, EV_P_ ,EV_A, EV_A_
1.1 성명
# define EV_P  struct ev_loop *loop
# define EV_P_ EV_P,
# define EV_A  loop
# define EV_A_ EV_A,

1.2 설명
이 몇 개의 매크로 정 의 는 비교적 기이 하 다. 사실은 EV 를 사용 하 는 것 이다.P 는 evloop * 의 성명, EV 로P_evloop * 뒤에 "." 라 는 성명 을 가지 고 있 습 니 다.예 를 들 면:
void func(EV_P_ int a);

등가
void func(struct ev_loop*loop, int a);

나 는 이런 쓰기 가 무슨 좋 은 점 이 있 는 지 잘 이해 하지 못 한다. 만약 에 억지로 이 유 를 말 하려 고 한다 면 뒤의 코드 가 비교적 세련 되 어 보일 것 이다. 함수 가 모두 큰 매개 변수 목록 을 가지 고 있다 는 것 을 정의 하지 않 는 것 은 아니다.
하지만 이것 도 큰 문 제 를 가 져 왔 습 니 다. 바로 소스 코드 를 읽 는 것 이 매우 불편 해 졌 습 니 다. 특히 저 같은 초보 자 를 보고 싶 어서 보 는 엄마 도 모 릅 니 다 ~
 
2.ev_loop
2.1 성명
struct ev_loop
{
  ev_tstamp ev_rt_now;
  #define ev_rt_now ((loop)->ev_rt_now)
  #define VAR(name,decl) decl;
    #include"ev_vars.h"
  #undef VAR
};
#include"ev_wrap.h"

설명
어떤 사람 은 libev 가 가장 징 그 럽 고 가장 정교 한 것 은 바로 그 거대 한 것 이 라 고 말한다. 그 중에서 ev 에 대해loop 성명 에서 알 수 있 을 겁 니 다.ev_loop 은 말 그대로 libev 가 watcher 와 각종 매개 변 수 를 저장 하 는 주 순환 이 고 모든 watcher 가 이 데이터 구조 에 걸 려 있 기 때문에 그의 규모 도 상당히 크다.그러나 위의 성명 에서 우 리 는 그리 길지 않 은 것 처럼 보 였 다.그 중 관건 은 \ # include "ev vars. h" 입 니 다.Ev_vars. h 헤더 파일 저장 evloop 에 사용 할 수 있 는 모든 구성원 변수의 매크로 정의 입 니 다. 여기 include 이 파일 은 이 구성원 들 을 ev 에 도입 하 는 것 보다loop 중.
동시에 이곳 에는 매우 교묘 한 곳 이 있 는데 이것 도 우리 가 프로젝트 에서 자주 사용 할 수 있 는 것 이다.바로 다른 환경 에서 evloop 에 필요 한 구성원 변 수 는 다 르 기 때문에 매크로 방식 으로 구성원 을 설명 하면 우 리 는 불필요 한 구성원 을 뛰 어 넘 어 각종 환경 에서 ev 를 보장 할 수 있 습 니 다.loop 최대한 간결 하 게.
ev_loop 구체 적 인 필드 의 의 미 는 나중에 다시 토론 할 것 입 니 다.
 
3.EV_WATCHER
3.1 성명
#define EV_WATCHER(type)                      \
  int active; /* private */                           \
  int pending; /* private */                       \
  EV_DECL_PRIORITY /* private */                 \
  EV_COMMON/* rw */                                    \
  EV_CB_DECLARE (type) /* private */

3.2 해석
struct ev_watcher{
    int active; //       
    int pending;      //        
    int priority;       //   
    void * data;      //           , libev       
    void (*cb) (EV_P_ structtype * io, int revent);        //    ,      
}

3.3 작용
WATCHER 는 libev 의 모든 모니터 의 기본 클래스 입 니 다. 여기 서 작 가 는 대상 을 대상 으로 계승 하 는 사상 을 사용 하여 모니터 를 각종 유형의 모니터 에서 추상 화 시 켰 고 뒤에서 호출 하 는 과정 에서 이러한 매개 변 수 는 모두 개인 적 입 니 다.
WATCHER 에 서 는 모니터 상 태 를 모니터링 하 는 매개 변수 와 우선 순위 등 기본 매개 변 수 를 정의 합 니 다.또한 리 셋 함수 도 연결 되 어 있 지만 구체 적 인 트리거 조건 과 관련 되 지 않 았 습 니 다. 각종 모니터 의 트리거 조건 이 다 르 기 때문에 모든 트리거 조건 은 각종 모니터 의 구체 적 인 실현 에 나타 납 니 다.
 
4.EV_WATCHER_LIST
4.1 성명
#defineEV_WATCHER_LIST(type)                      \
  EV_WATCHER (type)                                \
  struct ev_watcher_list *next; /* private */
 
typedef struct ev_watcher_list
{
  EV_WATCHER_LIST (ev_watcher_list)
} ev_watcher_list;

4.2 설명
Ev_watcher_list 는 watcher 의 간단 한 단 방향 링크 를 바탕 으로 이 루어 집 니 다. 일부 watcher 는 같은 유형의 watcher 가 동시에 존재 할 수 있 기 때문에 링크 를 사용 하여 이 watcher 를 구성 합 니 다.
뒤의 프레임 코드 에서 우 리 는 다음 과 같은 몇 가지 정 의 를 볼 수 있다.
typedef ev_watcher *W;
typedef ev_watcher_list*WL;
typedef ev_watcher_time*WT;

이 몇 가 지 는 우리 가 코드 에서 가장 자주 사용 하 는 데이터 구조의 재 정의 입 니 다.
 
5.EV_WATCHER_TIME
5.1 성명
#defineEV_WATCHER_TIME(type)                   \
  EV_WATCHER (type)                                \
  ev_tstamp at;
 
typedef struct ev_watcher_time
{
  EV_WATCHER_TIME (ev_watcher_time)
} ev_watcher_time;

5.2 설명
ev_watcher_time 재 evwatcher 를 바탕 으로 필드 at 를 추 가 했 습 니 다. 여기 at 는 이 watcher 를 촉발 하 는 시간 을 저장 합 니 다.

좋은 웹페이지 즐겨찾기