Mir

Merge lp:~albaguirre/mir/back-to-stack-alloc-mir-protobuf into lp:mir

Proposed by Alberto Aguirre
Status: Merged
Approved by: Alberto Aguirre
Approved revision: no longer in the source branch.
Merged at revision: 2801
Proposed branch: lp:~albaguirre/mir/back-to-stack-alloc-mir-protobuf
Merge into: lp:mir
Prerequisite: lp:~albaguirre/mir/enable-versioning-of-mirprotobuf
Diff against target: 897 lines (+226/-196)
13 files modified
src/client/buffer_stream.cpp (+15/-14)
src/client/buffer_stream.h (+6/-2)
src/client/client_buffer_stream.h (+4/-0)
src/client/mir_connection.cpp (+26/-24)
src/client/mir_connection.h (+8/-2)
src/client/mir_prompt_session.cpp (+4/-3)
src/client/mir_prompt_session.h (+6/-1)
src/client/mir_screencast.cpp (+13/-12)
src/client/mir_screencast.h (+5/-1)
src/client/mir_surface.cpp (+101/-103)
src/client/mir_surface.h (+8/-3)
src/client/rpc/mir_protobuf_rpc_channel.cpp (+30/-29)
src/client/rpc/mir_protobuf_rpc_channel.h (+0/-2)
To merge this branch: bzr merge lp:~albaguirre/mir/back-to-stack-alloc-mir-protobuf
Reviewer Review Type Date Requested Status
PS Jenkins bot (community) continuous-integration Approve
Alan Griffiths Approve
Kevin DuBois (community) Approve
Review via email: mp+266275@code.launchpad.net

Commit message

client: Use stack allocated mir::protobuf objects when possible

Description of the change

client: Use stack allocated mir::protobuf objects when possible

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

I know I asked for this. Although now I realize it's actually less efficient than using Arenas. Because on the stack your object is indeed allocated super fast (adjusting the stack pointer has always taken one clock tick or less). But stack allocation doesn't solve the problem for the subobjects (variable length lists, strings) that are still allocated on the heap. Arenas however solve both problems with the speed of a stack:

   https://developers.google.com/protocol-buffers/docs/reference/arenas?hl=en

So I've got nothing against this proposal right now. But if it makes the syntax less like the Arena syntax then it might be harder for us to get that optimal performance with Arenas in the long run.

Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

281 class SharedLibrary;
282 -
283 +namespace protobuf
284 +{

I've a mild preference for a blank line before the namespace block.

Revision history for this message
Kevin DuBois (kdub) wrote :

+1

review: Approve
Revision history for this message
Alberto Aguirre (albaguirre) wrote :

> I know I asked for this. Although now I realize it's actually less efficient
> than using Arenas. Because on the stack your object is indeed allocated super
> fast (adjusting the stack pointer has always taken one clock tick or less).
> But stack allocation doesn't solve the problem for the subobjects (variable
> length lists, strings) that are still allocated on the heap. Arenas however
> solve both problems with the speed of a stack:
>
> https://developers.google.com/protocol-buffers/docs/reference/arenas?hl=en
>
> So I've got nothing against this proposal right now. But if it makes the
> syntax less like the Arena syntax then it might be harder for us to get that
> optimal performance with Arenas in the long run.

Ok, it shouldn't be too difficult to change to Arena based allocation even if this lands, but I need to investigate the code generated when "option cc_enable_arenas = true;" is used.

Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

OK

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Alberto Aguirre (albaguirre) wrote :

^--Failure seems to be lp:1480422, lp:1480420

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Alberto Aguirre (albaguirre) wrote :

"E: Failed to fetch http://ports.ubuntu.com/ubuntu-ports/pool/universe/g/glmark2/glmark2-data_2014.03+git20150611.fa71af2d-0ubuntu2_all.deb Temporary failure resolving 'ports.ubuntu.com'"

Arrghh....Re-trying.

