static void do_proceed(h2o_generator_t *_generator, h2o_req_t *req) { h2o_mruby_generator_t *generator = (void *)_generator; h2o_mruby_chunked_t *chunked = generator->chunked; h2o_buffer_t **input; int is_final; h2o_doublebuffer_consume(&chunked->sending); switch (chunked->type) { case H2O_MRUBY_CHUNKED_TYPE_CALLBACK: input = &chunked->callback.receiving; is_final = mrb_nil_p(chunked->body_obj); break; case H2O_MRUBY_CHUNKED_TYPE_SHORTCUT: if (chunked->shortcut.client != NULL) { input = h2o_mruby_http_peek_content(chunked->shortcut.client, &is_final); assert(!is_final); } else { input = &chunked->shortcut.remaining; is_final = 1; } break; default: h2o_fatal("unexpected type"); break; } do_send(generator, input, is_final); }
uint8_t *h2o_http2_encode_frame_header(uint8_t *dst, size_t length, uint8_t type, uint8_t flags, int32_t stream_id) { if (length > 0xffffff) h2o_fatal("invalid length"); dst = encode24u(dst, (uint32_t)length); *dst++ = type; *dst++ = flags; dst = encode32u(dst, stream_id); return dst; }
void h2o_socketpool_init_by_address(h2o_socketpool_t *pool, struct sockaddr *sa, socklen_t salen, int is_ssl, size_t capacity) { char host[NI_MAXHOST]; size_t host_len; assert(salen <= sizeof(pool->peer.sockaddr.bytes)); if ((host_len = h2o_socket_getnumerichost(sa, salen, host)) == SIZE_MAX) { if (sa->sa_family != AF_UNIX) h2o_fatal("failed to convert a non-unix socket address to a numerical representation"); /* use the sockaddr_un::sun_path as the SNI indicator (is that the right thing to do?) */ strcpy(host, ((struct sockaddr_un *)sa)->sun_path); host_len = strlen(host); } common_init(pool, H2O_SOCKETPOOL_TYPE_SOCKADDR, h2o_iovec_init(host, host_len), is_ssl, capacity); memcpy(&pool->peer.sockaddr.bytes, sa, salen); pool->peer.sockaddr.len = salen; }
static void *lookup_thread_main(void *_unused) { pthread_mutex_lock(&queue.mutex); while (1) { --queue.num_threads_idle; while (!h2o_linklist_is_empty(&queue.pending)) { h2o_hostinfo_getaddr_req_t *req = H2O_STRUCT_FROM_MEMBER(h2o_hostinfo_getaddr_req_t, _pending, queue.pending.next); h2o_linklist_unlink(&req->_pending); pthread_mutex_unlock(&queue.mutex); lookup_and_respond(req); pthread_mutex_lock(&queue.mutex); } ++queue.num_threads_idle; pthread_cond_wait(&queue.cond, &queue.mutex); } h2o_fatal("unreachable"); return NULL; }