Pull to refresh

Comments 7

1) А зачем здесь используются unique_ptr-ы?
std::unordered_map<curl_socket_t, std::unique_ptr<active_socket_t>> active_sockets_;

2) (На правах идеи, не факт, что это приемлемо). Я бы вынес всю работу за пределы callback-ов. То есть, в callback-е только лишь заполняется очередь действий, а в конце event loop-а эта очередь разбирается и выполняются все действия
По п.1. Хороший вопрос. Спасибо. Наверное, можно было бы попробовать хранить active_socket_t прямо по значению внутри unordered_map. Но тогда его нужно было бы делать Moveable-типом, чтобы можно было делать такой вызов:
active_sockets_.emplace(handle, active_socket_t{ioctx_})
А можно ли его таковым сделать зависит от того, является ли asio::ip::tcp::socket Moveable-типом. В случае же с unique_ptr-ом для active_socket_t вообще не нужно было ни о чем думать: ни о том, является ли asio::ip::tcp::socket Moveable, ни о том, в каком контейнере затем active_socket_t будут хранится. И будут ли они вообще где-то храниться.

По п.2. Не готов сейчас сказать, насколько бы это упростило реализацию. Тут же основной момент в том, что в event_cb нужно дергать curl_multi_socket_action, откуда будут дергать socket_function. И внутри этой socket_function нужно обновить статус и выяснить, какие операции над сокетом нас будут интересовать дальше. Можно это обновление статуса сперва закинуть в какую-то очередь, потом по ней пройтись… Но будет ли это проще — не знаю.
1) У map-а есть метод, который конструирует данные на месте
 m.emplace(std::piecewise_construct,
          std::forward_as_tuple("c"),
          std::forward_as_tuple(10, 'c'));
Спасибо, я про него постоянно забываю и использовать пока не приходилось.
Попробовал.
От такого варианта emplace пользы в данном случае нет. Т.к. сначала нужно создать объект active_socket_t, затем извлечь из него native_handle. И только после этого делать emplace с использованием native_handle в качестве ключа.

Чтобы это работало нужно делать active_socket_t Moveable-типом. Это возможно, т.к. asio::ip::tcp::socket так же Moveable-тип.
Да, как-то не подумал над этим
Sign up to leave a comment.

Articles

Change theme settings