Revision history for this message
PS Jenkins bot (ps-jenkins) :
review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/client/buffer_stream.cpp'
--- src/client/buffer_stream.cpp 2015-07-29 17:33:10 +0000
+++ src/client/buffer_stream.cpp 2015-07-29 17:33:10 +0000
@@ -24,6 +24,7 @@
24#include "perf_report.h"24#include "perf_report.h"
25#include "logging/perf_report.h"25#include "logging/perf_report.h"
26#include "rpc/mir_display_server.h"26#include "rpc/mir_display_server.h"
27#include "mir_protobuf.pb.h"
2728
28#include "mir/log.h"29#include "mir/log.h"
29#include "mir/client_platform.h"30#include "mir/client_platform.h"
@@ -201,12 +202,12 @@
201MirWaitHandle* mcl::BufferStream::submit(std::function<void()> const& done, std::unique_lock<std::mutex> lock)202MirWaitHandle* mcl::BufferStream::submit(std::function<void()> const& done, std::unique_lock<std::mutex> lock)
202{203{
203 //always submit what we have, whether we have a buffer, or will have to wait for an async reply204 //always submit what we have, whether we have a buffer, or will have to wait for an async reply
204 auto request = mcl::make_protobuf_object<mp::BufferRequest>();205 mp::BufferRequest request;
205 request->mutable_id()->set_value(protobuf_bs->id().value());206 request.mutable_id()->set_value(protobuf_bs->id().value());
206 request->mutable_buffer()->set_buffer_id(buffer_depository.current_buffer_id());207 request.mutable_buffer()->set_buffer_id(buffer_depository.current_buffer_id());
207 lock.unlock();208 lock.unlock();
208209
209 display_server.submit_buffer(request.get(), protobuf_void.get(),210 display_server.submit_buffer(&request, protobuf_void.get(),
210 google::protobuf::NewCallback(google::protobuf::DoNothing));211 google::protobuf::NewCallback(google::protobuf::DoNothing));
211212
212 lock.lock();213 lock.lock();
@@ -241,14 +242,14 @@
241 }242 }
242 else243 else
243 {244 {
244 auto screencast_id = mcl::make_protobuf_object<mp::ScreencastId>();245 mp::ScreencastId screencast_id;
245 screencast_id->set_value(protobuf_bs->id().value());246 screencast_id.set_value(protobuf_bs->id().value());
246247
247 lock.unlock();248 lock.unlock();
248 next_buffer_wait_handle.expect_result();249 next_buffer_wait_handle.expect_result();
249250
250 display_server.screencast_buffer(251 display_server.screencast_buffer(
251 screencast_id.get(),252 &screencast_id,
252 protobuf_bs->mutable_buffer(),253 protobuf_bs->mutable_buffer(),
253 google::protobuf::NewCallback(254 google::protobuf::NewCallback(
254 this, &mcl::BufferStream::next_buffer_received,255 this, &mcl::BufferStream::next_buffer_received,
@@ -337,21 +338,21 @@
337 BOOST_THROW_EXCEPTION(std::logic_error("Attempt to set swap interval on screencast is invalid"));338 BOOST_THROW_EXCEPTION(std::logic_error("Attempt to set swap interval on screencast is invalid"));
338 }339 }
339340
340 auto setting = mcl::make_protobuf_object<mp::SurfaceSetting>();341 mp::SurfaceSetting setting;
341 auto result = mcl::make_protobuf_object<mp::SurfaceSetting>();342 mp::SurfaceSetting result;
342 setting->mutable_surfaceid()->set_value(protobuf_bs->id().value());343 setting.mutable_surfaceid()->set_value(protobuf_bs->id().value());
343 setting->set_attrib(attrib);344 setting.set_attrib(attrib);
344 setting->set_ivalue(value);345 setting.set_ivalue(value);
345 lock.unlock();346 lock.unlock();
346347
347 configure_wait_handle.expect_result();348 configure_wait_handle.expect_result();
348 display_server.configure_surface(setting.get(), result.get(),349 display_server.configure_surface(&setting, &result,
349 google::protobuf::NewCallback(this, &mcl::BufferStream::on_configured));350 google::protobuf::NewCallback(this, &mcl::BufferStream::on_configured));
350351
351 configure_wait_handle.wait_for_all();352 configure_wait_handle.wait_for_all();
352353
353 lock.lock();354 lock.lock();
354 swap_interval_ = result->ivalue();355 swap_interval_ = result.ivalue();
355}356}
356357
357uint32_t mcl::BufferStream::get_current_buffer_id()358uint32_t mcl::BufferStream::get_current_buffer_id()
358359
=== modified file 'src/client/buffer_stream.h'
--- src/client/buffer_stream.h 2015-07-29 17:33:10 +0000
+++ src/client/buffer_stream.h 2015-07-29 17:33:10 +0000
@@ -19,8 +19,6 @@
19#ifndef MIR_CLIENT_BUFFER_STREAM_H19#ifndef MIR_CLIENT_BUFFER_STREAM_H
20#define MIR_CLIENT_BUFFER_STREAM_H20#define MIR_CLIENT_BUFFER_STREAM_H
2121
22#include "mir_protobuf.pb.h"
23
24#include "mir_wait_handle.h"22#include "mir_wait_handle.h"
25#include "mir/egl_native_surface.h"23#include "mir/egl_native_surface.h"
26#include "mir/client_buffer.h"24#include "mir/client_buffer.h"
@@ -41,6 +39,12 @@
41{39{
42class Logger;40class Logger;
43}41}
42namespace protobuf
43{
44class BufferStream;
45class BufferStreamParameters;
46class Void;
47}
44namespace client48namespace client
45{49{
46namespace rpc50namespace rpc
4751
=== modified file 'src/client/client_buffer_stream.h'
--- src/client/client_buffer_stream.h 2015-07-16 07:03:19 +0000
+++ src/client/client_buffer_stream.h 2015-07-29 17:33:10 +0000
@@ -32,6 +32,10 @@
3232
33namespace mir33namespace mir
34{34{
35namespace protobuf
36{
37class Buffer;
38}
35namespace client39namespace client
36{40{
37class ClientBuffer;41class ClientBuffer;
3842
=== modified file 'src/client/mir_connection.cpp'
--- src/client/mir_connection.cpp 2015-07-29 17:33:10 +0000
+++ src/client/mir_connection.cpp 2015-07-29 17:33:10 +0000
@@ -19,6 +19,7 @@
19#include "mir_connection.h"19#include "mir_connection.h"
20#include "mir_surface.h"20#include "mir_surface.h"
21#include "mir_prompt_session.h"21#include "mir_prompt_session.h"
22#include "mir_protobuf.pb.h"
22#include "default_client_buffer_stream_factory.h"23#include "default_client_buffer_stream_factory.h"
23#include "make_protobuf_object.h"24#include "make_protobuf_object.h"
24#include "mir_toolkit/mir_platform_message.h"25#include "mir_toolkit/mir_platform_message.h"
@@ -48,6 +49,7 @@
48namespace mev = mir::events;49namespace mev = mir::events;
49namespace gp = google::protobuf;50namespace gp = google::protobuf;
50namespace mf = mir::frontend;51namespace mf = mir::frontend;
52namespace mp = mir::protobuf;
5153
52namespace54namespace
53{55{
@@ -229,8 +231,8 @@
229231
230 SurfaceRelease surf_release{surface, new_wait_handle, callback, context};232 SurfaceRelease surf_release{surface, new_wait_handle, callback, context};
231233
232 auto message = mcl::make_protobuf_object<mir::protobuf::SurfaceId>();234 mp::SurfaceId message;
233 message->set_value(surface->id());235 message.set_value(surface->id());
234236
235 {237 {
236 std::lock_guard<decltype(release_wait_handle_guard)> rel_lock(release_wait_handle_guard);238 std::lock_guard<decltype(release_wait_handle_guard)> rel_lock(release_wait_handle_guard);
@@ -238,7 +240,7 @@
238 }240 }
239241
240 new_wait_handle->expect_result();242 new_wait_handle->expect_result();
241 server.release_surface(message.get(), void_response.get(),243 server.release_surface(&message, void_response.get(),
242 gp::NewCallback(this, &MirConnection::released, surf_release));244 gp::NewCallback(this, &MirConnection::released, surf_release));
243245
244246
@@ -391,19 +393,19 @@
391 return nullptr;393 return nullptr;
392 }394 }
393395
394 auto protobuf_request = mcl::make_protobuf_object<mir::protobuf::PlatformOperationMessage>();396 mp::PlatformOperationMessage protobuf_request;
395397
396 protobuf_request->set_opcode(mir_platform_message_get_opcode(request));398 protobuf_request.set_opcode(mir_platform_message_get_opcode(request));
397 auto const request_data = mir_platform_message_get_data(request);399 auto const request_data = mir_platform_message_get_data(request);
398 auto const request_fds = mir_platform_message_get_fds(request);400 auto const request_fds = mir_platform_message_get_fds(request);
399401
400 protobuf_request->set_data(request_data.data, request_data.size);402 protobuf_request.set_data(request_data.data, request_data.size);
401 for (size_t i = 0; i != request_fds.num_fds; ++i)403 for (size_t i = 0; i != request_fds.num_fds; ++i)
402 protobuf_request->add_fd(request_fds.fds[i]);404 protobuf_request.add_fd(request_fds.fds[i]);
403405
404 platform_operation_wait_handle.expect_result();406 platform_operation_wait_handle.expect_result();
405 server.platform_operation(407 server.platform_operation(
406 protobuf_request.get(),408 &protobuf_request,
407 platform_operation_reply.get(),409 platform_operation_reply.get(),
408 google::protobuf::NewCallback(this, &MirConnection::done_platform_operation,410 google::protobuf::NewCallback(this, &MirConnection::done_platform_operation,
409 callback, context));411 callback, context));
@@ -499,17 +501,17 @@
499 mir_buffer_stream_callback callback,501 mir_buffer_stream_callback callback,
500 void *context)502 void *context)
501{503{
502 auto params = mcl::make_protobuf_object<mir::protobuf::BufferStreamParameters>();504 mp::BufferStreamParameters params;
503 params->set_width(width);505 params.set_width(width);
504 params->set_height(height);506 params.set_height(height);
505 params->set_pixel_format(format);507 params.set_pixel_format(format);
506 params->set_buffer_usage(buffer_usage);508 params.set_buffer_usage(buffer_usage);
507509
508 return buffer_stream_factory->make_producer_stream(this, server, *params, callback, context);510 return buffer_stream_factory->make_producer_stream(this, server, params, callback, context);
509}511}
510512
511std::shared_ptr<mir::client::ClientBufferStream> MirConnection::make_consumer_stream(513std::shared_ptr<mir::client::ClientBufferStream> MirConnection::make_consumer_stream(
512 mir::protobuf::BufferStream const& protobuf_bs, std::string const& surface_name)514 mp::BufferStream const& protobuf_bs, std::string const& surface_name)
513{515{
514 return buffer_stream_factory->make_consumer_stream(this, server, protobuf_bs, surface_name);516 return buffer_stream_factory->make_consumer_stream(this, server, protobuf_bs, surface_name);
515}517}
@@ -549,9 +551,9 @@
549551
550void MirConnection::pong(int32_t serial)552void MirConnection::pong(int32_t serial)
551{553{
552 auto pong = mcl::make_protobuf_object<mir::protobuf::PingEvent>();554 mp::PingEvent pong;
553 pong->set_serial(serial);555 pong.set_serial(serial);
554 server.pong(pong.get(), void_response.get(), pong_callback.get());556 server.pong(&pong, void_response.get(), pong_callback.get());
555}557}
556558
557void MirConnection::register_display_change_callback(mir_display_config_callback callback, void* context)559void MirConnection::register_display_change_callback(mir_display_config_callback callback, void* context)
@@ -603,14 +605,14 @@
603 return NULL;605 return NULL;
604 }606 }
605607
606 auto request = mcl::make_protobuf_object<mir::protobuf::DisplayConfiguration>();608 mp::DisplayConfiguration request;
607 {609 {
608 std::lock_guard<decltype(mutex)> lock(mutex);610 std::lock_guard<decltype(mutex)> lock(mutex);
609611
610 for (auto i=0u; i < config->num_outputs; i++)612 for (auto i=0u; i < config->num_outputs; i++)
611 {613 {
612 auto output = config->outputs[i];614 auto output = config->outputs[i];
613 auto display_request = request->add_display_output();615 auto display_request = request.add_display_output();
614 display_request->set_output_id(output.output_id);616 display_request->set_output_id(output.output_id);
615 display_request->set_used(output.used);617 display_request->set_used(output.used);
616 display_request->set_current_mode(output.current_mode);618 display_request->set_current_mode(output.current_mode);
@@ -623,7 +625,7 @@
623 }625 }
624626
625 configure_display_wait_handle.expect_result();627 configure_display_wait_handle.expect_result();
626 server.configure_display(request.get(), display_configuration_response.get(),628 server.configure_display(&request, display_configuration_response.get(),
627 google::protobuf::NewCallback(this, &MirConnection::done_display_configure));629 google::protobuf::NewCallback(this, &MirConnection::done_display_configure));
628630
629 return &configure_display_wait_handle;631 return &configure_display_wait_handle;
@@ -648,8 +650,8 @@
648650
649 StreamRelease stream_release{stream, new_wait_handle, callback, context};651 StreamRelease stream_release{stream, new_wait_handle, callback, context};
650652
651 auto buffer_stream_id = mcl::make_protobuf_object<mir::protobuf::BufferStreamId>();653 mp::BufferStreamId buffer_stream_id;
652 buffer_stream_id->set_value(stream->rpc_id().as_value());654 buffer_stream_id.set_value(stream->rpc_id().as_value());
653655
654 {656 {
655 std::lock_guard<decltype(release_wait_handle_guard)> rel_lock(release_wait_handle_guard);657 std::lock_guard<decltype(release_wait_handle_guard)> rel_lock(release_wait_handle_guard);
@@ -658,7 +660,7 @@
658660
659 new_wait_handle->expect_result();661 new_wait_handle->expect_result();
660 server.release_buffer_stream(662 server.release_buffer_stream(
661 buffer_stream_id.get(), void_response.get(),663 &buffer_stream_id, void_response.get(),
662 google::protobuf::NewCallback(this, &MirConnection::released, stream_release));664 google::protobuf::NewCallback(this, &MirConnection::released, stream_release));
663 return new_wait_handle;665 return new_wait_handle;
664}666}
665667
=== modified file 'src/client/mir_connection.h'
--- src/client/mir_connection.h 2015-07-29 17:33:10 +0000
+++ src/client/mir_connection.h 2015-07-29 17:33:10 +0000
@@ -18,7 +18,6 @@
18#ifndef MIR_CLIENT_MIR_CONNECTION_H_18#ifndef MIR_CLIENT_MIR_CONNECTION_H_
19#define MIR_CLIENT_MIR_CONNECTION_H_19#define MIR_CLIENT_MIR_CONNECTION_H_
2020
21#include "mir_protobuf.pb.h"
22#include "mir_wait_handle.h"21#include "mir_wait_handle.h"
23#include "lifecycle_control.h"22#include "lifecycle_control.h"
24#include "ping_handler.h"23#include "ping_handler.h"
@@ -39,7 +38,14 @@
39namespace mir38namespace mir
40{39{
41class SharedLibrary;40class SharedLibrary;
4241namespace protobuf
42{
43class BufferStream;
44class Connection;
45class ConnectParameters;
46class PlatformOperationMessage;
47class DisplayConfiguration;
48}
43/// The client-side library implementation namespace49/// The client-side library implementation namespace
44namespace client50namespace client
45{51{
4652
=== modified file 'src/client/mir_prompt_session.cpp'
--- src/client/mir_prompt_session.cpp 2015-07-29 17:33:10 +0000
+++ src/client/mir_prompt_session.cpp 2015-07-29 17:33:10 +0000
@@ -20,6 +20,7 @@
20#include "event_handler_register.h"20#include "event_handler_register.h"
21#include "make_protobuf_object.h"21#include "make_protobuf_object.h"
22#include "rpc/mir_display_server.h"22#include "rpc/mir_display_server.h"
23#include "mir_protobuf.pb.h"
2324
24namespace mp = mir::protobuf;25namespace mp = mir::protobuf;
25namespace mcl = mir::client;26namespace mcl = mir::client;
@@ -146,13 +147,13 @@
146 mir_client_fd_callback callback,147 mir_client_fd_callback callback,
147 void * context)148 void * context)
148{149{
149 auto request = mcl::make_protobuf_object<mir::protobuf::SocketFDRequest>();150 mp::SocketFDRequest request;
150 request->set_number(no_of_fds);151 request.set_number(no_of_fds);
151152
152 fds_for_prompt_providers_wait_handle.expect_result();153 fds_for_prompt_providers_wait_handle.expect_result();
153154
154 server.new_fds_for_prompt_providers(155 server.new_fds_for_prompt_providers(
155 request.get(),156 &request,
156 socket_fd_response.get(),157 socket_fd_response.get(),
157 google::protobuf::NewCallback(this, &MirPromptSession::done_fds_for_prompt_providers,158 google::protobuf::NewCallback(this, &MirPromptSession::done_fds_for_prompt_providers,
158 callback, context));159 callback, context));
159160
=== modified file 'src/client/mir_prompt_session.h'
--- src/client/mir_prompt_session.h 2015-07-29 17:33:10 +0000
+++ src/client/mir_prompt_session.h 2015-07-29 17:33:10 +0000
@@ -21,7 +21,6 @@
2121
22#include "mir_toolkit/mir_client_library.h"22#include "mir_toolkit/mir_client_library.h"
2323
24#include "mir_protobuf.pb.h"
25#include "mir_wait_handle.h"24#include "mir_wait_handle.h"
2625
27#include <mutex>26#include <mutex>
@@ -30,6 +29,12 @@
3029
31namespace mir30namespace mir
32{31{
32namespace protobuf
33{
34class PromptSessionParameters;
35class SocketFD;
36class Void;
37}
33/// The client-side library implementation namespace38/// The client-side library implementation namespace
34namespace client39namespace client
35{40{
3641
=== modified file 'src/client/mir_screencast.cpp'
--- src/client/mir_screencast.cpp 2015-07-29 17:33:10 +0000
+++ src/client/mir_screencast.cpp 2015-07-29 17:33:10 +0000
@@ -18,6 +18,7 @@
1818
19#include "mir_screencast.h"19#include "mir_screencast.h"
20#include "mir_connection.h"20#include "mir_connection.h"
21#include "mir_protobuf.pb.h"
21#include "make_protobuf_object.h"22#include "make_protobuf_object.h"
22#include "client_buffer_stream.h"23#include "client_buffer_stream.h"
23#include "mir/frontend/client_constants.h"24#include "mir/frontend/client_constants.h"
@@ -53,19 +54,19 @@
53 }54 }
54 protobuf_screencast->set_error("Not initialized");55 protobuf_screencast->set_error("Not initialized");
5556
56 auto parameters = mcl::make_protobuf_object<mir::protobuf::ScreencastParameters>();57 mp::ScreencastParameters parameters;
5758
58 parameters->mutable_region()->set_left(region.top_left.x.as_int());59 parameters.mutable_region()->set_left(region.top_left.x.as_int());
59 parameters->mutable_region()->set_top(region.top_left.y.as_int());60 parameters.mutable_region()->set_top(region.top_left.y.as_int());
60 parameters->mutable_region()->set_width(region.size.width.as_uint32_t());61 parameters.mutable_region()->set_width(region.size.width.as_uint32_t());
61 parameters->mutable_region()->set_height(region.size.height.as_uint32_t());62 parameters.mutable_region()->set_height(region.size.height.as_uint32_t());
62 parameters->set_width(output_size.width.as_uint32_t());63 parameters.set_width(output_size.width.as_uint32_t());
63 parameters->set_height(output_size.height.as_uint32_t());64 parameters.set_height(output_size.height.as_uint32_t());
64 parameters->set_pixel_format(pixel_format);65 parameters.set_pixel_format(pixel_format);
6566
66 create_screencast_wait_handle.expect_result();67 create_screencast_wait_handle.expect_result();
67 server.create_screencast(68 server.create_screencast(
68 parameters.get(),69 &parameters,
69 protobuf_screencast.get(),70 protobuf_screencast.get(),
70 google::protobuf::NewCallback(71 google::protobuf::NewCallback(
71 this, &MirScreencast::screencast_created,72 this, &MirScreencast::screencast_created,
@@ -85,12 +86,12 @@
85MirWaitHandle* MirScreencast::release(86MirWaitHandle* MirScreencast::release(
86 mir_screencast_callback callback, void* context)87 mir_screencast_callback callback, void* context)
87{88{
88 auto screencast_id = mcl::make_protobuf_object<mir::protobuf::ScreencastId>();89 mp::ScreencastId screencast_id;
89 screencast_id->set_value(protobuf_screencast->screencast_id().value());90 screencast_id.set_value(protobuf_screencast->screencast_id().value());
90 91
91 release_wait_handle.expect_result();92 release_wait_handle.expect_result();
92 server.release_screencast(93 server.release_screencast(
93 screencast_id.get(),94 &screencast_id,
94 protobuf_void.get(),95 protobuf_void.get(),
95 google::protobuf::NewCallback(96 google::protobuf::NewCallback(
96 this, &MirScreencast::released, callback, context));97 this, &MirScreencast::released, callback, context));
9798
=== modified file 'src/client/mir_screencast.h'
--- src/client/mir_screencast.h 2015-07-29 17:33:10 +0000
+++ src/client/mir_screencast.h 2015-07-29 17:33:10 +0000
@@ -21,7 +21,6 @@
2121
22#include "mir_wait_handle.h"22#include "mir_wait_handle.h"
23#include "mir_toolkit/client_types.h"23#include "mir_toolkit/client_types.h"
24#include "mir_protobuf.pb.h"
25#include "mir/geometry/size.h"24#include "mir/geometry/size.h"
26#include "mir/geometry/rectangle.h"25#include "mir/geometry/rectangle.h"
2726
@@ -31,6 +30,11 @@
3130
32namespace mir31namespace mir
33{32{
33namespace protobuf
34{
35class Screencast;
36class Void;
37}
34namespace client38namespace client
35{39{
36namespace rpc40namespace rpc
3741
=== modified file 'src/client/mir_surface.cpp'
--- src/client/mir_surface.cpp 2015-07-29 17:33:10 +0000
+++ src/client/mir_surface.cpp 2015-07-29 17:33:10 +0000
@@ -22,6 +22,7 @@
22#include "client_buffer_stream.h"22#include "client_buffer_stream.h"
23#include "client_buffer_stream_factory.h"23#include "client_buffer_stream_factory.h"
24#include "make_protobuf_object.h"24#include "make_protobuf_object.h"
25#include "mir_protobuf.pb.h"
2526
26#include "mir_toolkit/mir_client_library.h"27#include "mir_toolkit/mir_client_library.h"
27#include "mir/frontend/client_constants.h"28#include "mir/frontend/client_constants.h"
@@ -43,14 +44,81 @@
43namespace gp = google::protobuf;44namespace gp = google::protobuf;
44namespace md = mir::dispatch;45namespace md = mir::dispatch;
4546
46#define SERIALIZE_OPTION_IF_SET(option, message) \
47 if (option.is_set()) \
48 message->set_##option(option.value());
49
50namespace47namespace
51{48{
52std::mutex handle_mutex;49std::mutex handle_mutex;
53std::unordered_set<MirSurface*> valid_surfaces;50std::unordered_set<MirSurface*> valid_surfaces;
51
52mir::protobuf::SurfaceParameters serialize_spec(MirSurfaceSpec const& spec)
53{
54 mp::SurfaceParameters message;
55
56#define SERIALIZE_OPTION_IF_SET(option) \
57 if (spec.option.is_set()) \
58 message.set_##option(spec.option.value());
59
60 SERIALIZE_OPTION_IF_SET(width);
61 SERIALIZE_OPTION_IF_SET(height);
62 SERIALIZE_OPTION_IF_SET(pixel_format);
63 SERIALIZE_OPTION_IF_SET(buffer_usage);
64 SERIALIZE_OPTION_IF_SET(surface_name);
65 SERIALIZE_OPTION_IF_SET(output_id);
66 SERIALIZE_OPTION_IF_SET(type);
67 SERIALIZE_OPTION_IF_SET(state);
68 SERIALIZE_OPTION_IF_SET(pref_orientation);
69 SERIALIZE_OPTION_IF_SET(edge_attachment);
70 SERIALIZE_OPTION_IF_SET(min_width);
71 SERIALIZE_OPTION_IF_SET(min_height);
72 SERIALIZE_OPTION_IF_SET(max_width);
73 SERIALIZE_OPTION_IF_SET(max_height);
74 SERIALIZE_OPTION_IF_SET(width_inc);
75 SERIALIZE_OPTION_IF_SET(height_inc);
76 // min_aspect is a special case (below)
77 // max_aspect is a special case (below)
78
79 if (spec.parent.is_set() && spec.parent.value() != nullptr)
80 message.set_parent_id(spec.parent.value()->id());
81
82 if (spec.parent_id)
83 {
84 auto id = message.mutable_parent_persistent_id();
85 id->set_value(spec.parent_id->as_string());
86 }
87
88 if (spec.aux_rect.is_set())
89 {
90 message.mutable_aux_rect()->set_left(spec.aux_rect.value().left);
91 message.mutable_aux_rect()->set_top(spec.aux_rect.value().top);
92 message.mutable_aux_rect()->set_width(spec.aux_rect.value().width);
93 message.mutable_aux_rect()->set_height(spec.aux_rect.value().height);
94 }
95
96 if (spec.min_aspect.is_set())
97 {
98 message.mutable_min_aspect()->set_width(spec.min_aspect.value().width);
99 message.mutable_min_aspect()->set_height(spec.min_aspect.value().height);
100 }
101
102 if (spec.max_aspect.is_set())
103 {
104 message.mutable_max_aspect()->set_width(spec.max_aspect.value().width);
105 message.mutable_max_aspect()->set_height(spec.max_aspect.value().height);
106 }
107
108 if (spec.input_shape.is_set())
109 {
110 for (auto const& rect : spec.input_shape.value())
111 {
112 auto const new_shape = message.add_input_shape();
113 new_shape->set_left(rect.left);
114 new_shape->set_top(rect.top);
115 new_shape->set_width(rect.width);
116 new_shape->set_height(rect.height);
117 }
118 }
119
120 return message;
121}
54}122}
55123
56MirSurfaceSpec::MirSurfaceSpec(124MirSurfaceSpec::MirSurfaceSpec(
@@ -78,77 +146,7 @@
78 }146 }
79}147}
80148
81MirSurfaceSpec::MirSurfaceSpec()149MirSurfaceSpec::MirSurfaceSpec() = default;
82{
83}
84
85std::unique_ptr<mir::protobuf::SurfaceParameters> MirSurfaceSpec::serialize() const
86{
87 //std::unique_ptr<mp::SurfaceParameters> message{mp::SurfaceParameters::default_instance().New()};
88 auto message = mcl::make_protobuf_object<mp::SurfaceParameters>();
89
90 SERIALIZE_OPTION_IF_SET(width, message);
91 SERIALIZE_OPTION_IF_SET(height, message);
92 SERIALIZE_OPTION_IF_SET(pixel_format, message);
93 SERIALIZE_OPTION_IF_SET(buffer_usage, message);
94 SERIALIZE_OPTION_IF_SET(surface_name, message);
95 SERIALIZE_OPTION_IF_SET(output_id, message);
96 SERIALIZE_OPTION_IF_SET(type, message);
97 SERIALIZE_OPTION_IF_SET(state, message);
98 SERIALIZE_OPTION_IF_SET(pref_orientation, message);
99 SERIALIZE_OPTION_IF_SET(edge_attachment, message);
100 SERIALIZE_OPTION_IF_SET(min_width, message);
101 SERIALIZE_OPTION_IF_SET(min_height, message);
102 SERIALIZE_OPTION_IF_SET(max_width, message);
103 SERIALIZE_OPTION_IF_SET(max_height, message);
104 SERIALIZE_OPTION_IF_SET(width_inc, message);
105 SERIALIZE_OPTION_IF_SET(height_inc, message);
106 // min_aspect is a special case (below)
107 // max_aspect is a special case (below)
108
109 if (parent.is_set() && parent.value() != nullptr)
110 message->set_parent_id(parent.value()->id());
111
112 if (parent_id)
113 {
114 auto id = message->mutable_parent_persistent_id();
115 id->set_value(parent_id->as_string());
116 }
117
118 if (aux_rect.is_set())
119 {
120 message->mutable_aux_rect()->set_left(aux_rect.value().left);
121 message->mutable_aux_rect()->set_top(aux_rect.value().top);
122 message->mutable_aux_rect()->set_width(aux_rect.value().width);
123 message->mutable_aux_rect()->set_height(aux_rect.value().height);
124 }
125
126 if (min_aspect.is_set())
127 {
128 message->mutable_min_aspect()->set_width(min_aspect.value().width);
129 message->mutable_min_aspect()->set_height(min_aspect.value().height);
130 }
131
132 if (max_aspect.is_set())
133 {
134 message->mutable_max_aspect()->set_width(max_aspect.value().width);
135 message->mutable_max_aspect()->set_height(max_aspect.value().height);
136 }
137
138 if (input_shape.is_set())
139 {
140 for (auto const& rect : input_shape.value())
141 {
142 auto const new_shape = message->add_input_shape();
143 new_shape->set_left(rect.left);
144 new_shape->set_top(rect.top);
145 new_shape->set_width(rect.width);
146 new_shape->set_height(rect.height);
147 }
148 }
149
150 return message;
151}
152150
153MirPersistentId::MirPersistentId(std::string const& string_id)151MirPersistentId::MirPersistentId(std::string const& string_id)
154 : string_id{string_id}152 : string_id{string_id}
@@ -193,11 +191,11 @@
193 for (int i = 0; i < mir_surface_attribs; i++)191 for (int i = 0; i < mir_surface_attribs; i++)
194 attrib_cache[i] = -1;192 attrib_cache[i] = -1;
195193
196 auto const message = spec.serialize();194 auto const message = serialize_spec(spec);
197 create_wait_handle.expect_result();195 create_wait_handle.expect_result();
198 try 196 try
199 {197 {
200 server->create_surface(message.get(), surface.get(), gp::NewCallback(this, &MirSurface::created, callback, context));198 server->create_surface(&message, surface.get(), gp::NewCallback(this, &MirSurface::created, callback, context));
201 }199 }
202 catch (std::exception const& ex)200 catch (std::exception const& ex)
203 {201 {
@@ -383,28 +381,28 @@
383381
384MirWaitHandle* MirSurface::configure_cursor(MirCursorConfiguration const* cursor)382MirWaitHandle* MirSurface::configure_cursor(MirCursorConfiguration const* cursor)
385{383{
386 auto setting = mcl::make_protobuf_object<mp::CursorSetting>();384 mp::CursorSetting setting;
387385
388 {386 {
389 std::unique_lock<decltype(mutex)> lock(mutex);387 std::unique_lock<decltype(mutex)> lock(mutex);
390 setting->mutable_surfaceid()->CopyFrom(surface->id());388 setting.mutable_surfaceid()->CopyFrom(surface->id());
391 if (cursor)389 if (cursor)
392 {390 {
393 if (cursor->stream != nullptr)391 if (cursor->stream != nullptr)
394 {392 {
395 setting->mutable_buffer_stream()->set_value(cursor->stream->rpc_id().as_value());393 setting.mutable_buffer_stream()->set_value(cursor->stream->rpc_id().as_value());
396 setting->set_hotspot_x(cursor->hotspot_x);394 setting.set_hotspot_x(cursor->hotspot_x);
397 setting->set_hotspot_y(cursor->hotspot_y);395 setting.set_hotspot_y(cursor->hotspot_y);
398 }396 }
399 else if (cursor->name != mir_disabled_cursor_name)397 else if (cursor->name != mir_disabled_cursor_name)
400 {398 {
401 setting->set_name(cursor->name.c_str());399 setting.set_name(cursor->name.c_str());
402 }400 }
403 }401 }
404 }402 }
405 403
406 configure_cursor_wait_handle.expect_result();404 configure_cursor_wait_handle.expect_result();
407 server->configure_cursor(setting.get(), void_response.get(),405 server->configure_cursor(&setting, void_response.get(),
408 google::protobuf::NewCallback(this, &MirSurface::on_cursor_configured));406 google::protobuf::NewCallback(this, &MirSurface::on_cursor_configured));
409 407
410 return &configure_cursor_wait_handle;408 return &configure_cursor_wait_handle;
@@ -424,14 +422,14 @@
424422
425 std::unique_lock<decltype(mutex)> lock(mutex);423 std::unique_lock<decltype(mutex)> lock(mutex);
426424
427 auto setting = mcl::make_protobuf_object<mp::SurfaceSetting>();425 mp::SurfaceSetting setting;
428 setting->mutable_surfaceid()->CopyFrom(surface->id());426 setting.mutable_surfaceid()->CopyFrom(surface->id());
429 setting->set_attrib(at);427 setting.set_attrib(at);
430 setting->set_ivalue(value);428 setting.set_ivalue(value);
431 lock.unlock();429 lock.unlock();
432430
433 configure_wait_handle.expect_result();431 configure_wait_handle.expect_result();
434 server->configure_surface(setting.get(), configure_result.get(),432 server->configure_surface(&setting, configure_result.get(),
435 google::protobuf::NewCallback(this, &MirSurface::on_configured));433 google::protobuf::NewCallback(this, &MirSurface::on_configured));
436434
437 return &configure_wait_handle;435 return &configure_wait_handle;
@@ -453,12 +451,12 @@
453 return false;451 return false;
454 }452 }
455453
456 auto request = mcl::make_protobuf_object<mp::CoordinateTranslationRequest>();454 mp::CoordinateTranslationRequest request;
457455
458 request->set_x(x);456 request.set_x(x);
459 request->set_y(y);457 request.set_y(y);
460 *request->mutable_surfaceid() = surface->id();458 *request.mutable_surfaceid() = surface->id();
461 auto response = mcl::make_protobuf_object<mp::CoordinateTranslationResponse>();459 mp::CoordinateTranslationResponse response;
462460
463 MirWaitHandle signal;461 MirWaitHandle signal;
464 signal.expect_result();462 signal.expect_result();
@@ -467,16 +465,16 @@
467 std::lock_guard<decltype(mutex)> lock(mutex);465 std::lock_guard<decltype(mutex)> lock(mutex);
468466
469 debug->translate_surface_to_screen(467 debug->translate_surface_to_screen(
470 request.get(),468 &request,
471 response.get(),469 &response,
472 google::protobuf::NewCallback(&signal_response_received, &signal));470 google::protobuf::NewCallback(&signal_response_received, &signal));
473 }471 }
474472
475 signal.wait_for_one();473 signal.wait_for_one();
476474
477 *screen_x = response->x();475 *screen_x = response.x();
478 *screen_y = response->y();476 *screen_y = response.y();
479 return !response->has_error();477 return !response.has_error();
480}478}
481479
482void MirSurface::on_configured()480void MirSurface::on_configured()
@@ -628,14 +626,14 @@
628626
629MirWaitHandle* MirSurface::modify(MirSurfaceSpec const& spec)627MirWaitHandle* MirSurface::modify(MirSurfaceSpec const& spec)
630{628{
631 auto mods = mcl::make_protobuf_object<mp::SurfaceModifications>();629 mp::SurfaceModifications mods;
632630
633 {631 {
634 std::unique_lock<decltype(mutex)> lock(mutex);632 std::unique_lock<decltype(mutex)> lock(mutex);
635 mods->mutable_surface_id()->set_value(surface->id().value());633 mods.mutable_surface_id()->set_value(surface->id().value());
636 }634 }
637635
638 auto const surface_specification = mods->mutable_surface_specification();636 auto const surface_specification = mods.mutable_surface_specification();
639637
640 #define COPY_IF_SET(field)\638 #define COPY_IF_SET(field)\
641 if (spec.field.is_set())\639 if (spec.field.is_set())\
@@ -727,7 +725,7 @@
727 }725 }
728726
729 modify_wait_handle.expect_result();727 modify_wait_handle.expect_result();
730 server->modify_surface(mods.get(), modify_result.get(),728 server->modify_surface(&mods, modify_result.get(),
731 google::protobuf::NewCallback(this, &MirSurface::on_modified));729 google::protobuf::NewCallback(this, &MirSurface::on_modified));
732730
733 return &modify_wait_handle;731 return &modify_wait_handle;
734732
=== modified file 'src/client/mir_surface.h'
--- src/client/mir_surface.h 2015-07-29 17:33:10 +0000
+++ src/client/mir_surface.h 2015-07-29 17:33:10 +0000
@@ -18,7 +18,6 @@
18#ifndef MIR_CLIENT_MIR_SURFACE_H_18#ifndef MIR_CLIENT_MIR_SURFACE_H_
19#define MIR_CLIENT_MIR_SURFACE_H_19#define MIR_CLIENT_MIR_SURFACE_H_
2020
21#include "mir_protobuf.pb.h"
22#include "client_buffer_depository.h"21#include "client_buffer_depository.h"
23#include "client_buffer_stream.h"22#include "client_buffer_stream.h"
24#include "mir_wait_handle.h"23#include "mir_wait_handle.h"
@@ -51,6 +50,14 @@
51class XKBMapper;50class XKBMapper;
52}51}
53}52}
53namespace protobuf
54{
55class PersistentSurfaceId;
56class Surface;
57class SurfaceParameters;
58class SurfaceSetting;
59class Void;
60}
54namespace client61namespace client
55{62{
56namespace rpc63namespace rpc
@@ -73,8 +80,6 @@
73 MirSurfaceSpec(MirConnection* connection, int width, int height, MirPixelFormat format);80 MirSurfaceSpec(MirConnection* connection, int width, int height, MirPixelFormat format);
74 MirSurfaceSpec(MirConnection* connection, MirSurfaceParameters const& params);81 MirSurfaceSpec(MirConnection* connection, MirSurfaceParameters const& params);
7582
76 std::unique_ptr<mir::protobuf::SurfaceParameters> serialize() const;
77
78 struct AspectRatio { unsigned width; unsigned height; };83 struct AspectRatio { unsigned width; unsigned height; };
7984
80 // Required parameters85 // Required parameters
8186
=== modified file 'src/client/rpc/mir_protobuf_rpc_channel.cpp'
--- src/client/rpc/mir_protobuf_rpc_channel.cpp 2015-07-29 17:33:10 +0000
+++ src/client/rpc/mir_protobuf_rpc_channel.cpp 2015-07-29 17:33:10 +0000
@@ -40,6 +40,7 @@
40namespace mcl = mir::client;40namespace mcl = mir::client;
41namespace mclr = mir::client::rpc;41namespace mclr = mir::client::rpc;
42namespace md = mir::dispatch;42namespace md = mir::dispatch;
43namespace mp = mir::protobuf;
4344
44namespace45namespace
45{46{
@@ -241,48 +242,48 @@
241242
242void mclr::MirProtobufRpcChannel::process_event_sequence(std::string const& event)243void mclr::MirProtobufRpcChannel::process_event_sequence(std::string const& event)
243{244{
244 auto seq = mcl::make_protobuf_object<mir::protobuf::EventSequence>();245 mp::EventSequence seq;
245246
246 seq->ParseFromString(event);247 seq.ParseFromString(event);
247248
248 if (seq->has_display_configuration())249 if (seq.has_display_configuration())
249 {250 {
250 display_configuration->update_configuration(seq->display_configuration());251 display_configuration->update_configuration(seq.display_configuration());
251 }252 }
252253
253 if (seq->has_lifecycle_event())254 if (seq.has_lifecycle_event())
254 {255 {
255 (*lifecycle_control)(static_cast<MirLifecycleState>(seq->lifecycle_event().new_state()));256 (*lifecycle_control)(static_cast<MirLifecycleState>(seq.lifecycle_event().new_state()));
256 }257 }
257258
258 if (seq->has_ping_event())259 if (seq.has_ping_event())
259 {260 {
260 (*ping_handler)(seq->ping_event().serial());261 (*ping_handler)(seq.ping_event().serial());
261 }262 }
262263
263 if (seq->has_buffer_request())264 if (seq.has_buffer_request())
264 {265 {
265 std::array<char, 1> dummy;266 std::array<char, 1> dummy;
266 auto const num_fds = seq->mutable_buffer_request()->mutable_buffer()->fds_on_side_channel();267 auto const num_fds = seq.mutable_buffer_request()->mutable_buffer()->fds_on_side_channel();
267 std::vector<mir::Fd> fds(num_fds);268 std::vector<mir::Fd> fds(num_fds);
268 if (num_fds > 0)269 if (num_fds > 0)
269 {270 {
270 transport->receive_data(dummy.data(), dummy.size(), fds);271 transport->receive_data(dummy.data(), dummy.size(), fds);
271 seq->mutable_buffer_request()->mutable_buffer()->clear_fd();272 seq.mutable_buffer_request()->mutable_buffer()->clear_fd();
272 for(auto& fd : fds)273 for(auto& fd : fds)
273 seq->mutable_buffer_request()->mutable_buffer()->add_fd(fd);274 seq.mutable_buffer_request()->mutable_buffer()->add_fd(fd);
274 }275 }
275276
276 surface_map->with_stream_do(mf::BufferStreamId(seq->buffer_request().id().value()),277 surface_map->with_stream_do(mf::BufferStreamId(seq.buffer_request().id().value()),
277 [&] (mcl::ClientBufferStream* stream) {278 [&] (mcl::ClientBufferStream* stream) {
278 stream->buffer_available(seq->buffer_request().buffer());279 stream->buffer_available(seq.buffer_request().buffer());
279 });280 });
280 }281 }
281282
282 int const nevents = seq->event_size();283 int const nevents = seq.event_size();
283 for (int i = 0; i != nevents; ++i)284 for (int i = 0; i != nevents; ++i)
284 {285 {
285 mir::protobuf::Event const& event = seq->event(i);286 mp::Event const& event = seq.event(i);
286 if (event.has_raw())287 if (event.has_raw())
287 {288 {
288 std::string const& raw_event = event.raw();289 std::string const& raw_event = event.raw();
@@ -349,7 +350,7 @@
349 */350 */
350 std::lock_guard<decltype(read_mutex)> lock(read_mutex);351 std::lock_guard<decltype(read_mutex)> lock(read_mutex);
351352
352 auto result = mcl::make_protobuf_object<mir::protobuf::wire::Result>();353 auto result = mcl::make_protobuf_object<mp::wire::Result>();
353 try354 try
354 {355 {
355 uint16_t message_size;356 uint16_t message_size;
@@ -393,7 +394,7 @@
393 {394 {
394 // It's too difficult to convince C++ to move this lambda everywhere, so395 // It's too difficult to convince C++ to move this lambda everywhere, so
395 // just give up and let it pretend its a shared_ptr.396 // just give up and let it pretend its a shared_ptr.
396 std::shared_ptr<mir::protobuf::wire::Result> appeaser{std::move(result)};397 std::shared_ptr<mp::wire::Result> appeaser{std::move(result)};
397 delayed_processor->enqueue([delayed_result = std::move(appeaser), this]() mutable398 delayed_processor->enqueue([delayed_result = std::move(appeaser), this]() mutable
398 {399 {
399 pending_calls.complete_response(*delayed_result);400 pending_calls.complete_response(*delayed_result);
400401
=== modified file 'src/client/rpc/mir_protobuf_rpc_channel.h'
--- src/client/rpc/mir_protobuf_rpc_channel.h 2015-07-29 17:33:10 +0000
+++ src/client/rpc/mir_protobuf_rpc_channel.h 2015-07-29 17:33:10 +0000
@@ -28,8 +28,6 @@
28#include "../lifecycle_control.h"28#include "../lifecycle_control.h"
29#include "../ping_handler.h"29#include "../ping_handler.h"
3030
31#include "mir_protobuf_wire.pb.h"
32
33#include <thread>31#include <thread>
34#include <atomic>32#include <atomic>
35#include <experimental/optional>33#include <experimental/optional>

Subscribers

People subscribed via source and target branches