Skip to content

Commit 01a1d85

Browse files
fix: Avoid holding a lock while calling plugin code
1 parent cd526df commit 01a1d85

2 files changed

Lines changed: 31 additions & 15 deletions

File tree

src/app/triggersqueryhandler.cpp

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include "app.h"
44
#include "icon.h"
5+
#include "logging.h"
56
#include "matcher.h"
67
#include "queryengine.h"
78
#include "standarditem.h"
@@ -29,20 +30,20 @@ void TriggersQueryHandler::setFuzzyMatching(bool fuzzy) { fuzzy_ = fuzzy; }
2930

3031
bool TriggersQueryHandler::supportsFuzzyMatching() const { return true; }
3132

32-
shared_ptr<Item> TriggersQueryHandler::makeItem(const QString &trigger, Extension *handler) const
33+
shared_ptr<Item> TriggersQueryHandler::makeItem(const TriggerHandler &h) const
3334
{
3435
return StandardItem::make(
35-
handler->id(),
36-
QString(trigger).replace(" ", ""),
37-
QString("%1 · %2").arg(handler->name(), handler->description()),
36+
h.id,
37+
QString(h.trigger).replace(" ", ""),
38+
QString("%1 · %2").arg(h.name, h.description),
3839
[]{ return Icon::grapheme(u"🚀"_s); },
3940
{{
4041
"set",
4142
tr("Set input text"),
42-
[trigger]{ App::instance().show(trigger); },
43+
[&]{ App::instance().show(h.trigger); },
4344
false
4445
}},
45-
trigger
46+
h.trigger
4647
);
4748
}
4849

@@ -51,18 +52,26 @@ vector<RankItem> TriggersQueryHandler::rankItems(QueryContext &ctx)
5152
Matcher matcher(ctx, {.fuzzy = fuzzy_});
5253
vector<RankItem> r;
5354

54-
for (shared_lock l(handler_triggers_mutex_);
55-
const auto &[t, h] : handler_triggers_)
55+
for (shared_lock l(trigger_handlers_mutex_);
56+
const auto &h : trigger_handlers_)
5657
if (!ctx.isValid())
5758
break;
58-
else if (const auto m = matcher.match(t, h->name(), h->id()); m)
59-
r.emplace_back(makeItem(t, h), m);
59+
else if (const auto m = matcher.match(h.trigger, h.name, h.id); m)
60+
r.emplace_back(makeItem(h), m);
6061

6162
return r;
6263
}
6364

6465
void TriggersQueryHandler::updateTriggers()
6566
{
66-
lock_guard lock(handler_triggers_mutex_);
67-
handler_triggers_ = query_engine_.activeTriggerHandlers();
67+
try {
68+
vector<TriggerHandler> trigger_handlers;
69+
for (const auto &[t, h] : query_engine_.activeTriggerHandlers())
70+
trigger_handlers.emplace_back(h->id(), h->name(), h->description(), t);
71+
lock_guard lock(trigger_handlers_mutex_);
72+
trigger_handlers_ = ::move(trigger_handlers);
73+
}
74+
catch (...) {
75+
WARN << u"QueryHandler threw exception while updating TriggersQueryHandler."_s;
76+
}
6877
}

src/app/triggersqueryhandler.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,19 @@ class TriggersQueryHandler : public QObject, public albert::GlobalQueryHandler
2222

2323
private:
2424

25-
std::shared_ptr<albert::Item> makeItem(const QString &trigger, Extension *handler) const;
25+
struct TriggerHandler {
26+
QString id;
27+
QString name;
28+
QString description;
29+
QString trigger;
30+
};
31+
32+
std::shared_ptr<albert::Item> makeItem(const TriggerHandler &) const;
2633
void updateTriggers();
2734

2835
const QueryEngine &query_engine_;
29-
std::map<QString, QueryHandler *> handler_triggers_;
30-
std::shared_mutex handler_triggers_mutex_;
36+
std::vector<TriggerHandler> trigger_handlers_;
37+
std::shared_mutex trigger_handlers_mutex_;
3138
std::atomic_bool fuzzy_;
3239

3340
};

0 commit comments

Comments
 (0)