Mir

Merge lp:~kdub/mir/buffer-stream-use-vault into lp:mir

Proposed by Kevin DuBois on 2015-08-20
Status: Merged
Approved by: Kevin DuBois on 2015-08-28
Approved revision: 2842
Merged at revision: 2889
Proposed branch: lp:~kdub/mir/buffer-stream-use-vault
Merge into: lp:mir
Prerequisite: lp:~kdub/mir/client-stream-internal-refactoring
Diff against target: 514 lines (+204/-39)
6 files modified
src/client/buffer_stream.cpp (+111/-2)
src/client/buffer_vault.cpp (+7/-2)
src/client/buffer_vault.h (+1/-1)
tests/include/mir/test/doubles/null_client_buffer.h (+6/-1)
tests/unit-tests/client/test_buffer_vault.cpp (+2/-2)
tests/unit-tests/client/test_client_buffer_stream.cpp (+77/-31)
To merge this branch: bzr merge lp:~kdub/mir/buffer-stream-use-vault
Reviewer Review Type Date Requested Status
PS Jenkins bot continuous-integration Approve on 2015-08-28
Alexandros Frantzis (community) Approve on 2015-08-27
Alan Griffiths Approve on 2015-08-27
Chris Halse Rogers 2015-08-20 Needs Information on 2015-08-24
Review via email: mp+268633@code.launchpad.net

Commit Message

client: if not given a buffer at startup, switch to the new buffer semantics instead of throwing.

Description of the Change

client: if not given a buffer at startup, switch to the new buffer semantics instead of throwing.

To post a comment you must log in.
Chris Halse Rogers (raof) wrote :

28 + auto request = mcl::make_protobuf_object<mp::BufferAllocation>();

Do we still need to do the heap-allocation dance? I *think* now that we can version libmirprotobuf we can safely use the stack?

Otherwise seems sensible.

review: Needs Information
Alexandros Frantzis (afrantzis) wrote :

101 + return &next_buffer_wait_handle;
115 + MirWaitHandle next_buffer_wait_handle;

The default constructed MirWaitHandle will block if mir_wait_for_one() is invoked.

mir_wait_for_one is not particularly popular in our code base, but since we have it, we should ensure the wait handles we return work with it. Some paths in the ExchangeSemantics also have the same issue.

Looks good otherwise.

review: Needs Fixing
Alan Griffiths (alan-griffiths) wrote :

Alexandros has already spotted the only slight concern

review: Approve
Kevin DuBois (kdub) wrote :

Good point, fixed

Alexandros Frantzis (afrantzis) wrote :

Looks good.

review: Approve
review: Approve (continuous-integration)
Kevin DuBois (kdub) wrote :

