Branch Coverage

Feersum.xs
Criterion Covered Total %
branch 555 944 58.7


line true false branch
353 49 21 if (now == LAST_GENERATED_TIME) return;
381 0 81 if (elt == NULL) return NULL;
384 4 77 if (unlikely(SvMAGICAL(sv))) sv = sv_2mortal(newSVsv(sv));
385 3 78 if (unlikely(!SvOK(sv))) return NULL;
387 14 64 if (unlikely(SvROK(sv))) sv = SvRV(sv);
398 109 912 if (!c->wbuf_rinq) {
407 0 912 if (m->count >= FEERSUM_IOMATRIX_SIZE) {
412 109 912 if (add_iomatrix) {
432 2 390 if (unlikely(SvMAGICAL(sv))) {
435 0 390 else if (unlikely(SvPADTMP(sv))) {
440 0 0 if (SvFLAGS(sv) == (SVs_PADTMP|SVf_POK|SVp_POK)) {
450 0 0 (void)SvOK_off(sv);
505 4 19 if (!c->is_http11) return; // nothing required
595 0 0 if (100 <= code && code <= 199) {
0 0 if (100 <= code && code <= 199) {
598 0 0 else if (200 <= code && code <= 299) {
0 0 else if (200 <= code && code <= 299) {
601 0 0 else if (300 <= code && code <= 399) {
0 0 else if (300 <= code && code <= 399) {
604 0 0 else if (400 <= code && code <= 499) {
0 0 else if (400 <= code && code <= 499) {
627 73 0 if (likely(is_tcp)) {
629 0 73 if (unlikely(setsockopt(fd, SOL_TCP, TCP_NODELAY, &flags, sizeof(int))))
634 0 73 if (unlikely(setsockopt(fd, SOL_SOCKET, SO_OOBINLINE, &flags, sizeof(int))))
639 0 73 if (unlikely(setsockopt(fd, SOL_SOCKET, SO_LINGER, &linger, sizeof(linger))))
648 62 73 if (unlikely(c->fd < 0))
654 0 73 if (unlikely(close(c->fd)))
664 73 0 SvUPGRADE(self, SVt_PVMG); // ensures sv_bless doesn't reallocate
665 73 0 SvGROW(self, sizeof(struct feer_conn));
73 0 SvGROW(self, sizeof(struct feer_conn));
705 0 222 if (unlikely(!sv_isa(rv,"Feersum::Connection")))
721 0 129 if (unlikely(!SvROK(rv))) croak("Expected a reference");
724 129 0 if (likely(
39 90 if (likely(
39 0 if (likely(
129 0 if (likely(
730 25 104 if (uv == 0) {
731 6 19 if (can_croak) croak("Operation not allowed: Handle is closed.");
737 0 0 if (can_croak)
748 23 12 sv_bless(sv, is_writer ? feer_conn_writer_stash : feer_conn_reader_stash);
784 1 10 if (unlikely(ev_is_active(&c->read_ev_io)))
793 91 9 if (unlikely(!ev_is_active(&c->read_ev_io)))
802 10 1 if (likely(!ev_is_active(&c->read_ev_timer))) {
812 91 9 if (unlikely(!ev_is_active(&c->read_ev_timer)))
821 26 98 if (unlikely(ev_is_active(&c->write_ev_io)))
830 1 98 if (unlikely(!ev_is_active(&c->write_ev_io)))
841 83 50 while (request_ready_rinq) {
848 68 15 if (likely(c->wbuf_rinq)) {
859 0 22 if (unlikely(revents & EV_ERROR)) {
865 22 0 if (!ev_is_active(&accept_w) && !shutting_down) {
22 0 if (!ev_is_active(&accept_w) && !shutting_down) {
874 0 320 if (unlikely(revents & EV_ERROR)) {
880 50 270 if (request_ready_rinq)
887 0 43 if (unlikely(revents & EV_ERROR)) {
893 0 43 if (request_ready_rinq)
909 0 108 if (unlikely(revents & EV_ERROR && !(revents & EV_WRITE))) {
0 0 if (unlikely(revents & EV_ERROR && !(revents & EV_WRITE))) {
915 91 17 if (unlikely(!c->wbuf_rinq)) {
916 0 17 if (unlikely(c->responding >= RESPOND_SHUTDOWN))
919 0 17 if (!c->poll_write_cb) {
921 0 0 if (c->responding == RESPOND_STREAMING)
929 11 6 if (c->poll_write_cb_is_io_handle)
935 17 0 if (unlikely(!c->wbuf_rinq)) goto try_write_again;
953 0 108 if (unlikely(wrote <= 0)) {
954 0 0 if (unlikely(wrote == 0))
956 0 0 if (likely(errno == EAGAIN || errno == EINTR))
0 0 if (likely(errno == EAGAIN || errno == EINTR))
964 1020 108 for (i = m->offset; i < m->count && consume; i++) {
1020 0 for (i = m->offset; i < m->count && consume; i++) {
966 0 1020 if (unlikely(v->iov_len > wrote)) {
979 476 544 if (m->sv[i]) {
986 108 0 if (likely(m->offset >= m->count)) {
990 108 0 if (!c->wbuf_rinq)
1014 11 19 if (c->poll_write_cb) goto try_write_again;
1028 16 62 if (likely(c->is_keepalive)) {
1033 16 0 if (likely(c->req)) {
1034 16 0 if (c->req->buf) SvREFCNT_dec(c->req->buf);
1035 16 0 if (likely(c->req->path)) SvREFCNT_dec(c->req->path);
1036 16 0 if (likely(c->req->query)) SvREFCNT_dec(c->req->query);
1037 3 13 if (likely(c->req->addr)) SvREFCNT_dec(c->req->addr);
1038 3 13 if (likely(c->req->port)) SvREFCNT_dec(c->req->port);
1043 14 2 if (c->rbuf) { pipelined = SvCUR(c->rbuf); }
1044 8 8 if (unlikely(pipelined > 0 && c->is_http11)) {
8 0 if (unlikely(pipelined > 0 && c->is_http11)) {
1070 86 0 if (likely(!req)) {
1093 8 81 if (unlikely(c->pipelined)) goto pipelined;
1097 0 81 if (unlikely(revents & EV_ERROR && !(revents & EV_READ))) {
0 0 if (unlikely(revents & EV_ERROR && !(revents & EV_READ))) {
1102 0 81 if (unlikely(c->receiving == RECEIVE_SHUTDOWN))
1107 75 6 if (unlikely(!c->rbuf)) { // likely = optimize for keepalive requests
1114 6 75 if (unlikely(space_free < READ_BUFSZ)) { // unlikely = optimize for small
1118 6 0 SvGROW(c->rbuf, new_len);
6 0 SvGROW(c->rbuf, new_len);
1125 2 79 if (unlikely(got_n <= 0)) {
1126 2 0 if (unlikely(got_n == 0)) {
1130 0 0 if (likely(errno == EAGAIN || errno == EINTR))
0 0 if (likely(errno == EAGAIN || errno == EINTR))
1146 86 1 if (likely(c->receiving <= RECEIVE_HEADERS)) {
1148 1 85 if (ret == -1) goto try_read_bad;
1150 1 84 if (ret == -2) goto try_read_again_reset_timer;
1158 1 83 if (process_request_headers(c, ret))
1163 1 0 else if (likely(c->receiving == RECEIVE_BODY)) {
1165 1 0 if (c->received_cl < c->expected_cl)
1215 2 0 if (unlikely(!(revents & EV_TIMER) || c->receiving == RECEIVE_SHUTDOWN)) {
0 2 if (unlikely(!(revents & EV_TIMER) || c->receiving == RECEIVE_SHUTDOWN)) {
1217 0 0 if (revents & EV_ERROR)
1225 2 0 if (likely(c->responding == RESPOND_NOT_STARTED) && c->receiving >= RECEIVE_HEADERS) {
2 0 if (likely(c->responding == RESPOND_NOT_STARTED) && c->receiving >= RECEIVE_HEADERS) {
1227 1 1 if (c->receiving == RECEIVE_HEADERS) {
1255 0 38 if (unlikely(shutting_down)) {
1262 0 38 if (unlikely(revents & EV_ERROR)) {
1279 38 73 if (fd == -1) break;
1282 0 73 if (unlikely(prep_socket(fd, is_tcp))) {
1315 45 38 if (!ev_is_active(&ei)) {
1335 23 61 c->is_keepalive = is_keepalive && c->is_http11;
21 2 c->is_keepalive = is_keepalive && c->is_http11;
1340 71 13 if (likely(str_eq("GET", 3, req->method, req->method_len))) {
1346 0 13 else if (likely(str_eq("OPTIONS", 7, req->method, req->method_len))) {
1349 13 0 else if (likely(str_eq("POST", 4, req->method, req->method_len))) {
1352 0 0 else if (str_eq("PUT", 3, req->method, req->method_len)) {
1380 0 84 ? need : READ_INIT_FACTOR*READ_BUFSZ-1;
1382 25 59 SV *new_rbuf = newSVpvn(need ? from : "", need);
1391 270 84 for (i=0; i < req->num_headers; i++) {
1393 0 270 if (!hdr->name) continue;
1395 13 257 if (unlikely(
1399 13 0 if (likely(g == IS_NUMBER_IN_UV)) {
1400 0 13 if (unlikely(expected > MAX_BODY_LEN)) {
1415 56 201 unlikely(str_case_eq("connection", 10, hdr->name, hdr->name_len)))
1417 56 0 if (likely(c->is_http11)
1418 5 51 && likely(c->is_keepalive)
1419 5 0 && likely(str_case_eq("close", 5, hdr->value, hdr->value_len)))
1425 0 51 likely(!c->is_http11)
1426 0 0 && likely(is_keepalive)
1427 0 0 && str_case_eq("keep-alive", 10, hdr->value, hdr->value_len))
1436 0 84 if (max_connection_reqs > 0 && c->reqs >= max_connection_reqs) {
0 0 if (max_connection_reqs > 0 && c->reqs >= max_connection_reqs) {
1441 71 13 if (likely(next_req_follows)) goto got_it_all; // optimize for GET
1442 13 0 else if (likely(got_content_length)) goto got_cl;
1444 0 0 if (body_is_required) {
1464 13 0 SvGROW(c->rbuf, c->expected_cl + 1);
0 13 SvGROW(c->rbuf, c->expected_cl + 1);
1468 13 0 if (unlikely(c->expected_cl && c->received_cl < c->expected_cl)) {
12 1 if (unlikely(c->expected_cl && c->received_cl < c->expected_cl)) {
1484 145 113 if (c->in_callback) return; // defer until out of callback
1486 65 48 if (c->write_ev_io.data == NULL) {
1505 0 4 if (unlikely(c->responding != RESPOND_NOT_STARTED)) {
1510 4 0 if (!msg_len) msg_len = strlen(msg);
1529 0 4 if (c->is_keepalive) c->is_keepalive = 0;
1536 26 84 if (a_len != b_len) return 0;
1537 0 84 if (a == b) return 1;
1539 265 84 for (i=0; i
265 0 for (i=0; i
1540 0 265 if (a[i] != b[i]) return 0;
1551 894 155 if (a_len != b_len) return 0;
1552 0 155 if (a == b) return 1;
1554 1018 88 for (i=0; i
1018 0 for (i=0; i
1555 67 951 if (a[i] != tolower(b[i])) return 0;
1563 16 2 if (likely('0' <= ch && ch <= '9'))
14 2 if (likely('0' <= ch && ch <= '9'))
1565 2 2 else if ('A' <= ch && ch <= 'F')
1 1 else if ('A' <= ch && ch <= 'F')
1567 1 2 else if ('a' <= ch && ch <= 'f')
1 0 else if ('a' <= ch && ch <= 'f')
1582 316 71 while (ptr < end) {
1583 3 313 if (unlikely(*ptr == '%')) goto needs_decode;
1594 28 3 for (; ptr < end; ptr++) {
1595 9 19 if (unlikely(*ptr == '%') && likely(end - ptr >= 2)) {
9 0 if (unlikely(*ptr == '%') && likely(end - ptr >= 2)) {
1598 8 1 if (likely(c1 != -1 && c2 != -1)) {
7 1 if (likely(c1 != -1 && c2 != -1)) {
1665 110 6 return (r->minor_version == 1) ? psgi_serv11 : psgi_serv10;
1672 423 6 while (*qpos != '?' && qpos < r->uri + r->uri_len) qpos++;
355 68 while (*qpos != '?' && qpos < r->uri + r->uri_len) qpos++;
1673 6 68 if (*qpos == '?') {
1687 16 16 if (unlikely(!r->path)) feersum_set_path_and_query(aTHX_ r);
1694 0 0 if (unlikely(!r->query)) feersum_set_path_and_query(aTHX_ r);
1702 0 0 if (unlikely(!r->addr)) feersum_set_remote_info(aTHX_ r, c->sa);
1710 0 0 if (unlikely(!r->port)) feersum_set_remote_info(aTHX_ r, c->sa);
1778 16 42 if (unlikely(!feersum_tmpl_env))
1791 58 0 if (likely(!r->addr)) feersum_set_remote_info(aTHX_ r, c->sa);
1795 6 52 if (unlikely(c->expected_cl > 0)) {
1803 30 28 if (request_cb_is_psgi) {
1809 58 0 if (likely(!r->path)) feersum_set_path_and_query(aTHX_ r);
1819 212 58 for (i=0; inum_headers; i++) {
1821 0 212 if (unlikely(hdr->name == NULL && val != NULL)) {
0 0 if (unlikely(hdr->name == NULL && val != NULL)) {
1826 6 206 else if (unlikely(str_case_eq(
1833 6 200 else if (unlikely(str_case_eq(
1841 0 200 if (kbuflen < klen) {
1846 1588 200 for (j=0; jname_len; j++) {
1848 1495 93 *key++ = (n == '-') ? '_' : toupper(n);
1856 0 200 if (unlikely(SvPOK(*val))) {
1903 0 0 COPY_NORM_HEADER(n)
0 0 COPY_NORM_HEADER(n)
0 0 COPY_NORM_HEADER(n)
0 0 COPY_NORM_HEADER(n)
0 0 COPY_NORM_HEADER(n)
0 0 COPY_NORM_HEADER(n)
1905 0 0 COPY_NORM_HEADER(tolower(n))
0 0 COPY_NORM_HEADER(tolower(n))
0 0 COPY_NORM_HEADER(tolower(n))
0 0 COPY_NORM_HEADER(tolower(n))
0 0 COPY_NORM_HEADER(tolower(n))
0 0 COPY_NORM_HEADER(tolower(n))
1907 0 0 COPY_NORM_HEADER(toupper(n))
0 0 COPY_NORM_HEADER(toupper(n))
0 0 COPY_NORM_HEADER(toupper(n))
0 0 COPY_NORM_HEADER(toupper(n))
0 0 COPY_NORM_HEADER(toupper(n))
0 0 COPY_NORM_HEADER(toupper(n))
1909 0 0 COPY_NORM_HEADER((n == '-') ? '_' : tolower(n))
0 0 COPY_NORM_HEADER((n == '-') ? '_' : tolower(n))
0 0 COPY_NORM_HEADER((n == '-') ? '_' : tolower(n))
0 0 COPY_NORM_HEADER((n == '-') ? '_' : tolower(n))
0 0 COPY_NORM_HEADER((n == '-') ? '_' : tolower(n))
0 0 COPY_NORM_HEADER((n == '-') ? '_' : tolower(n))
0 0 COPY_NORM_HEADER((n == '-') ? '_' : tolower(n))
1911 0 0 COPY_NORM_HEADER((n == '-') ? '_' : toupper(n))
0 0 COPY_NORM_HEADER((n == '-') ? '_' : toupper(n))
0 0 COPY_NORM_HEADER((n == '-') ? '_' : toupper(n))
0 0 COPY_NORM_HEADER((n == '-') ? '_' : toupper(n))
0 0 COPY_NORM_HEADER((n == '-') ? '_' : toupper(n))
0 0 COPY_NORM_HEADER((n == '-') ? '_' : toupper(n))
0 0 COPY_NORM_HEADER((n == '-') ? '_' : toupper(n))
1921 0 0 for (i = 0; i < r->num_headers; i++) {
1923 0 0 if (hdr->name == NULL) continue;
1924 0 0 if (unlikely(str_case_eq(SvPVX(name), SvCUR(name), hdr->name, hdr->name_len))) {
1946 0 74 if (unlikely(c->responding != RESPOND_NOT_STARTED))
1948 22 52 change_responding_state(c, streaming ? RESPOND_STREAMING : RESPOND_NORMAL);
1950 74 0 if (unlikely(!SvOK(message) || !(SvIOK(message) || SvPOK(message)))) {
23 51 if (unlikely(!SvOK(message) || !(SvIOK(message) || SvPOK(message)))) {
0 23 if (unlikely(!SvOK(message) || !(SvIOK(message) || SvPOK(message)))) {
0 74 if (unlikely(!SvOK(message) || !(SvIOK(message) || SvPOK(message)))) {
1955 0 74 if (unlikely(avl+1 % 2 == 1)) {
1961 51 23 if (SvIOK(message))
1963 0 23 else if (SvUOK(message))
1967 0 23 if (unlikely(numtype != IS_NUMBER_IN_UV))
1972 0 74 if (unlikely(!code))
1976 23 51 if (likely(!SvPOK(message) || SvCUR(message) == 3)) {
1 22 if (likely(!SvPOK(message) || SvCUR(message) == 3)) {
1982 72 2 c->auto_cl = (code == 304 || code == 204 || (100 <= code && code <= 199)) ? 0 : 1;
72 0 c->auto_cl = (code == 304 || code == 204 || (100 <= code && code <= 199)) ? 0 : 1;
72 0 c->auto_cl = (code == 304 || code == 204 || (100 <= code && code <= 199)) ? 0 : 1;
72 0 c->auto_cl = (code == 304 || code == 204 || (100 <= code && code <= 199)) ? 0 : 1;
1984 70 4 add_const_to_wbuf(c, c->is_http11 ? "HTTP/1.1 " : "HTTP/1.0 ", 9);
1988 100 74 for (i=0; i
1990 100 0 if (unlikely(!hdr || !SvOK(*hdr))) {
0 100 if (unlikely(!hdr || !SvOK(*hdr))) {
1996 100 0 if (unlikely(!val || !SvOK(*val))) {
0 100 if (unlikely(!val || !SvOK(*val))) {
2003 99 1 if (likely(c->auto_cl) &&
2004 2 97 unlikely(str_case_eq("content-length",14,hp,hlen)))
2016 70 4 if (likely(c->is_http11)) {
2021 54 16 if (unlikely(!c->is_keepalive))
2023 0 4 } else if (unlikely(c->is_keepalive) && !streaming)
0 0 } else if (unlikely(c->is_keepalive) && !streaming)
2026 22 52 if (streaming) {
2027 18 4 if (c->is_http11)
2032 0 4 if (unlikely(c->is_keepalive)) c->is_keepalive = 0;
2047 0 52 if (c->responding != RESPOND_NORMAL)
2050 0 52 if (!SvOK(body)) {
2054 49 3 else if (SvROK(body)) {
2056 2 47 if (SvOK(refd) && !SvROK(refd)) {
2 0 if (SvOK(refd) && !SvROK(refd)) {
2060 0 47 else if (SvTYPE(refd) != SVt_PVAV) {
2070 50 2 if (likely(c->auto_cl))
2075 5 47 if (body_is_string) {
2083 71 47 for (i=0; i<=amax; i++) {
2085 1 70 if (unlikely(!sv)) continue;
2092 50 2 if (likely(c->auto_cl)) {
2108 0 14 PUSHMARK(SP);
2109 0 14 mXPUSHs(feer_conn_2sv(c));
2110 0 14 XPUSHs(streamer);
2114 14 0 if (unlikely(SvTRUE(ERRSV))) {
0 14 if (unlikely(SvTRUE(ERRSV))) {
2118 14 0 FREETMPS;
2126 33 0 if (unlikely(!SvOK(ret) || !SvROK(ret))) {
0 33 if (unlikely(!SvOK(ret) || !SvROK(ret))) {
2127 0 0 sv_setpvs(ERRSV, "Invalid PSGI response (expected reference)");
2132 33 0 if (SvOK(ret) && unlikely(!IsArrayRef(ret))) {
33 0 if (SvOK(ret) && unlikely(!IsArrayRef(ret))) {
14 19 if (SvOK(ret) && unlikely(!IsArrayRef(ret))) {
2133 14 0 if (likely(can_recurse)) {
2138 0 0 sv_setpvs(ERRSV, "PSGI attempt to recurse in a streaming callback");
2145 0 19 if (unlikely(av_len(psgi_triplet)+1 != 3)) {
2146 0 0 sv_setpvs(ERRSV, "Invalid PSGI array response (expected triplet)");
2158 19 0 if (IsArrayRef(hdrs))
19 0 if (IsArrayRef(hdrs))
2161 0 0 sv_setpvs(ERRSV, "PSGI Headers must be an array-ref");
2166 19 0 if (likely(IsArrayRef(body))) {
14 5 if (likely(IsArrayRef(body))) {
2170 5 0 else if (likely(SvROK(body))) { // probaby an IO::Handle-like object
2177 0 0 sv_setpvs(ERRSV, "Expected PSGI array-ref or IO::Handle-like body");
2187 23 4 if (is_writer) {
2189 0 23 if (c->poll_write_cb) {
2193 18 5 if (c->responding < RESPOND_SHUTDOWN) {
2203 1 3 if (c->rbuf) {
2219 4 2 if (guard) {
2220 2 2 if (c->ext_guard) SvREFCNT_dec(c->ext_guard);
2221 4 0 c->ext_guard = SvOK(guard) ? newSVsv(guard) : NULL;
2223 6 0 return c->ext_guard ? newSVsv(c->ext_guard) : &PL_sv_undef;
2233 0 1 PUSHMARK(SP);
2234 0 1 mXPUSHs(newSVsv(ERRSV));
1 0 mXPUSHs(newSVsv(ERRSV));
2240 1 0 sv_setsv(ERRSV, &PL_sv_undef);
2256 0 83 PUSHMARK(SP);
2258 30 53 if (request_cb_is_psgi) {
2260 0 30 mXPUSHs(newRV_noinc((SV*)env));
2264 0 53 mXPUSHs(feer_conn_2sv(c));
2274 83 0 if (unlikely(SvTRUE(ERRSV))) {
1 82 if (unlikely(SvTRUE(ERRSV))) {
2280 30 53 if (request_cb_is_psgi && likely(returned >= 1)) {
30 0 if (request_cb_is_psgi && likely(returned >= 1)) {
2288 30 53 if (request_cb_is_psgi && likely(returned >= 1)) {
30 0 if (request_cb_is_psgi && likely(returned >= 1)) {
2294 30 53 if (request_cb_is_psgi && c->expected_cl > 0) {
0 30 if (request_cb_is_psgi && c->expected_cl > 0) {
2302 83 0 FREETMPS;
2312 6 0 SV *cb = (is_write) ? c->poll_write_cb : NULL;
2314 0 6 if (unlikely(cb == NULL)) return;
2323 0 6 PUSHMARK(SP);
2324 0 6 mXPUSHs(new_feer_conn_handle(aTHX_ c, is_write));
2332 6 0 if (unlikely(SvTRUE(ERRSV))) {
0 6 if (unlikely(SvTRUE(ERRSV))) {
2333 0 0 call_died(aTHX_ c, is_write ? "write poll" : "read poll");
2338 6 0 FREETMPS;
2350 0 11 if (unlikely(io == NULL)) return;
2364 0 11 PUSHMARK(SP);
2365 0 11 XPUSHs(c->poll_write_cb);
2373 11 0 if (unlikely(SvTRUE(ERRSV))) {
0 11 if (unlikely(SvTRUE(ERRSV))) {
2379 11 0 if (returned > 0)
2381 11 0 if (ret && SvMAGICAL(ret))
0 11 if (ret && SvMAGICAL(ret))
2384 11 0 if (unlikely(!ret || !SvOK(ret))) {
5 6 if (unlikely(!ret || !SvOK(ret))) {
2386 0 5 PUSHMARK(SP);
2387 0 5 XPUSHs(c->poll_write_cb);
2392 5 0 if (unlikely(SvTRUE(ERRSV))) {
0 5 if (unlikely(SvTRUE(ERRSV))) {
2393 0 0 trouble("Couldn't close body IO handle: %-p",ERRSV);
2404 6 0 if (c->is_http11)
2413 11 0 FREETMPS;
2435 0 8 PUSHMARK(SP);
2436 0 8 XPUSHs(sv);
2437 0 8 mXPUSHs(newSViv(c->fd));
2443 8 0 if (unlikely(SvTRUE(ERRSV))) {
0 8 if (unlikely(SvTRUE(ERRSV))) {
2455 8 0 if (likely(c->rbuf && SvOK(c->rbuf) && SvCUR(c->rbuf))) {
8 0 if (likely(c->rbuf && SvOK(c->rbuf) && SvCUR(c->rbuf))) {
8 0 if (likely(c->rbuf && SvOK(c->rbuf) && SvCUR(c->rbuf))) {
8 0 if (likely(c->rbuf && SvOK(c->rbuf) && SvCUR(c->rbuf))) {
2470 8 0 FREETMPS;
2483 0 23 if (feer_server_name)
2488 0 23 if (feer_server_port)
2501 0 23 if (getsockname(fd, (struct sockaddr*)&addr, &addr_len) == -1) perror("getsockname");
2508 0 23 if (setsockopt(fd, IPPROTO_TCP, TCP_DEFER_ACCEPT, &(int){1}, sizeof(int)) < 0)
2553 30 0 if (unlikely(!SvOK(cb) || !SvROK(cb)))
0 30 if (unlikely(!SvOK(cb) || !SvROK(cb)))
2555 7 23 if (request_cb_cv)
2568 3 0 if (!IsCodeRef(cb))
0 3 if (!IsCodeRef(cb))
2570 0 3 if (unlikely(shutting_down))
2579 2 1 if (active_conns <= 0) {
2584 0 2 PUSHMARK(SP);
2590 0 1 FREETMPS;
2599 14 0 double new_read_timeout = 0.0;
2602 7 7 if (items > 1) {
2604 3 4 if (!(new_read_timeout > 0.0)) {
2610 0 11 RETVAL = read_timeout;
2627 0 0 unsigned int new_max_connection_reqs = 0;
2630 0 0 if (items > 1) {
2638 0 0 RETVAL = max_connection_reqs;
2648 23 0 if (request_cb_cv)
2659 0 0 RETVAL = c->fd;
2672 16 19 if (hdl == NULL) {
2680 8 8 if (ix == 2) // only close the writer on destruction
2696 2 14 if (unlikely(items == 4) && SvOK(ST(3)) && SvIOK(ST(3)))
2 0 if (unlikely(items == 4) && SvOK(ST(3)) && SvIOK(ST(3)))
2 0 if (unlikely(items == 4) && SvOK(ST(3)) && SvIOK(ST(3)))
2704 0 16 if (unlikely(c->receiving <= RECEIVE_HEADERS))
2708 12 4 if (!SvOK(buf) || !SvPOK(buf)) {
0 12 if (!SvOK(buf) || !SvPOK(buf)) {
2711 4 0 SvGROW(buf, len+1);
1 3 SvGROW(buf, len+1);
2714 0 16 if (unlikely(SvREADONLY(buf)))
2717 0 16 if (unlikely(len == 0))
2721 14 2 if (likely(c->rbuf))
2727 1 15 if (unlikely(offset < 0))
2728 1 0 offset = (-offset >= c->received_cl) ? 0 : c->received_cl + offset;
2730 4 12 if (unlikely(len + offset > src_len))
2736 14 2 if (unlikely(!c->rbuf || src_len == 0 || offset >= c->received_cl)) {
0 14 if (unlikely(!c->rbuf || src_len == 0 || offset >= c->received_cl)) {
14 2 if (unlikely(!c->rbuf || src_len == 0 || offset >= c->received_cl)) {
0 14 if (unlikely(!c->rbuf || src_len == 0 || offset >= c->received_cl)) {
2738 2 0 if (c->receiving == RECEIVE_SHUTDOWN) {
2747 5 9 if (likely(len == src_len && offset == 0)) {
5 0 if (likely(len == src_len && offset == 0)) {
2750 3 2 if (likely(buf_len == 0)) {
2762 8 1 SvGROW(buf, SvCUR(buf) + len);
1 7 SvGROW(buf, SvCUR(buf) + len);
2764 7 2 if (likely(items == 3)) {
2778 0 29 if (unlikely(c->responding != RESPOND_STREAMING))
2781 29 0 SV *body = (items == 2) ? ST(1) : &PL_sv_undef;
2782 29 0 if (unlikely(!body || !SvOK(body)))
0 29 if (unlikely(!body || !SvOK(body)))
2786 0 29 if (SvROK(body)) {
2788 0 0 if (SvOK(refd) && SvPOK(refd)) {
0 0 if (SvOK(refd) && SvPOK(refd)) {
2797 20 9 if (c->is_http11)
2812 0 2 if (unlikely(c->responding != RESPOND_STREAMING))
2819 2 0 if (c->is_http11) {
2820 10 2 for (i=0; i<=amax; i++) {
2822 8 2 if (likely(sv)) add_chunk_sv_to_wbuf(c, sv);
2826 0 0 for (i=0; i<=amax; i++) {
2828 0 0 if (likely(sv)) add_sv_to_wbuf(c, sv);
2841 7 0 if (items == 3 && SvOK(ST(2)) && SvIOK(ST(2)))
7 0 if (items == 3 && SvOK(ST(2)) && SvIOK(ST(2)))
7 0 if (items == 3 && SvOK(ST(2)) && SvIOK(ST(2)))
2846 0 7 if (unlikely(!c->rbuf)) {
2850 1 6 else if (offset == 0) {
2853 2 4 else if (offset > 0 && (whence == SEEK_CUR || whence == SEEK_SET)) {
1 1 else if (offset > 0 && (whence == SEEK_CUR || whence == SEEK_SET)) {
1 0 else if (offset > 0 && (whence == SEEK_CUR || whence == SEEK_SET)) {
2856 0 2 if (offset > len)
2861 4 0 else if (offset < 0 && whence == SEEK_END) {
2 2 else if (offset < 0 && whence == SEEK_END) {
2865 0 2 if (offset == 0) {
2868 1 1 else if (offset > 0) {
2895 1 18 SvUVX(hdl_sv) = 0;
2908 12 0 if (unlikely(ix < 1 || ix > 2))
0 12 if (unlikely(ix < 1 || ix > 2))
2910 0 12 else if (unlikely(ix == 1))
2913 6 6 if (c->poll_write_cb != NULL) {
2918 6 6 if (!SvOK(cb)) {
2922 6 0 else if (unlikely(!IsCodeRef(cb)))
0 6 else if (unlikely(!IsCodeRef(cb)))
2933 2 1 RETVAL = feersum_conn_guard(aTHX_ c, (items==2) ? ST(1) : NULL);
2953 0 0 RETVAL = c->is_http11;
2962 0 38 if (unlikely(!SvOK(body)))
2976 6 0 if (IsArrayRef(psgi_response)) {
6 0 if (IsArrayRef(psgi_response)) {
2981 3 3 if (len == 3) {
2986 3 0 else if (len == 2) {
2989 3 0 if (unlikely(!IsArrayRef(headers)))
0 3 if (unlikely(!IsArrayRef(headers)))
3090 6 0 if (likely(c->expected_cl > 0)) {
3119 6 2 RETVAL = c->fd;
3126 0 0 RETVAL = c->is_keepalive;
3134 2 1 RETVAL = feersum_conn_guard(aTHX_ c, (items == 2) ? ST(1) : NULL);
3145 69 4 if (likely(c->rbuf)) SvREFCNT_dec(c->rbuf);
3147 1 72 if (c->wbuf_rinq) {
3149 1 1 while ((m = (struct iomatrix *)rinq_shift(&c->wbuf_rinq)) != NULL) {
3150 1 1 for (i=0; i < m->count; i++) {
3151 0 1 if (m->sv[i]) SvREFCNT_dec(m->sv[i]);
3157 70 3 if (likely(c->req)) {
3158 68 2 if (c->req->buf) SvREFCNT_dec(c->req->buf);
3159 58 12 if (likely(c->req->path)) SvREFCNT_dec(c->req->path);
3160 58 12 if (likely(c->req->query)) SvREFCNT_dec(c->req->query);
3161 55 15 if (likely(c->req->addr)) SvREFCNT_dec(c->req->addr);
3162 55 15 if (likely(c->req->port)) SvREFCNT_dec(c->req->port);
3166 73 0 if (likely(c->sa)) free(c->sa);
3170 0 73 if (c->poll_write_cb) SvREFCNT_dec(c->poll_write_cb);
3172 2 71 if (c->ext_guard) SvREFCNT_dec(c->ext_guard);
3176 3 70 if (unlikely(shutting_down && active_conns <= 0)) {
1 2 if (unlikely(shutting_down && active_conns <= 0)) {
3182 1 0 if (shutdown_cb_cv) {
3183 0 1 PUSHMARK(SP);
3201 0 24 I_EV_API("Feersum");
24 0 I_EV_API("Feersum");
0 24 I_EV_API("Feersum");