libev 학습 노트 (1) - 주요 데이터 구조
3702 단어 libev
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 를 촉발 하 는 시간 을 저장 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
libev 라 이브 러 리 사용법ev 를 사용 할 수 있 습 니 다.default_loop 또는 evloop_new 함수 가 순환 을 만 들 거나 EV 를 직접 사용 합 니 다.DEFAULT 매크로, 구별 은 evdefault_loop 에서 만 든...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.