Plug leak

This commit is contained in:
loki 2020-01-11 01:17:57 +01:00
commit 51826ea384
6 changed files with 41 additions and 18 deletions

View file

@ -79,14 +79,14 @@ std::optional<std::pair<std::string, std::string>> parse_line(std::string_view::
std::unordered_map<std::string, std::string> parse_config(std::string_view file_content) {
std::unordered_map<std::string, std::string> vars;
auto pos = std::begin(file_content) - 1;
auto pos = std::begin(file_content);
auto end = std::end(file_content);
while(pos <= end) {
auto newline = std::find(pos, end, '\n');
auto var = parse_line(pos, *(newline - 1) == '\r' ? newline - 1 : newline);
while(pos < end) {
auto newline = std::find_if(pos, end, [](auto ch) { return ch == '\n' || ch == '\r'; });
auto var = parse_line(pos, newline);
pos = newline + 1;
pos = (*newline == '\r') ? newline + 2 : newline + 1;
if(!var) {
continue;
}

View file

@ -299,5 +299,5 @@ void reset(std::shared_ptr<input_t> &input) {
task_pool.push(reset_helper, input);
}
input_t::input_t() : gamepad_state { 0 }, back_timeout_id { nullptr }, input { platf::input() } {}
input_t::input_t() : gamepad_state {}, mouse_press {}, back_timeout_id { nullptr }, input { platf::input() } {}
}

View file

@ -63,8 +63,6 @@ int main(int argc, char *argv[]) {
boost::shared_ptr<std::ostream> stream { &std::cout, NoDelete {} };
sink->locked_backend()->add_stream(stream);
sink->set_filter(severity >= config::sunshine.min_log_level);
// sink->set_formatter(bl::expressions::stream
// << "log level "sv << severity << ": "sv << bl::expressions::smessage);
sink->set_formatter([severity="Severity"s](const bl::record_view &view, bl::formatting_ostream &os) {
auto log_level = view.attribute_values()[severity].extract<int>().get();

View file

@ -12,9 +12,13 @@ namespace platf {
struct img_t {
public:
std::uint8_t *data;
std::int32_t width;
std::int32_t height;
std::uint8_t *data {};
std::int32_t width {};
std::int32_t height {};
img_t() = default;
img_t(const img_t&) = delete;
img_t(img_t&&) = delete;
virtual ~img_t() = default;
};

View file

@ -28,6 +28,7 @@ namespace platf {
using namespace std::literals;
void freeImage(XImage *);
void freeX(XFixesCursorImage *);
using ifaddr_t = util::safe_ptr<ifaddrs, freeifaddrs>;
using xcb_connect_t = util::safe_ptr<xcb_connection_t, xcb_disconnect>;
@ -36,6 +37,7 @@ using xcb_cursor_img = util::c_ptr<xcb_xfixes_get_cursor_image_reply_t>;
using xdisplay_t = util::safe_ptr_v2<Display, int, XCloseDisplay>;
using ximg_t = util::safe_ptr<XImage, freeImage>;
using xcursor_t = util::safe_ptr<XFixesCursorImage, freeX>;
class shm_id_t {
public:
@ -80,13 +82,19 @@ struct x11_img_t : public img_t {
struct shm_img_t : public img_t {
~shm_img_t() override {
if(data) {
delete(data);
delete[] data;
}
}
};
void blend_cursor(Display *display, std::uint8_t *img_data, int width, int height) {
XFixesCursorImage *overlay = XFixesGetCursorImage(display);
xcursor_t overlay { XFixesGetCursorImage(display) };
if(!overlay) {
BOOST_LOG(error) << "Couldn't get cursor from XFixesGetCursorImage"sv;
return;
}
overlay->x -= overlay->xhot;
overlay->y -= overlay->yhot;
@ -219,10 +227,16 @@ struct shm_attr_t : public x11_attr_t {
return capture_e::reinit;
}
img->data = new std::uint8_t[frame_size()];
img->width = display->width_in_pixels;
img->height = display->height_in_pixels;
if(img->width != display->width_in_pixels || img->height != display->height_in_pixels) {
if(img->data) {
delete[] img->data;
}
img->data = new std::uint8_t[frame_size()];
img->width = display->width_in_pixels;
img->height = display->height_in_pixels;
}
std::copy_n((std::uint8_t*)data.data, frame_size(), img->data);
if(cursor) {
@ -408,4 +422,7 @@ std::string get_local_ip() { return get_local_ip(AF_INET); }
void freeImage(XImage *p) {
XDestroyImage(p);
}
void freeX(XFixesCursorImage *p) {
XFree(p);
}
}

View file

@ -657,8 +657,12 @@ void audioThread() {
while (auto packet = packets->pop()) {
audio_packet_t audio_packet { (audio_packet_raw_t*)malloc(sizeof(audio_packet_raw_t) + packet->size()) };
audio_packet->rtp.sequenceNumber = util::endian::big(frame++);
audio_packet->rtp.header = 0;
audio_packet->rtp.packetType = 97;
audio_packet->rtp.sequenceNumber = util::endian::big(frame++);
audio_packet->rtp.timestamp = 0;
audio_packet->rtp.ssrc = 0;
std::copy(std::begin(*packet), std::end(*packet), audio_packet->payload());
sock.send_to(asio::buffer((char*)audio_packet.get(), sizeof(audio_packet_raw_t) + packet->size()), *peer);
@ -925,7 +929,7 @@ void cmd_announce(host_t &host, peer_t peer, msg_t &&req) {
if (whitespace(*pos++)) {
lines.emplace_back(begin, pos - begin - 1);
while(whitespace(*pos)) { ++pos; }
while(pos != std::end(payload) && whitespace(*pos)) { ++pos; }
begin = pos;
}
}