Commit eb8fd079 authored by Max Kellermann's avatar Max Kellermann

lib/nfs/Manager: gcc 4.7 compatibility hack

std::map::emplace() is only available from gcc 4.8 on.
parent c99559db
...@@ -103,6 +103,22 @@ public: ...@@ -103,6 +103,22 @@ public:
server(_server), export_name(_export_name), server(_server), export_name(_export_name),
context(nullptr) {} context(nullptr) {}
#if defined(__GNUC__) && !defined(__clang__) && !GCC_CHECK_VERSION(4,8)
/* needed for NfsManager::GetConnection() due to lack of
std::map::emplace() */
NfsConnection(NfsConnection &&other)
:SocketMonitor(((SocketMonitor &)other).GetEventLoop()),
DeferredMonitor(((DeferredMonitor &)other).GetEventLoop()),
server(std::move(other.server)),
export_name(std::move(other.export_name)),
context(nullptr) {
assert(other.context == nullptr);
assert(other.new_leases.empty());
assert(other.active_leases.empty());
assert(other.callbacks.IsEmpty());
}
#endif
~NfsConnection(); ~NfsConnection();
gcc_pure gcc_pure
......
...@@ -39,10 +39,19 @@ NfsManager::GetConnection(const char *server, const char *export_name) ...@@ -39,10 +39,19 @@ NfsManager::GetConnection(const char *server, const char *export_name)
const std::string key = Key(server, export_name); const std::string key = Key(server, export_name);
#if defined(__GNUC__) && !defined(__clang__) && !GCC_CHECK_VERSION(4,8)
/* std::map::emplace() not available; this hack uses the move
constructor */
auto e = connections.insert(std::make_pair(key,
ManagedConnection(*this, loop,
server,
export_name)));
#else
auto e = connections.emplace(std::piecewise_construct, auto e = connections.emplace(std::piecewise_construct,
std::forward_as_tuple(key), std::forward_as_tuple(key),
std::forward_as_tuple(*this, loop, std::forward_as_tuple(*this, loop,
server, server,
export_name)); export_name));
#endif
return e.first->second; return e.first->second;
} }
...@@ -41,6 +41,13 @@ class NfsManager { ...@@ -41,6 +41,13 @@ class NfsManager {
:NfsConnection(_loop, _server, _export_name), :NfsConnection(_loop, _server, _export_name),
manager(_manager) {} manager(_manager) {}
#if defined(__GNUC__) && !defined(__clang__) && !GCC_CHECK_VERSION(4,8)
/* needed due to lack of std::map::emplace() */
ManagedConnection(ManagedConnection &&other)
:NfsConnection(std::move(other)),
manager(other.manager) {}
#endif
protected: protected:
/* virtual methods from NfsConnection */ /* virtual methods from NfsConnection */
void OnNfsConnectionError(Error &&error) override; void OnNfsConnectionError(Error &&error) override;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment