Код ревью

Код ревью


struct data_t {

int fd;

size_t count;

bool done;

};


void process_pair_ready_read(data_t *data) {

char buffer[4096];

ssize_t cnt = read(data->fd, buffer, sizeof(buffer));

if (cnt > 0) {

data->count += cnt;

}

else if (cnt == 0) {

data->done = true;

}

}


void process_epoll_event(epoll_event * event, size_t& files_left) {

const uint32_t mask = event->events;

data_t * data = event->data.ptr;

if (mask & EPOLLIN) {

process_pair_ready_read(data);

}

if (data->done) {

files_left--;

}

}


size_t read_data_and_count(size_t N, int fds[N]) {

data_t ** entries = calloc(N, sizeof(*entries));

int epoll_fd = epoll_create1(0);

for (size_t i = 0; i < N; ++i) {

entries[i] = create_event_data(epoll_fd, fds[i]);

}


size_t files_left = N;

epoll_event pending[N];

while(files_left > 0) {

int n = epoll_wait(epoll_fd, pending, N, -1);

for (int i = 0; i < n; ++i) {

process_epoll_event(&pending[i], files_left);

}

}

size_t result = 0;

for (int i = 0; i < N; i++) {

result += entries[i]->count;

}

}


Report Page