Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:42.2:Update
baloo5
0005-Make-e.g.-Baloo-Query-thread-safe.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
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
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor