Skip to content

Commit 0107687

Browse files
committed
viewer: Use std::unique_ptr in event_table_ data structure
1 parent 9a74c4c commit 0107687

File tree

2 files changed

+12
-24
lines changed

2 files changed

+12
-24
lines changed

src/viewer/scrollview.cpp

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ static std::map<std::pair<ScrollView *, SVEventType>,
6060
std::pair<SVSemaphore *, std::unique_ptr<SVEvent>>> waiting_for_events;
6161
static std::mutex *waiting_for_events_mu;
6262

63-
SVEvent *SVEvent::copy() const {
64-
auto *any = new SVEvent;
63+
std::unique_ptr<SVEvent> SVEvent::copy() const {
64+
auto any = std::unique_ptr<SVEvent>(new SVEvent);
6565
any->command_id = command_id;
6666
any->counter = counter;
6767
any->parameter = new char[strlen(parameter) + 1];
@@ -319,38 +319,32 @@ void ScrollView::Initialize(const char *name, int x_pos, int y_pos, int x_size,
319319

320320
/// Sits and waits for events on this window.
321321
void ScrollView::StartEventHandler() {
322-
SVEvent *new_event;
323-
324322
for (;;) {
325323
stream_->Flush();
326324
semaphore_->Wait();
327-
new_event = nullptr;
328325
int serial = -1;
329326
int k = -1;
330327
mutex_.lock();
331328
// Check every table entry if it is valid and not already processed.
332329

333330
for (int i = 0; i < SVET_COUNT; i++) {
334331
if (event_table_[i] != nullptr && (serial < 0 || event_table_[i]->counter < serial)) {
335-
new_event = event_table_[i];
336332
serial = event_table_[i]->counter;
337333
k = i;
338334
}
339335
}
340336
// If we didn't find anything we had an old alarm and just sleep again.
341-
if (new_event != nullptr) {
342-
event_table_[k] = nullptr;
337+
if (k != -1) {
338+
auto new_event = std::move(event_table_[k]);
343339
mutex_.unlock();
344340
if (event_handler_ != nullptr) {
345-
event_handler_->Notify(new_event);
341+
event_handler_->Notify(new_event.get());
346342
}
347343
if (new_event->type == SVET_DESTROY) {
348344
// Signal the destructor that it is safe to terminate.
349345
event_handler_ended_ = true;
350-
delete new_event; // Delete the pointer after it has been processed.
351346
return;
352347
}
353-
delete new_event; // Delete the pointer after it has been processed.
354348
} else {
355349
mutex_.unlock();
356350
}
@@ -382,9 +376,6 @@ ScrollView::~ScrollView() {
382376
}
383377
delete semaphore_;
384378
delete points_;
385-
for (auto &i : event_table_) {
386-
delete i;
387-
}
388379
#endif // !GRAPHICS_DISABLED
389380
}
390381

@@ -424,18 +415,15 @@ void ScrollView::Signal() {
424415

425416
void ScrollView::SetEvent(const SVEvent *svevent) {
426417
// Copy event
427-
SVEvent *any = svevent->copy();
428-
SVEvent *specific = svevent->copy();
418+
auto any = svevent->copy();
419+
auto specific = svevent->copy();
429420
any->counter = specific->counter + 1;
430421

431422
// Place both events into the queue.
432423
std::lock_guard<std::mutex> guard(mutex_);
433-
// Delete the old objects..
434-
delete event_table_[specific->type];
435-
delete event_table_[SVET_ANY];
436-
// ...and put the new ones in the table.
437-
event_table_[specific->type] = specific;
438-
event_table_[SVET_ANY] = any;
424+
425+
event_table_[specific->type] = std::move(specific);
426+
event_table_[SVET_ANY] = std::move(any);
439427
}
440428

441429
/// Block until an event of the given type is received.

src/viewer/scrollview.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ struct SVEvent {
7070
~SVEvent() {
7171
delete[] parameter;
7272
}
73-
SVEvent *copy() const;
73+
std::unique_ptr<SVEvent> copy() const;
7474
SVEventType type = SVET_DESTROY; // What kind of event.
7575
ScrollView *window = nullptr; // Window event relates to.
7676
char *parameter = nullptr; // Any string that might have been passed as argument.
@@ -414,7 +414,7 @@ class TESS_API ScrollView {
414414
static SVNetwork *stream_;
415415

416416
// Table of all the currently queued events.
417-
SVEvent *event_table_[SVET_COUNT];
417+
std::unique_ptr<SVEvent> event_table_[SVET_COUNT];
418418

419419
// Mutex to access the event_table_ in a synchronized fashion.
420420
std::mutex mutex_;

0 commit comments

Comments
 (0)