int subreq_run(int id) { unsigned short request_id = id; int sock = INVALID_SOCKET; int connect_ret = connect_to_fpm(host, port, &sock); if (connect_ret) { return 1; } ssize_t begin_ret = begin_send(&sock, request_id); if (!begin_ret) { close(sock); return 2; } ssize_t send_env_ret = send_env(&sock, *(keys_dict+id), *(vals_dict+id), len_dict[id], request_id); if (!send_env_ret) { close(sock); return 3; } ssize_t send_content_ret = send_content(&sock, *(content_dict+id), request_id); if (!send_content_ret) { return 4; } struct myevent_s *ev; struct epoll_event epv = {0, {0}}; epv.events = EPOLLIN; ev = emalloc(sizeof(struct epoll_event)); ev->fd = sock; ev->request_id = request_id; epv.data.ptr = ev; epoll_ctl(g_epoll_fd, EPOLL_CTL_ADD, sock, &epv); return 0; }
///---------------------------------------------------------------------------- void socket::send( byte_t const* header, std::size_t header_size, byte_t const* body, std::size_t body_size ) { if (!waiting_end_) { gce::detail::bytes_t& send_buf = send_buffer_[standby_buffer_]; send_buf.append(header, header_size); send_buf.append(body, body_size); if (!sending_) { begin_send(); } } }
///---------------------------------------------------------------------------- void socket::end_send(errcode_t const& errc) { sending_ = false; send_buffer_[sending_buffer_].clear(); if (!errc && !send_buffer_[standby_buffer_].empty()) { begin_send(); } else if (closed_) { close(); } if (closed_ && !sending_) { errcode_t ignore_ec; sync_.cancel(ignore_ec); } reconn_ = false; }