We apparently support multiple concurrent screencast captures on the same object, but we share the error instance among them, leading to memory errors like:
auto const error1 = mir_screencast_capture_to_buffer(...);
auto const error2 = mir_screencast_capture_to_buffer(...);
// error1 now points to freed memory!
+ class CaptureSync
We can use std::promise<MirError*> instead (or our own no-TLS implementation if needed).
+++ include/ client/ mir_toolkit/ mir_buffer. h 2017-02-21 22:04:27 +0000
+ void mir_screencast_ capture_ to_buffer( capture_ to_buffer_ sync(MirScreenc ast* screencast, MirBuffer* buffer);
+ MirError const* mir_screencast_
Shoudn't these be part of the screencast API (mir_screencast.h) rather than the buffer API?
+ if (request- >response. has_error( )) unique< MirError> (mir_error_ domain_ screencast, mir_screencast_ error_failure) ; >available_ callback( cast<MirBuffer* >(request- >buffer) , error.get(), request- >available_ context) ;
+ error = std::make_
+ else
+ error = nullptr;
+
+ request-
+ reinterpret_
We apparently support multiple concurrent screencast captures on the same object, but we share the error instance among them, leading to memory errors like:
auto const error1 = mir_screencast_ capture_ to_buffer( ...); capture_ to_buffer( ...);
auto const error2 = mir_screencast_
// error1 now points to freed memory!
+ class CaptureSync
We can use std::promise< MirError* > instead (or our own no-TLS implementation if needed).