that will teach me to merge mir after top-approving...

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/client/buffer_stream.cpp'
2--- src/client/buffer_stream.cpp 2015-08-20 16:51:36 +0000
3+++ src/client/buffer_stream.cpp 2015-08-28 17:28:26 +0000
4@@ -25,6 +25,7 @@
5 #include "logging/perf_report.h"
6 #include "rpc/mir_display_server.h"
7 #include "mir_protobuf.pb.h"
8+#include "buffer_vault.h"
9
10 #include "mir/log.h"
11 #include "mir/client_platform.h"
12@@ -215,6 +216,111 @@
13 MirWaitHandle next_buffer_wait_handle;
14 bool server_connection_lost {false};
15 };
16+
17+class Requests : public mcl::ServerBufferRequests
18+{
19+public:
20+ Requests(mclr::DisplayServer& server, int stream_id) :
21+ server(server),
22+ stream_id(stream_id)
23+ {
24+ }
25+
26+ void allocate_buffer(geom::Size size, MirPixelFormat format, int usage) override
27+ {
28+ mp::BufferAllocation request;
29+ request.mutable_id()->set_value(stream_id);
30+ auto buf_params = request.add_buffer_requests();
31+ buf_params->set_width(size.width.as_int());
32+ buf_params->set_height(size.height.as_int());
33+ buf_params->set_pixel_format(format);
34+ buf_params->set_buffer_usage(usage);
35+ server.allocate_buffers(&request, &protobuf_void,
36+ google::protobuf::NewCallback(google::protobuf::DoNothing));
37+ }
38+
39+ void free_buffer(int buffer_id) override
40+ {
41+ mp::BufferRelease request;
42+ request.mutable_id()->set_value(stream_id);
43+ request.add_buffers()->set_buffer_id(buffer_id);
44+ server.release_buffers(&request, &protobuf_void,
45+ google::protobuf::NewCallback(google::protobuf::DoNothing));
46+ }
47+
48+ void submit_buffer(int id, mcl::ClientBuffer&) override
49+ {
50+ mp::BufferRequest request;
51+ request.mutable_id()->set_value(stream_id);
52+ request.mutable_buffer()->set_buffer_id(id);
53+ server.submit_buffer(&request, &protobuf_void,
54+ google::protobuf::NewCallback(google::protobuf::DoNothing));
55+ }
56+
57+private:
58+ mclr::DisplayServer& server;
59+ mp::Void protobuf_void;
60+ int stream_id;
61+};
62+
63+struct NewBufferSemantics : mcl::ServerBufferSemantics
64+{
65+ NewBufferSemantics(
66+ std::shared_ptr<mcl::ClientBufferFactory> const& factory,
67+ std::shared_ptr<mcl::ServerBufferRequests> const& requests,
68+ geom::Size size, MirPixelFormat format, int usage,
69+ unsigned int initial_nbuffers) :
70+ vault(factory, requests, size, format, usage, initial_nbuffers)
71+ {
72+ }
73+
74+ void deposit(mp::Buffer const& buffer, geom::Size, MirPixelFormat) override
75+ {
76+ vault.wire_transfer_inbound(buffer);
77+ current_buffer_id_ = buffer.buffer_id();
78+ }
79+
80+ std::shared_ptr<mir::client::ClientBuffer> current_buffer() override
81+ {
82+ if (!current_buffer_)
83+ current_buffer_ = vault.withdraw().get();
84+ return current_buffer_;
85+ }
86+
87+ uint32_t current_buffer_id() override
88+ {
89+ return current_buffer_id_;
90+ }
91+
92+ MirWaitHandle* submit(std::function<void()> const& done, geom::Size, MirPixelFormat, int) override
93+ {
94+ if (!current_buffer_)
95+ current_buffer_ = vault.withdraw().get();
96+
97+ vault.deposit(current_buffer_);
98+
99+ next_buffer_wait_handle.expect_result();
100+ vault.wire_transfer_outbound(current_buffer_);
101+ next_buffer_wait_handle.result_received();
102+
103+ current_buffer_ = vault.withdraw().get();
104+ done();
105+ return &next_buffer_wait_handle;
106+ }
107+
108+ void lost_connection() override
109+ {
110+ }
111+
112+ void set_buffer_cache_size(unsigned int) override
113+ {
114+ }
115+
116+ mcl::BufferVault vault;
117+ std::shared_ptr<mcl::ClientBuffer> current_buffer_;
118+ int current_buffer_id_;
119+ MirWaitHandle next_buffer_wait_handle;
120+};
121 }
122
123 mcl::BufferStream::BufferStream(
124@@ -292,8 +398,11 @@
125 }
126 else
127 {
128- //TODO: use the submission semantics here
129- BOOST_THROW_EXCEPTION(std::runtime_error("Can not create buffer stream: " + std::string(protobuf_bs->error())));
130+ int initial_nbuffers = 3u;
131+ buffer_depository = std::make_unique<NewBufferSemantics>(
132+ client_platform->create_buffer_factory(),
133+ std::make_shared<Requests>(display_server, protobuf_bs->id().value()),
134+ ideal_buffer_size, mir_pixel_format_abgr_8888, 0, initial_nbuffers);
135 }
136
137
138
139=== modified file 'src/client/buffer_vault.cpp'
140--- src/client/buffer_vault.cpp 2015-08-27 11:31:48 +0000
141+++ src/client/buffer_vault.cpp 2015-08-28 17:28:26 +0000
142@@ -90,7 +90,9 @@
143
144 void mcl::BufferVault::wire_transfer_outbound(std::shared_ptr<mcl::ClientBuffer> const& buffer)
145 {
146- std::lock_guard<std::mutex> lk(mutex);
147+ int id;
148+ std::shared_ptr<mcl::ClientBuffer> submit_buffer;
149+ std::unique_lock<std::mutex> lk(mutex);
150 auto it = std::find_if(buffers.begin(), buffers.end(),
151 [&buffer](std::pair<int, BufferEntry> const& entry) { return buffer == entry.second.buffer; });
152 if (it == buffers.end() || it->second.owner != Owner::Self)
153@@ -98,7 +100,10 @@
154
155 it->second.owner = Owner::Server;
156 it->second.buffer->mark_as_submitted();
157- server_requests->submit_buffer(*it->second.buffer);
158+ submit_buffer = it->second.buffer;
159+ id = it->first;
160+ lk.unlock();
161+ server_requests->submit_buffer(id, *submit_buffer);
162 }
163
164 void mcl::BufferVault::wire_transfer_inbound(mp::Buffer const& protobuf_buffer)
165
166=== modified file 'src/client/buffer_vault.h'
167--- src/client/buffer_vault.h 2015-08-27 11:31:48 +0000
168+++ src/client/buffer_vault.h 2015-08-28 17:28:26 +0000
169@@ -37,7 +37,7 @@
170 public:
171 virtual void allocate_buffer(geometry::Size size, MirPixelFormat format, int usage) = 0;
172 virtual void free_buffer(int buffer_id) = 0;
173- virtual void submit_buffer(ClientBuffer&) = 0;
174+ virtual void submit_buffer(int buffer_id, ClientBuffer&) = 0;
175 virtual ~ServerBufferRequests() = default;
176 protected:
177 ServerBufferRequests() = default;
178
179=== modified file 'tests/include/mir/test/doubles/null_client_buffer.h'
180--- tests/include/mir/test/doubles/null_client_buffer.h 2015-02-22 07:46:25 +0000
181+++ tests/include/mir/test/doubles/null_client_buffer.h 2015-08-28 17:28:26 +0000
182@@ -31,11 +31,15 @@
183 class NullClientBuffer : public client::ClientBuffer
184 {
185 public:
186+ NullClientBuffer() : NullClientBuffer(geometry::Size()) {}
187+ NullClientBuffer(geometry::Size sz) : sz(sz)
188+ {
189+ }
190 std::shared_ptr<client::MemoryRegion> secure_for_cpu_write()
191 {
192 return std::make_shared<client::MemoryRegion>();
193 }
194- geometry::Size size() const { return geometry::Size(); }
195+ geometry::Size size() const { return sz; }
196 geometry::Stride stride() const { return geometry::Stride(); }
197 MirPixelFormat pixel_format() const { return mir_pixel_format_invalid; }
198 uint32_t age() const { return 0; }
199@@ -47,6 +51,7 @@
200 {
201 return nullptr;
202 }
203+ geometry::Size sz;
204 };
205
206 }
207
208=== modified file 'tests/unit-tests/client/test_buffer_vault.cpp'
209--- tests/unit-tests/client/test_buffer_vault.cpp 2015-08-27 11:31:48 +0000
210+++ tests/unit-tests/client/test_buffer_vault.cpp 2015-08-28 17:28:26 +0000
211@@ -81,7 +81,7 @@
212 {
213 MOCK_METHOD3(allocate_buffer, void(geom::Size size, MirPixelFormat format, int usage));
214 MOCK_METHOD1(free_buffer, void(int));
215- MOCK_METHOD1(submit_buffer, void(mcl::ClientBuffer&));
216+ MOCK_METHOD2(submit_buffer, void(int, mcl::ClientBuffer&));
217 };
218
219 struct BufferVault : public testing::Test
220@@ -189,7 +189,7 @@
221 TEST_F(StartedBufferVault, can_deposit_buffer)
222 {
223 auto buffer = vault.withdraw().get();
224- EXPECT_CALL(mock_requests, submit_buffer(Ref(*buffer)));
225+ EXPECT_CALL(mock_requests, submit_buffer(_,Ref(*buffer)));
226 vault.deposit(buffer);
227 vault.wire_transfer_outbound(buffer);
228 }
229
230=== modified file 'tests/unit-tests/client/test_client_buffer_stream.cpp'
231--- tests/unit-tests/client/test_client_buffer_stream.cpp 2015-08-20 16:51:36 +0000
232+++ tests/unit-tests/client/test_client_buffer_stream.cpp 2015-08-28 17:28:26 +0000
233@@ -58,22 +58,33 @@
234 {
235 ON_CALL(*this, submit_buffer(_,_,_))
236 .WillByDefault(RunProtobufClosure());
237+ ON_CALL(*this, allocate_buffers(_,_,_))
238+ .WillByDefault(DoAll(InvokeWithoutArgs([this]{ alloc_count++; }), RunProtobufClosure()));
239+ ON_CALL(*this, release_buffers(_,_,_))
240+ .WillByDefault(RunProtobufClosure());
241 }
242- MOCK_METHOD3(screencast_buffer,
243- void(
244- mp::ScreencastId const* /*request*/,
245- mp::Buffer* /*response*/,
246- google::protobuf::Closure* /*done*/));
247- MOCK_METHOD3(submit_buffer,
248- void(
249- mp::BufferRequest const* /*request*/,
250- mp::Void* /*response*/,
251- google::protobuf::Closure* /*done*/));
252- MOCK_METHOD3(exchange_buffer,
253- void(
254- mp::BufferRequest const* /*request*/,
255- mp::Buffer* /*response*/,
256- google::protobuf::Closure* /*done*/));
257+
258+ MOCK_METHOD3(screencast_buffer, void(
259+ mp::ScreencastId const* /*request*/,
260+ mp::Buffer* /*response*/,
261+ google::protobuf::Closure* /*done*/));
262+ MOCK_METHOD3(allocate_buffers, void(
263+ mir::protobuf::BufferAllocation const*,
264+ mir::protobuf::Void*,
265+ google::protobuf::Closure*));
266+ MOCK_METHOD3(release_buffers, void(
267+ mir::protobuf::BufferRelease const*,
268+ mir::protobuf::Void*,
269+ google::protobuf::Closure*));
270+ MOCK_METHOD3(submit_buffer, void(
271+ mp::BufferRequest const* /*request*/,
272+ mp::Void* /*response*/,
273+ google::protobuf::Closure* /*done*/));
274+ MOCK_METHOD3(exchange_buffer, void(
275+ mp::BufferRequest const* /*request*/,
276+ mp::Buffer* /*response*/,
277+ google::protobuf::Closure* /*done*/));
278+ unsigned int alloc_count{0};
279 };
280
281 struct StubClientPlatform : public mcl::ClientPlatform
282@@ -128,6 +139,10 @@
283
284 struct MockClientBuffer : public mtd::NullClientBuffer
285 {
286+ MockClientBuffer(geom::Size size) :
287+ mtd::NullClientBuffer(size)
288+ {
289+ }
290 MOCK_METHOD0(secure_for_cpu_write, std::shared_ptr<mcl::MemoryRegion>());
291 };
292
293@@ -173,6 +188,12 @@
294
295 struct ClientBufferStream : TestWithParam<bool>
296 {
297+ ClientBufferStream()
298+ {
299+ ON_CALL(mock_factory, create_buffer(_,_,_))
300+ .WillByDefault(Return(std::make_shared<mtd::NullClientBuffer>()));
301+ }
302+
303 mp::BufferStream a_protobuf_buffer_stream(MirPixelFormat format, MirBufferUsage usage, MirBufferPackage const& package)
304 {
305 mp::BufferStream protobuf_bs;
306@@ -189,6 +210,18 @@
307 return protobuf_bs;
308 }
309
310+ void service_requests_for(mcl::ClientBufferStream& bs, unsigned int count)
311+ {
312+ for(auto i = 0u; i < count; i++)
313+ {
314+ mp::Buffer buffer;
315+ fill_protobuf_buffer_from_package(&buffer, a_buffer_package());
316+ buffer.set_width(size.width.as_int());
317+ buffer.set_height(size.height.as_int());
318+ bs.buffer_available(buffer);
319+ }
320+ }
321+
322 testing::NiceMock<mtd::MockClientBufferFactory> mock_factory;
323 mtd::StubClientBufferFactory stub_factory;
324
325@@ -201,7 +234,7 @@
326
327 mcl::BufferStreamMode mode = mcl::BufferStreamMode::Producer;
328 MirBufferPackage buffer_package = a_buffer_package();
329- geom::Size size{1,2};
330+ geom::Size size{buffer_package.width, buffer_package.height};
331 mp::BufferStream response = a_protobuf_buffer_stream(
332 default_pixel_format, default_buffer_usage, buffer_package);
333 };
334@@ -248,12 +281,12 @@
335 });
336
337 valid_bs.clear_buffer();
338- EXPECT_THROW({
339+ EXPECT_NO_THROW({
340 mcl::BufferStream bs(
341 nullptr, mock_protobuf_server, mode,
342 std::make_shared<StubClientPlatform>(mt::fake_shared(stub_factory)),
343 valid_bs, perf_report, "", size);
344- }, std::runtime_error);
345+ });
346
347 auto error_bs = valid_bs;
348 error_bs.set_error("An error");
349@@ -282,6 +315,7 @@
350 nullptr, mock_protobuf_server, mode,
351 std::make_shared<StubClientPlatform>(mt::fake_shared(mock_factory)),
352 response, perf_report, "", size);
353+ service_requests_for(bs, 1);
354 }
355
356 TEST_P(ClientBufferStream, producer_streams_call_submit_buffer_on_next_buffer)
357@@ -292,6 +326,8 @@
358 nullptr, mock_protobuf_server, mode,
359 std::make_shared<StubClientPlatform>(mt::fake_shared(stub_factory)),
360 response, perf_report, "", size};
361+ service_requests_for(bs, mock_protobuf_server.alloc_count);
362+
363 bs.next_buffer([]{});
364 }
365
366@@ -317,6 +353,7 @@
367 nullptr, mock_protobuf_server, mode,
368 std::make_shared<StubClientPlatform>(mt::fake_shared(stub_factory)),
369 response, perf_report, "", size};
370+ service_requests_for(bs, mock_protobuf_server.alloc_count);
371 ON_CALL(mock_protobuf_server, submit_buffer(_,_,_))
372 .WillByDefault(DoAll(
373 RunProtobufClosure(),
374@@ -349,10 +386,11 @@
375
376 TEST_P(ClientBufferStream, returns_current_client_buffer)
377 {
378- auto const client_buffer_1 = std::make_shared<mtd::NullClientBuffer>();
379- auto const client_buffer_2 = std::make_shared<mtd::NullClientBuffer>();
380+ auto const client_buffer_1 = std::make_shared<mtd::NullClientBuffer>(size);
381+ auto const client_buffer_2 = std::make_shared<mtd::NullClientBuffer>(size);
382 auto buffer_package_1 = a_buffer_package();
383 auto buffer_package_2 = a_buffer_package();
384+
385 mp::Buffer protobuf_buffer_1;
386 mp::Buffer protobuf_buffer_2;
387 fill_protobuf_buffer_from_package(&protobuf_buffer_1, buffer_package_1);
388@@ -372,6 +410,7 @@
389 nullptr, mock_protobuf_server, mode,
390 std::make_shared<StubClientPlatform>(mt::fake_shared(mock_factory)),
391 protobuf_bs, perf_report, "", size);
392+ service_requests_for(bs, 1);
393 EXPECT_EQ(client_buffer_1, bs.get_current_buffer());
394 bs.buffer_available(protobuf_buffer_2);
395 bs.next_buffer([]{});
396@@ -380,8 +419,8 @@
397
398 TEST_P(ClientBufferStream, caches_width_and_height_in_case_of_partial_updates)
399 {
400- auto const client_buffer_1 = std::make_shared<mtd::NullClientBuffer>();
401- auto const client_buffer_2 = std::make_shared<mtd::NullClientBuffer>();
402+ auto const client_buffer_1 = std::make_shared<mtd::NullClientBuffer>(size);
403+ auto const client_buffer_2 = std::make_shared<mtd::NullClientBuffer>(size);
404 auto buffer_package_1 = a_buffer_package();
405 auto buffer_package_2 = a_buffer_package();
406 auto protobuf_bs = a_protobuf_buffer_stream(default_pixel_format, default_buffer_usage, buffer_package_1);
407@@ -401,6 +440,7 @@
408 nullptr, mock_protobuf_server, mode,
409 std::make_shared<StubClientPlatform>(mt::fake_shared(mock_factory)),
410 protobuf_bs, perf_report, "", size);
411+ service_requests_for(bs, 1);
412 EXPECT_EQ(client_buffer_1, bs.get_current_buffer());
413 bs.buffer_available(protobuf_buffer_2);
414 bs.next_buffer([]{});
415@@ -418,7 +458,7 @@
416
417 TEST_P(ClientBufferStream, map_graphics_region)
418 {
419- MockClientBuffer mock_client_buffer;
420+ MockClientBuffer mock_client_buffer(size);
421 EXPECT_CALL(mock_factory, create_buffer(BufferPackageMatches(buffer_package),_,_))
422 .WillOnce(Return(mt::fake_shared(mock_client_buffer)));
423
424@@ -426,6 +466,7 @@
425 nullptr, mock_protobuf_server, mode,
426 std::make_shared<StubClientPlatform>(mt::fake_shared(mock_factory)),
427 response, perf_report, "", size);
428+ service_requests_for(bs, 1);
429
430 mcl::MemoryRegion expected_memory_region;
431 EXPECT_CALL(mock_client_buffer, secure_for_cpu_write())
432@@ -447,8 +488,8 @@
433 TEST_P(ClientBufferStream, receives_unsolicited_buffer)
434 {
435 int id = 88;
436- MockClientBuffer mock_client_buffer;
437- MockClientBuffer second_mock_client_buffer;
438+ MockClientBuffer mock_client_buffer(size);
439+ MockClientBuffer second_mock_client_buffer(size);
440 EXPECT_CALL(mock_factory, create_buffer(BufferPackageMatches(buffer_package),_,_))
441 .WillOnce(Return(mt::fake_shared(mock_client_buffer)));
442
443@@ -456,6 +497,7 @@
444 nullptr, mock_protobuf_server, mode,
445 std::make_shared<StubClientPlatform>(mt::fake_shared(mock_factory)),
446 response, perf_report, "", size);
447+ service_requests_for(bs, 1);
448
449 mir::protobuf::Buffer another_buffer_package;
450 another_buffer_package.set_buffer_id(id);
451@@ -473,7 +515,7 @@
452 TEST_P(ClientBufferStream, waiting_client_can_unblock_on_shutdown)
453 {
454 using namespace std::literals::chrono_literals;
455- MockClientBuffer mock_client_buffer;
456+ MockClientBuffer mock_client_buffer(size);
457 ON_CALL(mock_factory, create_buffer(BufferPackageMatches(buffer_package),_,_))
458 .WillByDefault(Return(mt::fake_shared(mock_client_buffer)));
459 ON_CALL(mock_protobuf_server, submit_buffer(_,_,_))
460@@ -487,6 +529,7 @@
461 nullptr, mock_protobuf_server, mode,
462 std::make_shared<StubClientPlatform>(mt::fake_shared(mock_factory)),
463 response, perf_report, "", size);
464+ service_requests_for(bs, mock_protobuf_server.alloc_count);
465
466 auto never_serviced_request = std::async(std::launch::async,[&] {
467 {
468@@ -506,7 +549,7 @@
469
470 EXPECT_THROW({
471 bs.request_and_wait_for_next_buffer();
472- }, std::runtime_error);
473+ }, std::exception);
474 }
475
476 TEST_P(ClientBufferStream, invokes_callback_on_buffer_available_before_wait_handle_has_result)
477@@ -518,14 +561,15 @@
478 nullptr, mock_protobuf_server, mode,
479 std::make_shared<StubClientPlatform>(mt::fake_shared(stub_factory)),
480 response, perf_report, "", size};
481+ service_requests_for(bs, mock_protobuf_server.alloc_count);
482
483 wh = bs.next_buffer(
484 [&]
485 {
486- wait_handle_has_result_in_callback = wh->has_result();
487+ if (wh)
488+ wait_handle_has_result_in_callback = wh->has_result();
489 });
490
491- bs.buffer_available(mp::Buffer{});
492 EXPECT_FALSE(wait_handle_has_result_in_callback);
493 }
494
495@@ -538,15 +582,17 @@
496 nullptr, mock_protobuf_server, mode,
497 std::make_shared<StubClientPlatform>(mt::fake_shared(stub_factory)),
498 response, perf_report, "", size};
499+ service_requests_for(bs, mock_protobuf_server.alloc_count);
500
501 wh = bs.next_buffer(
502 [&]
503 {
504- wait_handle_has_result_in_callback = wh->has_result();
505+ if (wh)
506+ wait_handle_has_result_in_callback = wh->has_result();
507 });
508
509 bs.buffer_unavailable();
510 EXPECT_FALSE(wait_handle_has_result_in_callback);
511 }
512
513-INSTANTIATE_TEST_CASE_P(BufferSemanticsMode, ClientBufferStream, Values(true));
514+INSTANTIATE_TEST_CASE_P(BufferSemanticsMode, ClientBufferStream, Bool());

Subscribers

People subscribed via source and target branches