webrtc_m130/abseil-in-webrtc.md
Markus Handell f70fbc8411 Introduces rtc_base/synchronization/mutex.h.
This change introduces a new non-reentrant mutex to WebRTC. It
enables eventual migration to Abseil's mutex.

The mutex types supportable by webrtc::Mutex are

- absl::Mutex
- CriticalSection (Windows only)
- pthread_mutex (POSIX only)

In addition to introducing the mutexes, the CL also changes
PacketBuffer to use the new mutex instead of rtc::CriticalSection.

The method of yielding from critical_section.cc was given a
mini-cleanup and YieldCurrentThread() was added to
rtc_base/synchronization/yield.h/cc.

Additionally, google_benchmark benchmarks for the mutexes were added
(test courtesy of danilchap@), and some results from a pthread/Abseil
shootout were added showing Abseil has the advantage in higher
contention.

Bug: webrtc:11567, webrtc:11634
Change-Id: Iaec324ccb32ec3851bf6db3fd290f5ea5dee4c81
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/176230
Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Reviewed-by: Tommi <tommi@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#31443}
2020-06-04 09:55:12 +00:00

2.3 KiB
Raw Blame History

Using Abseil in WebRTC

You may use a subset of the utilities provided by the Abseil library when writing WebRTC C++ code. Below, we list the explicitly allowed and the explicitly disallowed subsets of Abseil; if you find yourself in need of something that isnt in either subset, please add it to the allowed subset in this doc in the same CL that adds the first use.

Allowed

  • absl::InlinedVector
  • absl::WrapUnique
  • absl::optional and related stuff from absl/types/optional.h.
  • absl::string_view
  • The functions in absl/strings/ascii.h, absl/strings/match.h, and absl/strings/str_replace.h.
  • absl::is_trivially_copy_constructible, absl::is_trivially_copy_assignable, and absl::is_trivially_destructible from absl/meta/type_traits.h.
  • absl::variant and related stuff from absl/types/variant.h.
  • The functions in absl/algorithm/algorithm.h and absl/algorithm/container.h.
  • absl/base/const_init.h for mutex initialization.
  • The macros in absl/base/attributes.h, absl/base/config.h and absl/base/macros.h.

Disallowed

absl::make_unique

Use std::make_unique instead.

absl::Mutex

Use webrtc::Mutex instead.

Chromium has a ban on new static initializers, and absl::Mutex uses one. To make absl::Mutex available, we would need to nicely ask the Abseil team to remove that initializer (like they already did for a spinlock initializer). Additionally, absl::Mutex handles time in a way that may not be compatible with the rest of WebRTC.

absl::Span

Use rtc::ArrayView instead.

absl::Span differs from rtc::ArrayView on several points, and both of them differ from the std::span that was voted into C++20—and std::span is likely to undergo further changes before C++20 is finalized. We should just keep using rtc::ArrayView and avoid absl::Span until C++20 is finalized and the Abseil team has decided if they will change absl::Span to match. Bug.

absl::StrCat, absl::StrAppend, absl::StrJoin, absl::StrSplit

Use rtc::SimpleStringBuilder to build strings.

These are optimized for speed, not binary size. Even StrCat calls with a modest number of arguments can easily add several hundred bytes to the binary.