[SCM] exiv2 packaging branch, master, updated. debian/0.25-3.1-3734-gdcbc29a
Maximiliano Curia
maxy at moszumanska.debian.org
Thu Jul 13 17:46:29 UTC 2017
Gitweb-URL: http://git.debian.org/?p=pkg-kde/kde-extras/exiv2.git;a=commitdiff;h=b15a401
The following commit has been merged in the master branch:
commit b15a40156944e4eeddee6ef90810bad01ed3206c
Author: Robin Mills <robin at clanmills.com>
Date: Mon May 30 14:45:28 2016 +0000
#1187 Thank You to Taras for the patch.
---
include/exiv2/properties.hpp | 9 +++
include/exiv2/rwlock.hpp | 138 +++++++++++++++++++++++++++++++++++++++++++
src/epsimage.cpp | 1 +
src/preview.cpp | 1 +
src/properties.cpp | 39 ++++++++++--
5 files changed, 182 insertions(+), 6 deletions(-)
diff --git a/include/exiv2/properties.hpp b/include/exiv2/properties.hpp
index 08a9ee8..b406ff1 100644
--- a/include/exiv2/properties.hpp
+++ b/include/exiv2/properties.hpp
@@ -39,6 +39,7 @@
#include "metadatum.hpp"
#include "tags.hpp"
#include "datasets.hpp"
+#include "rwlock.hpp"
// + standard includes
#include <string>
@@ -108,6 +109,11 @@ namespace Exiv2 {
//! Prevent assignment: not implemented.
XmpProperties& operator=(const XmpProperties& rhs);
+ private:
+ static const XmpNsInfo* nsInfoUnsafe(const std::string& prefix);
+ static void unregisterNsUnsafe(const std::string& ns);
+ static const XmpNsInfo* lookupNsRegistryUnsafe(const XmpNsInfo::Prefix& prefix);
+
public:
/*!
@brief Return the title (label) of the property.
@@ -174,6 +180,7 @@ namespace Exiv2 {
@throw Error if no namespace is registered with \em prefix.
*/
static const XmpNsInfo* nsInfo(const std::string& prefix);
+
/*!
@brief Return the (preferred) prefix for schema namespace \em ns.
@param ns Schema namespace
@@ -206,6 +213,8 @@ namespace Exiv2 {
@note This invalidates XMP keys generated in this namespace.
*/
static void unregisterNs(const std::string& ns);
+ static Internal::RWLock rwLock_;
+
/*!
@brief Unregister all custom namespaces.
diff --git a/include/exiv2/rwlock.hpp b/include/exiv2/rwlock.hpp
new file mode 100644
index 0000000..617e140
--- /dev/null
+++ b/include/exiv2/rwlock.hpp
@@ -0,0 +1,138 @@
+#ifndef RW_LOCK_HPP
+#define RW_LOCK_HPP
+
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <pthread.h>
+#endif
+
+namespace Exiv2 {
+ namespace Internal {
+#ifdef _WIN32
+ class RWLock
+ {
+ public:
+ RWLock()
+ {
+ InitializeSRWLock(&rwlock_);
+ }
+
+ ~RWLock()
+ {
+ // do not explicitly destroy
+ }
+
+ void wrlock()
+ {
+ AcquireSRWLockExclusive(&rwlock_);
+ }
+
+ bool trywrlock()
+ {
+ return TryAcquireSRWLockExclusive(&rwlock_);
+ }
+
+ void rdlock()
+ {
+ AcquireSRWLockShared(&rwlock_);
+ }
+
+ bool tryrdlock()
+ {
+ return TryAcquireSRWLockShared(&rwlock_);
+ }
+
+ void rdunlock()
+ {
+ ReleaseSRWLockShared(&rwlock_);
+ }
+
+ void wrunlock()
+ {
+ ReleaseSRWLockExclusive(&rwlock_);
+ }
+
+ private:
+ SRWLOCK rwlock_;
+ };
+#else
+ class RWLock
+ {
+ public:
+ RWLock(const pthread_rwlockattr_t *attr = 0)
+ {
+ pthread_rwlock_init(&rwlock_, attr);
+ }
+
+ ~RWLock()
+ {
+ pthread_rwlock_destroy(&rwlock_);
+ }
+
+ int wrlock()
+ {
+ return pthread_rwlock_wrlock(&rwlock_);
+ }
+
+ int trywrlock()
+ {
+ return pthread_rwlock_trywrlock(&rwlock_);
+ }
+
+ int rdlock()
+ {
+ return pthread_rwlock_rdlock(&rwlock_);
+ }
+
+ int tryrdlock()
+ {
+ return pthread_rwlock_tryrdlock(&rwlock_);
+ }
+
+ int unlock()
+ {
+ return pthread_rwlock_unlock(&rwlock_);
+ }
+
+ void rdunlock() { unlock(); }
+ void wrunlock() { unlock(); }
+
+ private:
+ pthread_rwlock_t rwlock_;
+ };
+#endif
+
+ class ScopedReadLock
+ {
+ public:
+ ScopedReadLock(RWLock &rwlock):
+ rwlock_(rwlock)
+ {
+ rwlock_.rdlock();
+ }
+
+ ~ScopedReadLock() { rwlock_.rdunlock(); }
+
+ private:
+ RWLock &rwlock_;
+ };
+
+ class ScopedWriteLock
+ {
+ public:
+ ScopedWriteLock(RWLock &rwlock):
+ rwlock_(rwlock)
+ {
+ rwlock_.wrlock();
+ }
+
+ ~ScopedWriteLock() { rwlock_.wrunlock(); }
+
+ private:
+ RWLock &rwlock_;
+ };
+ }
+}
+
+#endif // RW_LOCK_HPP
diff --git a/src/epsimage.cpp b/src/epsimage.cpp
index 4e4a468..6e277e8 100644
--- a/src/epsimage.cpp
+++ b/src/epsimage.cpp
@@ -51,6 +51,7 @@ EXIV2_RCSID("@(#) $Id: epsimage.cpp $")
namespace {
using namespace Exiv2;
+ using Exiv2::byte;
// signature of DOS EPS
const std::string dosEpsSignature = "\xC5\xD0\xD3\xC6";
diff --git a/src/preview.cpp b/src/preview.cpp
index 1e86df7..bd28d52 100644
--- a/src/preview.cpp
+++ b/src/preview.cpp
@@ -47,6 +47,7 @@ EXIV2_RCSID("@(#) $Id$")
namespace {
using namespace Exiv2;
+ using Exiv2::byte;
/*!
@brief Compare two preview images by number of pixels, if width and height
diff --git a/src/properties.cpp b/src/properties.cpp
index 66d93fa..d4957ac 100644
--- a/src/properties.cpp
+++ b/src/properties.cpp
@@ -39,6 +39,7 @@ EXIV2_RCSID("@(#) $Id$")
#include "metadatum.hpp"
#include "i18n.h" // NLS support.
#include "xmp.hpp"
+#include "rwlock.hpp"
#include <iostream>
#include <iomanip>
@@ -2238,9 +2239,16 @@ namespace Exiv2 {
}
XmpProperties::NsRegistry XmpProperties::nsRegistry_;
+ Internal::RWLock XmpProperties::rwLock_;
const XmpNsInfo* XmpProperties::lookupNsRegistry(const XmpNsInfo::Prefix& prefix)
{
+ Internal::ScopedReadLock srl(rwLock_);
+ return lookupNsRegistryUnsafe(prefix);
+ }
+
+ const XmpNsInfo* XmpProperties::lookupNsRegistryUnsafe(const XmpNsInfo::Prefix& prefix)
+ {
for (NsRegistry::const_iterator i = nsRegistry_.begin();
i != nsRegistry_.end(); ++i) {
if (i->second == prefix) return &(i->second);
@@ -2251,11 +2259,13 @@ namespace Exiv2 {
void XmpProperties::registerNs(const std::string& ns,
const std::string& prefix)
{
+ Internal::ScopedWriteLock swl(rwLock_);
+
std::string ns2 = ns;
if ( ns2.substr(ns2.size() - 1, 1) != "/"
&& ns2.substr(ns2.size() - 1, 1) != "#") ns2 += "/";
// Check if there is already a registered namespace with this prefix
- const XmpNsInfo* xnp = lookupNsRegistry(XmpNsInfo::Prefix(prefix));
+ const XmpNsInfo* xnp = lookupNsRegistryUnsafe(XmpNsInfo::Prefix(prefix));
if (xnp) {
#ifndef SUPPRESS_WARNINGS
if (strcmp(xnp->ns_, ns2.c_str()) != 0) {
@@ -2263,7 +2273,7 @@ namespace Exiv2 {
<< xnp->ns_ << " to " << ns2 << "
";
}
#endif
- unregisterNs(xnp->ns_);
+ unregisterNsUnsafe(xnp->ns_);
}
// Allocated memory is freed when the namespace is unregistered.
// Using malloc/free for better system compatibility in case
@@ -2282,6 +2292,12 @@ namespace Exiv2 {
void XmpProperties::unregisterNs(const std::string& ns)
{
+ Internal::ScopedWriteLock swl(rwLock_);
+ unregisterNsUnsafe(ns);
+ }
+
+ void XmpProperties::unregisterNsUnsafe(const std::string& ns)
+ {
NsRegistry::iterator i = nsRegistry_.find(ns);
if (i != nsRegistry_.end()) {
std::free(const_cast<char*>(i->second.prefix_));
@@ -2292,15 +2308,18 @@ namespace Exiv2 {
void XmpProperties::unregisterNs()
{
+ Internal::ScopedWriteLock swl(rwLock_);
+
NsRegistry::iterator i = nsRegistry_.begin();
while (i != nsRegistry_.end()) {
NsRegistry::iterator kill = i++;
- unregisterNs(kill->first);
+ unregisterNsUnsafe(kill->first);
}
}
std::string XmpProperties::prefix(const std::string& ns)
{
+ Internal::ScopedReadLock srl(rwLock_);
std::string ns2 = ns;
if ( ns2.substr(ns2.size() - 1, 1) != "/"
&& ns2.substr(ns2.size() - 1, 1) != "#") ns2 += "/";
@@ -2318,9 +2337,10 @@ namespace Exiv2 {
std::string XmpProperties::ns(const std::string& prefix)
{
- const XmpNsInfo* xn = lookupNsRegistry(XmpNsInfo::Prefix(prefix));
+ Internal::ScopedReadLock srl(rwLock_);
+ const XmpNsInfo* xn = lookupNsRegistryUnsafe(XmpNsInfo::Prefix(prefix));
if (xn != 0) return xn->ns_;
- return nsInfo(prefix)->ns_;
+ return nsInfoUnsafe(prefix)->ns_;
}
const char* XmpProperties::propertyTitle(const XmpKey& key)
@@ -2384,8 +2404,15 @@ namespace Exiv2 {
const XmpNsInfo* XmpProperties::nsInfo(const std::string& prefix)
{
+ Internal::ScopedReadLock srl(rwLock_);
+ return nsInfoUnsafe(prefix);
+ }
+
+ const XmpNsInfo* XmpProperties::nsInfoUnsafe(const std::string& prefix)
+ {
+ Internal::ScopedReadLock srl(rwLock_);
const XmpNsInfo::Prefix pf(prefix);
- const XmpNsInfo* xn = lookupNsRegistry(pf);
+ const XmpNsInfo* xn = lookupNsRegistryUnsafe(pf);
if (!xn) xn = find(xmpNsInfo, pf);
if (!xn) throw Error(35, prefix);
return xn;
--
exiv2 packaging
More information about the pkg-kde-commits
mailing list