Commit 3d1aabcb authored by Francois Doray's avatar Francois Doray Committed by Commit Bot

Clarify ScopedBlockingCall documentation.

This CL introduces concrete usage examples.

Bug: 
Change-Id: I9ecc5731aff810fb6b5e2cbf818f610ab6c1a7a8
Reviewed-on: https://chromium-review.googlesource.com/657259
Commit-Queue: François Doray <fdoray@chromium.org>
Reviewed-by: default avatarGabriel Charette <gab@chromium.org>
Cr-Commit-Position: refs/heads/master@{#548528}
parent 2b925d25
...@@ -24,14 +24,54 @@ namespace internal { ...@@ -24,14 +24,54 @@ namespace internal {
class BlockingObserver; class BlockingObserver;
} }
// This class can be instantiated in a scope where a a blocking call (which // This class must be instantiated in every scope where a blocking call is made.
// isn't using local computing resources -- e.g. a synchronous network request) // CPU usage should be minimal within that scope. //base APIs that block
// is made. Instantiation will hint the BlockingObserver for this thread about // instantiate their own ScopedBlockingCall; it is not necessary to instantiate
// the scope of the blocking operation. // another ScopedBlockingCall in the scope where these APIs are used.
// //
// In particular, when instantiated from a TaskScheduler parallel or sequenced // Good:
// task, this will allow the thread to be replaced in its pool (more or less // Data data;
// aggressively depending on BlockingType). // {
// ScopedBlockingCall scoped_blocking_call(BlockingType::WILL_BLOCK);
// data = GetDataFromNetwork();
// }
// CPUIntensiveProcessing(data);
//
// Bad:
// ScopedBlockingCall scoped_blocking_call(BlockingType::WILL_BLOCK);
// Data data = GetDataFromNetwork();
// CPUIntensiveProcessing(data); // CPU usage within a ScopedBlockingCall.
//
// Good:
// Data a;
// Data b;
// {
// ScopedBlockingCall scoped_blocking_call(BlockingType::MAY_BLOCK);
// a = GetDataFromMemoryCacheOrNetwork();
// b = GetDataFromMemoryCacheOrNetwork();
// }
// CPUIntensiveProcessing(a);
// CPUIntensiveProcessing(b);
//
// Bad:
// ScopedBlockingCall scoped_blocking_call(BlockingType::MAY_BLOCK);
// Data a = GetDataFromMemoryCacheOrNetwork();
// Data b = GetDataFromMemoryCacheOrNetwork();
// CPUIntensiveProcessing(a); // CPU usage within a ScopedBlockingCall.
// CPUIntensiveProcessing(b); // CPU usage within a ScopedBlockingCall.
//
// Good:
// base::WaitableEvent waitable_event(...);
// waitable_event.Wait();
//
// Bad:
// base::WaitableEvent waitable_event(...);
// ScopedBlockingCall scoped_blocking_call(BlockingType::WILL_BLOCK);
// waitable_event.Wait(); // Wait() instantiates its own ScopedBlockingCall.
//
// When a ScopedBlockingCall is instantiated from a TaskScheduler parallel or
// sequenced task, the thread pool size is incremented to compensate for the
// blocked thread (more or less aggressively depending on BlockingType).
class BASE_EXPORT ScopedBlockingCall { class BASE_EXPORT ScopedBlockingCall {
public: public:
ScopedBlockingCall(BlockingType blocking_type); ScopedBlockingCall(BlockingType blocking_type);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment