728x90
반응형
수정 내역 (Revision History)
Asio 1.18.1 / Boost 1.75
- Windows에서 UNIX 도메인 소켓에 대한 지원을 사용할 수 있다. Windows 10부터는 UNIX 도메인 소켓("local" 소켓이라고 함)이 Windows에서 지원되지만, connect_pair 함수(operation_not_supported 오류로 실패 함)는 예외이다.
- ip::basic_resolver에 실행기(executor)-변환 구성과 할당을 추가했다.
- 다형성 실행기(executor)와 핸들러 호출 후크(더 이상 사용되지 않음) 사이의 호환성을 추가했다.
- experimental::as_single 완료 토큰 어댑터를 추가했다. as_single 완료 토큰 어댑터는 완료 핸들러 인수가 단일 인수로 결합되어야 하는 것을 지정하는 데 사용될 수 있다. 단일 파라미터가 있는 완료 서명의 경우, 인수는 있는 그대로 전달된다. 둘 이상의 파라미터가 있는 서명의 경우, 인수는 튜플(tuple)로 결합되어 있다. as_single 어댑터는 다음과 같이 use_awaitable 및 구조화된 바인딩과 함께 사용될 수 있다:
auto [e, n] = co_await socket.async_read_some( boost::asio::buffer(data), as_single(use_awaitable));
또는 다음과 같은 기본 완료 토큰으로 사용될 수 있다:
using default_token = as_single_t<use_awaitable_t<>>; using tcp_socket = default_token::as_default_on_t<tcp::socket>; // ... awaitable<void> do_read(tcp_socket socket) { // ... auto [e, n] = co_await socket.async_read_some(boost::asio::buffer(data)); // ... }
- 지원 여부를 감지하기 위해 _POSIX_VERSION을 사용하여, 더 많은 플랫폼에서 MSG_NOSIGNAL에 대한 지원을 추가했다.
- Windows에서 libpthread를 사용하여 컴파일하는 기능을 추가했다.
- Intel C++ 컴파일러에 대한 해결 방법을 추가했다.
- 사용자 지정 실행기(executor)가 없는 핸들러에 대한 검색과 최적화에 더 많은 지원을 추가했다.
- Windows에서 타이머 취소시 발생하는 잠금 경합을 줄였다.
- 성능 측정에 영향을 미쳐서 이전에 제거된 null-pointer 검사를 복원했다.
- const-qualified executor()를 테스트 하도록 실행기(executor) 개념을 수정했다.
- RTTI 지원이 없는 빌드에 대한 any_executor 지원을 수정했다.
- RTTI 지원없이 작동하도록 thread_pool 단위 테스트를 수정했다.
- Windows에서 clang과 C++20 코-루틴의 호환성을 수정했다.
- Windows 런타임의 일부 호환성 문제를 수정했다.
- asio::query 추가로 인한 쉐도우 이름 경고를 수정했다.
- Linux에서 "logical(논리적) 또는 equal expression(동등식)" 경고를 수정했다.
- 양호한 switch가 완료되지 못하는 경고를 수정했다.
- 누락된 push/pop_options.hpp 포함을 추가했다.
- "zero-as-null-pointer-constant(널 포인터 상수로 0)" 이라는 경고를 억제했다.
- comma-operator(쉼표 연산자) 경고를 수정했다.
- "select reactor"가 Windows에서 사용되는 시기를 명확히 하기 위해 문서를 업데이트했다.
- any_executor의 비교와 변환으로 인한 잠재적 모호성을 수정했다.
- MSVC 19.8에서 실험적이지 않은 C++20 코-루틴 감지를 추가했다.
- uClibc 호환성을 수정했다.
- 이전 C++ 버전이나 호환성이 낮은 컴파일러가 대상일 경우, Networking TS Executor의 strand<> 적응을 수정했다.
Asio 1.18.0 / Boost 1.74
- 제안된 표준 실행기(executor)의 구현 추가되었다. (P0443r13, P1348r0 그리고 P1393r0)
- Asio의 기능에 제안된 표준 실행기(executor)에 대한 지원 추가되었다.
- io_context::executor_type, thread_pool::executor_type, system_executor 그리고 strand 실행기(executor)는 이제 제안된 표준 실행기(executor)에 대한 요구 사항을 충족한다. 이런 클래스는 또한 Networking TS 모델의 실행자(executor)에 대한 기존 요구사항을 계속 충족한다.
- 비동기 작업과 같은 모든 I/O 개체 그리고 dispatch, post, defer, get_associated_executor, bind_executor, make_work_guard, spawn, co_spawn, async_compose, use_future 등을 포함하는 유틸리티는 새로 제안된 표준 실행기(executor) 및 기존 Netowkring TS 실행기(executor)와 상호 운용될 수 있다. 구현은 컴파일 시간에 특정 실행기(executor)가 만나는 모델로 결정된다. 두 모델이 모두 감지되면, 제안된 표준 실행기(executor) 모델이 우선적으로 사용된다.
- any_io_executor 유형 별칭은 모든 I/O 객체에 대한 새로운 기본 런타임 다형성 실행기(executor)로 도입되었다. 이 유형 별칭은 I/O와 함께 사용하도록 지정된 지원 가능한 속성의 집합을 포함하는 execution::any_executor<> 템플릿을 지정한다. 이 변경으로 이전 다형성 래퍼인 executor를 직접 사용하는 기존 코드가 손상될 수 있다. 이전 버전과의 호환성이 필요한 경우, BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT를 정의하여 any_io_executor 유형 별칭을 대신 실행기(executor) 다형성 래퍼를 지정하도록 변경할 수 있다.
- BOOST_ASIO_NO_TS_EXECUTORS를 정의하여 실행기(executor)의 기존 Networking TS 모델에 대한 지원을 사용하지 않게 할 수 있다.
- 이동 생성 및 할당을 basic_waitable_timer로 변환하는 기능이 추가되었다. 실행기(executor) 유형이 변환 가능하도록 주어졌다면, 다른 타이머 유형 간에 이동 생성 및 할당이 가능하다. 예를 들면:
basic_waitable_timer< clock_type, traits_type, io_context::executor_type > timer1(my_io_context); basic_waitable_timer< clock_type, traits_type, any_io_executor // polymorphic wrapper > timer2(std::move(timer1));
- gcc 10 사용시 C++20 코-루틴 지원을 사용할 수 있다.
- awaitable을 시작하는 co_spawn 오버로드가 추가되었다. 이 변경으로 아래와 같이 작성된 코드를
co_spawn(executor, [socket = std::move(socket)]() mutable { return echo(std::move(socket)); }, detached);
아래 처럼 작성이 가능하다.
co_spawn(executor, echo(std::move(socket)), detached);
- 실행기(executor) 유형간의 변환을 사용하기 위해서, use_awaitable_t 기본 실행기(executor) 어댑터에 새로운 오버로드 생성자가 추가되었다.
- as_default_on() 및 as_default_on_t<> 멤버를 추가하여, 기본 완료 토큰으로 detached_t를 사용하기위한 지원이 추가되었다.
- ssl::stream<>에 이동 생성자가 추가되었다.
- gather-write(분산된 버퍼를 수집하여 쓰기) 버퍼 시퀀스를 선형화하도록, ssl::stream 쓰기 작업이 변경되었다.
- 더 이상 사용되지 않는 asio_handler_invoke 후크의 컴파일 시간 검출이 추가되었다. 이 후크는 associated_executor Networking TS 특성과 get_associated_executor() 함수의 도입으로 더 이상 사용되지 않는다. BOOST_ASIO_NO_DEPRECATED와 함께 응용프로그램을 컴파일하면, 어떤 핸들러에서 asio_handler_invoke 후크를 구현하는 경우 즉시 컴파일 오류를 발생하게 된다.
- 더 이상 사용되지 않는 asio_handler_allocate 및 asio_handler_deallocate 후크의 컴파일 시간 검출이 추가되었다. 이런 후크는 associated_allocator Networking TS 특성과 get_associated_allocator() 함수의 도입으로 더 이상 사용되지 않는다. BOOST_ASIO_NO_DEPRECATED와 함께 응용프로그램을 컴파일하면, 어떤 핸들러에서 asio_handler_allocate나 asio_handler_deallocate 후크를 구현하는 경우 즉시 컴파일 오류를 발생하게 된다.
- 다음을 포함한 여러 성능 최적화를 구현했다:
- 단일 버퍼 작업을 특수화하여 recvmsg 대신에 recv를, sendmsg 대신에 send, readv 대신에 read 그리고 writev 대신에 write를 사용한다.
- 다형성 래퍼 실행기(executor)의 참조 계산 오버헤드를 줄인다.
- 가능한 빨리 시스템 호출 작업 래퍼에서 반환하고, 오류 경로에 있을 때만 errno 및 error code에 접근한다.
- 'native(기본)' I/O 실행기(executor)가 감지(io_context::executor_type과 같은)되면 추가 최적화를 적용한다.
- 핸들러 추적에 소스 위치 지원이 추가되었다. 새로운 BOOST_ASIO_HANDLER_LOCATION((file_name, line, function_name)) 매크로를 사용하여 핸들러 추적 메커니즘에 소스 위치를 알릴 수 있다. 이 매크로는 스택에 배치된 개체를 선언한다. 그런 다음 위치 정보와 함께 비동기 작업이 시작되면, 비동기 작업의 시작을 나타내는 n*m 라인 앞에 <action> n^m 작업을 사용하여 라인을 출력한다. 예를 들면:
@asio|1589423304.861944|>7|ec=system:0,bytes_transferred=5 @asio|1589423304.861952|7^8|in 'async_write' (./../../../include/asio/impl/write.hpp:330) @asio|1589423304.861952|7^8|called from 'do_write' (handler_tracking/async_tcp_echo_server.cpp:62) @asio|1589423304.861952|7^8|called from 'operator()' (handler_tracking/async_tcp_echo_server.cpp:51) @asio|1589423304.861952|7*8|socket@0x7ff61c008230.async_send @asio|1589423304.861975|.8|non_blocking_send,ec=system:0,bytes_transferred=5 @asio|1589423304.861980|<7|
std::source_location 또는 std::experimental::source_location을 사용할 수 있으면, use_awaitable_t 토큰(기본 생성자 또는 기본 완료 토큰이 사용되는 경우)은 핸들러 추적에서 새로 생성된 각 비동기 작업에 대한 소스 위치를 출력하도록한다. use_awaitable_t 객체는 위치 정보와 함께 명시적으로 생성될 수 있다. - handlerviz.pl 도구에 대한 다양항 개선 사항을 구현했다.
- 빨간색 윤곽선으로 표시된 그래프 하단에 보류중인(pending) 핸들러에 대한 노드를 추가한다.
- 가장자리 레이블의 도구 설명에 소스 위치를 표시한다. (SVG 용)
- 보이지 않는 노드를 사용하여 관련 제어 흐름을 수직으로 유지하기 위해 순서를 적용한다.
- 핸들러 추적 출력을 처리하여 "live" 핸들러 목록을 생성하는 handlerlive.pl 도구가 추가되었다. 라이브 핸들러는 현재 실행중인 핸들러뿐만 아니라 보류중인(pending) 비동기 작업과 관련된 핸들러이다. 예를 들면:
cat output.txt | perl handlerlive.pl perl handerlive.pl < output.txt perl handlerlive.pl output.txt
- 지정된 핸들러를 생성한 트리에서 이벤트만 포함하도록 핸들러 추적 출력을 필터링하는 handlertree.pl 도구가 추가되었다. 예를 들어 핸들러 123, 456 및 선행 작업과 연관된 이벤트만 포함하도록 출력을 필터링하려면 다음을 수행한다.
cat output.txt | perl handlertree.pl 123 456 perl handlertree.pl 123 456 < output.txt
이 스크립트는 handlerlive.pl 및 handlerviz.pl와 결합하여 "live" 비동기 작업 체인의 그래프를 생성할 수 있다. 예를 들면:
cat output.txt | \ perl handlertree.pl `perl handlerlive.pl output.txt` | \ perl handlerviz.pl | \ dot -Tsvg > output.svg
- clang 기반 Embarcadero C++ 컴파일러에 대한 변경 사항이 추가되었다.
- 여러 스레드에서 동시에 Windows I/O 완료 포트 백엔드를 초기화하는 경우 발생할 수 있는 교착 상태가 수정되었다.
- lvalue로 전달될 경우 복사 가능한 핸들러와 함께 작업하도록 async_compose가 수정되었다.
- co_spawn의 완료 서명 공제가 수정되었다.
- executor_binder 구현에서 가짜 Executor 기본 클래스가 제거되었다.
- 문서 및 예제의 다양한 수정 및 개선.
728x90
반응형
'Boost C++ Libraries > Boost.Asio' 카테고리의 다른 글
Boost.Asio 색인 - 심볼 (0) | 2020.12.23 |
---|---|
Boost.Asio 색인 (0) | 2020.12.22 |
Boost.Asio 제안된 표준 Executors (0) | 2020.12.21 |
Boost.Asio "C++ Extensions for Networking" TS 호환성 (0) | 2020.12.20 |
Boost.Asio 참조 - 윈도우-기반 (0) | 2020.12.20 |