Skip to content

Commit 1862662

Browse files
author
loki
committed
Prevent queue from growing to large, eating up all memory
1 parent 1102ac9 commit 1862662

File tree

8 files changed

+45
-46
lines changed

8 files changed

+45
-46
lines changed

sunshine/audio.cpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,15 @@ static opus_stream_config_t HighSurround51 = {
5353
void encodeThread(packet_queue_t packets, sample_queue_t samples, config_t config, void *channel_data) {
5454
//FIXME: Pick correct opus_stream_config_t based on config.channels
5555
auto stream = &stereo;
56-
opus_t opus { opus_multistream_encoder_create(
57-
stream->sampleRate,
58-
stream->channelCount,
59-
stream->streams,
60-
stream->coupledStreams,
61-
stream->mapping,
62-
OPUS_APPLICATION_AUDIO,
63-
nullptr)
64-
};
56+
opus_t opus { opus_multistream_encoder_create(
57+
stream->sampleRate,
58+
stream->channelCount,
59+
stream->streams,
60+
stream->coupledStreams,
61+
stream->mapping,
62+
OPUS_APPLICATION_AUDIO,
63+
nullptr)
64+
};
6565

6666
auto frame_size = config.packetDuration * stream->sampleRate / 1000;
6767
while(auto sample = samples->pop()) {
@@ -76,17 +76,19 @@ void encodeThread(packet_queue_t packets, sample_queue_t samples, config_t confi
7676
}
7777

7878
packet.fake_resize(bytes);
79-
packets->raise(std::make_pair(channel_data, std::move(packet)));
79+
packets->raise(channel_data, std::move(packet));
8080
}
8181
}
8282

8383
void capture(safe::signal_t *shutdown_event, packet_queue_t packets, config_t config, void *channel_data) {
84-
auto samples = std::make_shared<sample_queue_t::element_type>();
84+
auto samples = std::make_shared<sample_queue_t::element_type>(30);
8585
std::thread thread { encodeThread, packets, samples, config, channel_data };
8686

8787
auto fg = util::fail_guard([&]() {
8888
samples->stop();
8989
thread.join();
90+
91+
shutdown_event->view();
9092
});
9193

9294
//FIXME: Pick correct opus_stream_config_t based on config.channels

sunshine/nvhttp.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -767,7 +767,7 @@ void start(std::shared_ptr<safe::signal_t> shutdown_event) {
767767
}
768768
}
769769

770-
auto add_cert = std::make_shared<safe::queue_t<crypto::x509_t>>();
770+
auto add_cert = std::make_shared<safe::queue_t<crypto::x509_t>>(30);
771771

772772
// Ugly hack for verifying certificates, see crypto::cert_chain_t::verify() for details
773773
ctx->set_verify_callback([&cert_chain, add_cert](int verified, boost::asio::ssl::verify_context &ctx) {

sunshine/platform/linux/display.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -361,13 +361,10 @@ std::unique_ptr<mic_t> microphone(std::uint32_t sample_rate) {
361361

362362
int status;
363363

364-
const char *audio_sink = nullptr;
364+
const char *audio_sink = "@DEFAULT_MONITOR@";
365365
if(!config::audio.sink.empty()) {
366366
audio_sink = config::audio.sink.c_str();
367367
}
368-
else {
369-
audio_sink = "@DEFAULT_MONITOR@";
370-
}
371368

372369
mic->mic.reset(
373370
pa_simple_new(nullptr, "sunshine", pa_stream_direction_t::PA_STREAM_RECORD, audio_sink, "sunshine-record", &mic->ss, nullptr, nullptr, &status)

sunshine/platform/windows/audio.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -319,18 +319,11 @@ class mic_wasapi_t : public mic_t {
319319
}
320320

321321
namespace platf {
322-
class dummy_mic_t : public mic_t {
323-
public:
324-
capture_e sample(std::vector<std::int16_t> &sample_buf) override {
325-
return capture_e::ok;
326-
}
327-
};
328-
329322
std::unique_ptr<mic_t> microphone(std::uint32_t sample_rate) {
330323
auto mic = std::make_unique<audio::mic_wasapi_t>();
331324

332325
if(mic->init(sample_rate)) {
333-
return std::make_unique<dummy_mic_t>();
326+
return nullptr;
334327
}
335328

336329
return mic;

sunshine/stream.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -718,9 +718,9 @@ void audioBroadcastThread(safe::signal_t *shutdown_event, udp::socket &sock, aud
718718
}
719719

720720
int start_broadcast(broadcast_ctx_t &ctx) {
721-
ctx.video_packets = std::make_shared<video::packet_queue_t::element_type>();
722-
ctx.audio_packets = std::make_shared<audio::packet_queue_t::element_type>();
723-
ctx.message_queue_queue = std::make_shared<message_queue_queue_t::element_type>();
721+
ctx.video_packets = std::make_shared<video::packet_queue_t::element_type>(30);
722+
ctx.audio_packets = std::make_shared<audio::packet_queue_t::element_type>(30);
723+
ctx.message_queue_queue = std::make_shared<message_queue_queue_t::element_type>(30);
724724

725725
ctx.video_thread = std::thread { videoBroadcastThread, &broadcast_shutdown_event, std::ref(ctx.video_sock), ctx.video_packets };
726726
ctx.audio_thread = std::thread { audioBroadcastThread, &broadcast_shutdown_event, std::ref(ctx.audio_sock), ctx.audio_packets };
@@ -763,7 +763,7 @@ void end_broadcast(broadcast_ctx_t &ctx) {
763763
int recv_ping(decltype(broadcast)::ptr_t ref, socket_e type, asio::ip::address &addr, std::chrono::milliseconds timeout) {
764764
auto constexpr ping = "PING"sv;
765765

766-
auto messages = std::make_shared<message_queue_t::element_type>();
766+
auto messages = std::make_shared<message_queue_t::element_type>(30);
767767
ref->message_queue_queue->raise(type, addr, messages);
768768

769769
auto fg = util::fail_guard([&]() {

sunshine/thread_safe.h

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,12 @@ class event_t {
2626
return;
2727
}
2828

29-
_status = status_t { std::forward<Args>(args)... };
29+
if constexpr (std::is_same_v<std::optional<T>, status_t>) {
30+
_status = std::make_optional<T>(std::forward<Args>(args)...);
31+
}
32+
else {
33+
_status = status_t { std::forward<Args>(args)... };
34+
}
3035

3136
_cv.notify_all();
3237
}
@@ -74,7 +79,7 @@ class event_t {
7479

7580
// pop and view shoud not be used interchangebly
7681
const status_t &view() {
77-
std::unique_lock ul{ _lock };
82+
std::unique_lock ul { _lock };
7883

7984
if (!_continue) {
8085
return util::false_v<status_t>;
@@ -130,14 +135,20 @@ class queue_t {
130135
using status_t = util::optional_t<T>;
131136

132137
public:
138+
queue_t(std::uint32_t max_elements) : _max_elements { max_elements } {}
139+
133140
template<class ...Args>
134141
void raise(Args &&... args) {
135-
std::lock_guard lg{_lock};
142+
std::lock_guard ul { _lock };
136143

137144
if(!_continue) {
138145
return;
139146
}
140147

148+
if(_queue.size() == _max_elements) {
149+
_queue.clear();
150+
}
151+
141152
_queue.emplace_back(std::forward<Args>(args)...);
142153

143154
_cv.notify_all();
@@ -151,7 +162,7 @@ class queue_t {
151162

152163
template<class Rep, class Period>
153164
status_t pop(std::chrono::duration<Rep, Period> delay) {
154-
std::unique_lock ul{_lock};
165+
std::unique_lock ul { _lock };
155166

156167
if (!_continue) {
157168
return util::false_v<status_t>;
@@ -170,7 +181,7 @@ class queue_t {
170181
}
171182

172183
status_t pop() {
173-
std::unique_lock ul{ _lock };
184+
std::unique_lock ul { _lock };
174185

175186
if (!_continue) {
176187
return util::false_v<status_t>;
@@ -191,12 +202,12 @@ class queue_t {
191202
}
192203

193204
std::vector<T> &unsafe() {
194-
std::lock_guard { _lock };
205+
std::lock_guard { _lock };
195206
return _queue;
196207
}
197208

198209
void stop() {
199-
std::lock_guard lg{ _lock };
210+
std::lock_guard lg { _lock };
200211

201212
_continue = false;
202213

@@ -209,10 +220,12 @@ class queue_t {
209220

210221
private:
211222

212-
bool _continue{ true };
223+
bool _continue { true };
224+
std::uint32_t _max_elements;
213225

214226
std::mutex _lock;
215227
std::condition_variable _cv;
228+
216229
std::vector<T> _queue;
217230
};
218231

sunshine/utility.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -515,13 +515,7 @@ class buffer_t {
515515
public:
516516
buffer_t() : _els { 0 } {};
517517
buffer_t(buffer_t&&) noexcept = default;
518-
buffer_t &operator=(buffer_t&& other) noexcept {
519-
std::swap(_els, other._els);
520-
521-
_buf = std::move(other._buf);
522-
523-
return *this;
524-
};
518+
buffer_t &operator=(buffer_t&& other) noexcept = default;
525519

526520
explicit buffer_t(size_t elements) : _els { elements }, _buf { std::make_unique<T[]>(elements) } {}
527521
explicit buffer_t(size_t elements, const T &t) : _els { elements }, _buf { std::make_unique<T[]>(elements) } {

sunshine/video.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ struct capture_thread_async_ctx_t {
238238
};
239239

240240
struct capture_thread_sync_ctx_t {
241-
encode_session_ctx_queue_t encode_session_ctx_queue;
241+
encode_session_ctx_queue_t encode_session_ctx_queue { 30 };
242242
};
243243

244244
int start_capture_sync(capture_thread_sync_ctx_t &ctx);
@@ -1079,7 +1079,7 @@ bool validate_config(std::shared_ptr<platf::display_t> &disp, const encoder_t &e
10791079

10801080
session->frame->pict_type = AV_PICTURE_TYPE_I;
10811081

1082-
auto packets = std::make_shared<packet_queue_t::element_type>();
1082+
auto packets = std::make_shared<packet_queue_t::element_type>(30);
10831083
if(encode(1, session->ctx, session->frame, packets, nullptr)) {
10841084
return false;
10851085
}
@@ -1282,7 +1282,7 @@ int start_capture_async(capture_thread_async_ctx_t &capture_thread_ctx) {
12821282
capture_thread_ctx.encoder_p = &encoders.front();
12831283
capture_thread_ctx.reinit_event.reset();
12841284

1285-
capture_thread_ctx.capture_ctx_queue = std::make_shared<safe::queue_t<capture_ctx_t>>();
1285+
capture_thread_ctx.capture_ctx_queue = std::make_shared<safe::queue_t<capture_ctx_t>>(30);
12861286

12871287
capture_thread_ctx.capture_thread = std::thread {
12881288
captureThread,

0 commit comments

Comments
 (0)