File 0005-Make-e.g.-Baloo-Query-thread-safe.patch of Package baloo5
From e34da150d82a57cf417a59b8b632b2fecb32a6f7 Mon Sep 17 00:00:00 2001
From: Christoph Cullmann <cullmann@kde.org>
Date: Sun, 11 Sep 2016 20:24:40 +0200
Subject: [PATCH 05/13] Make e.g. Baloo::Query thread safe.
lmdb itself is thread safe (e.g. you can use the same env in multiple threads).
Unfortunately, the Baloo:atabase itself not, as open() might race against other open calls (we have one unique db object in baloo).
=> add non-recursive mutex (recursive mutex not needed, one just must avoid to call isOpen() or path() inside open, that is done, else no unit test works).
REVIEW: 128890
---
src/engine/database.cpp | 21 ++++++++++++++++++---
src/engine/database.h | 47 ++++++++++++++++++++++++++++++++++++++++++-----
2 files changed, 60 insertions(+), 8 deletions(-)
diff --git a/src/engine/database.cpp b/src/engine/database.cpp
index ec7ae2e..8ae6b03 100644
--- a/src/engine/database.cpp
+++ b/src/engine/database.cpp
@@ -1,6 +1,7 @@
/*
This file is part of the KDE Baloo project.
* Copyright (C) 2015 Vishesh Handa <vhanda@kde.org>
+ * Copyright (C) 2016 Christoph Cullmann <cullmann@kde.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -43,23 +44,30 @@
#include <QFile>
#include <QFileInfo>
#include <QDir>
+#include <QMutexLocker>
using namespace Baloo;
Database::Database(const QString& path)
: m_path(path)
- , m_env(0)
+ , m_env(nullptr)
{
}
Database::~Database()
{
- mdb_env_close(m_env);
+ // try only to close if we did open the DB successfully
+ if (m_env) {
+ mdb_env_close(m_env);
+ }
}
bool Database::open(OpenMode mode)
{
- if (isOpen()) {
+ QMutexLocker locker(&m_mutex);
+
+ // nop if already open!
+ if (m_env) {
return true;
}
@@ -216,7 +224,14 @@ bool Database::open(OpenMode mode)
return true;
}
+bool Database::isOpen() const
+{
+ QMutexLocker locker(&m_mutex);
+ return m_env != 0;
+}
+
QString Database::path() const
{
+ QMutexLocker locker(&m_mutex);
return m_path;
}
diff --git a/src/engine/database.h b/src/engine/database.h
index e3bb175..4d1f6a1 100644
--- a/src/engine/database.h
+++ b/src/engine/database.h
@@ -1,6 +1,7 @@
/*
This file is part of the KDE Baloo project.
* Copyright (C) 2015 Vishesh Handa <vhanda@kde.org>
+ * Copyright (C) 2016 Christoph Cullmann <cullmann@kde.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -21,6 +22,8 @@
#ifndef BALOO_DATABASE_H
#define BALOO_DATABASE_H
+#include <QMutex>
+
#include "document.h"
#include "databasedbis.h"
@@ -31,21 +34,56 @@ class DatabaseTest;
class BALOO_ENGINE_EXPORT Database
{
public:
+ /**
+ * Init database for given DB path, will not open it.
+ * @param path db path
+ */
explicit Database(const QString& path);
- ~Database();
- QString path() const;
+ /**
+ * Destruct db, might close it, if opened.
+ */
+ ~Database();
+ /**
+ * Database open mode
+ */
enum OpenMode {
CreateDatabase,
OpenDatabase
};
+
+ /**
+ * Open database in given mode.
+ * Nop after open was done (even if mode differs).
+ * There is no close as this would invalidate the database for all threads using it.
+ * @parmm mode create or open only?
+ * @return success?
+ */
bool open(OpenMode mode);
- bool isOpen() const { return m_env != 0; }
+ /**
+ * Is database open?
+ * @return database open?
+ */
+ bool isOpen() const;
+
+ /**
+ * Path to database.
+ * @return database path
+ */
+ QString path() const;
private:
- QString m_path;
+ /**
+ * serialize access, as open might be called from multiple threads
+ */
+ mutable QMutex m_mutex;
+
+ /**
+ * database path
+ */
+ const QString m_path;
MDB_env* m_env;
DatabaseDbis m_dbis;
@@ -56,5 +94,4 @@ private:
};
}
-
#endif // BALOO_DATABASE_H
--
2.10.0