Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

Category:

Чистый Си в 2020

INLINE static void uv_insert_pending_req(uv_loop_t* loop, uv_req_t* req) {
  if (loop->pending_reqs_tail) {
    req->next_req = loop->pending_reqs_tail->next_req;
    loop->pending_reqs_tail->next_req = req;
    loop->pending_reqs_tail = req;
  } else {
    req->next_req = req;
    loop->pending_reqs_tail = req;
  }
}
По-моему, любить писать такой код каждый раз - это особого рода болезнь головы. Это похоже на FIFO-очередь на интрузивном однонаправленном списке со вставкой в хвост, но на самом деле кольцо. Дополнительные очки спецолимпиады заработали за:

- борьбу с инлайнером в 2020
- оставленные внутри ветвления (по недосмотру или с целью "читаемости") одинаковые куски
- рябь в глазах от loop->pending_reqs_tail (зато "явность", и отсутствие указателей на указатели, чо)

Зато IOCP используют. Но там тоже хез, если использовать в своём приложении - то надо аккуратно следить за тем, есть ли разница от флагов. Они, например, всё открывают с backup semantics и share_read, просто из-за какой-то юниксоидной шизы. В любом случае понятно, что абстракция течёт, конечно.

Интересно в этом плане посмотреть на windows only IOCP event loop, с полным контролем флагов, на нормальном языке (С++17, Rust, TS), c промисами, блекджеком и шлюхами.
Tags: programming, все пидарасы а я
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 42 comments