static void on_accept(struct evconnlistener* l, evutil_socket_t* fd, struct sockaddr* addr, int socklen, void *arg) { struct tcp_receiver* r = arg; struct event_base* b = evconnlistener_get_base(l); struct bufferevent *bev = bufferevent_socket_new(b, fd, BEV_OPT_CLOSE_ON_FREE); /*设置读事件函数和错误函数*/ bufferevent_setcb(bev, on_read, NULL, on_error, arg); /*设置监视的socket事件*/ bufferevent_enable(bev, EV_READ|EV_WRITE); /*添加到事件管理器中*/ carray_push_back(r->bevs, bev); paxos_log_info("Accepted connection from %s:%d", inet_ntoa(((struct sockaddr_in*)addr)->sin_addr), ntohs(((struct sockaddr_in*)addr)->sin_port)); }
static void carray_grow(struct carray* a) { int i; struct carray* tmp = carray_new(a->size * 2); for (i = 0; i < a->count; i++) carray_push_back(tmp, carray_at(a, i)); free(a->array); a->head = 0; a->tail = tmp->tail; a->size = tmp->size; a->array = tmp->array; free(tmp); }