Lighttpd 핵심 구조 분석

Lighttpd 소스 코드 에 관련 된 몇 가지 핵심 데이터 구 조 는 대량의 구조 화 언어 를 사용 하지만 곳곳에서 대상 을 대상 으로 하 는 사항 을 나타 낸다.
1: buffer (문자열 함수)
내부 정 의 는 다음 과 같 습 니 다.
이 구조 에서 파생 된 2 차원 문자열 배열 구조
typedef struct {
	char *ptr; //     

	size_t used;//    
	size_t size;//    
} buffer;

1.1 버퍼 메모리 초기 화 특징
이미 존재 하 는 BUFFER 를 사용 하여 현재 BUFFER 를 초기 화 할 때, 조 치 를 취해 분 배 된 메모 리 는 모두 64 의 정수 배 입 니 다.
typedef struct {
	buffer **ptr;

	size_t used;
	size_t size;
} buffer_array;

2: dataset 형식 (대상 템 플 릿, 유 니 버 설 구조)
/**
 *
 * allocate (if neccessary) enough space for 'size' bytes and
 * set the 'used' counter to 0
 *
 */
#define BUFFER_PIECE_SIZE 64

int buffer_prepare_copy(buffer *b, size_t size) {
	if (!b) return -1;

	if ((0 == b->size) ||
	    (size > b->size)) {
		if (b->size) free(b->ptr);

		b->size = size;

		/* always allocate a multiply of BUFFER_PIECE_SIZE */
		b->size += BUFFER_PIECE_SIZE - (b->size % BUFFER_PIECE_SIZE);//   PIECE    

		b->ptr = malloc(b->size);
		assert(b->ptr);
	}
	b->used = 0;
}

/*data_unset 실제 유형 은 함수 와 유사 합 니 다.
typedef enum { TYPE_UNSET, TYPE_STRING, TYPE_COUNT, TYPE_ARRAY, TYPE_INTEGER, TYPE_FASTCGI, TYPE_CONFIG } data_type_t;
#define DATA_UNSET \
	data_type_t type; \
	buffer *key; \
	int is_index_key; /* 1 if key is a array index (autogenerated keys) */ \
	struct data_unset *(*copy)(const struct data_unset *src); \
	void (* free)(struct data_unset *p); \
	void (* reset)(struct data_unset *p); \
	int (*insert_dup)(struct data_unset *dst, struct data_unset *src); \
	void (*print)(const struct data_unset *p, int depth)

typedef struct data_unset {
	DATA_UNSET;
} data_unset;

data_unset 는 성형, 문자 직렬 및 기타 유형 일 수 있 지만 함수 지침 을 통 해 몇 개의 함수 free 로 정 합 니 다.
reset, print 등등.data 에 해당unset 는 가상 기본 클래스 입 니 다.
3: array (실제 data2 차원 구조
array 는 다음 과 같이 정 해 졌 습 니 다.
typedef struct data_unset
{
	data_type_t type;
	buffer * key;
	int is_index_key;
	struct data_unset *(*copy)(const struct data_unset *src); 
	void (* free)(struct data_unset *p); 
	void (* reset)(struct data_unset *p); 
	int (*insert_dup)(struct data_unset *dst, struct data_unset *src); \
	void (*print)(const struct data_unset *p, int depth)
}
*/

좋은 웹페이지 즐겨찾기