mirror of
https://github.com/trapexit/mergerfs.git
synced 2024-11-22 13:47:03 +08:00
checkpoint
This commit is contained in:
parent
307cd4d2e6
commit
e5aa69a010
59
src/passthrough.cpp
Normal file
59
src/passthrough.cpp
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
#include "passthrough.hpp"
|
||||||
|
|
||||||
|
#include "boost/unordered/concurrent_flat_map.hpp"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
typedef boost::unordered::concurrent_flat_map<std::string,PTInfo> PTMap;
|
||||||
|
static PTMap g_PT;
|
||||||
|
|
||||||
|
namespace PassthroughStuff
|
||||||
|
{
|
||||||
|
std::mutex*
|
||||||
|
get_mutex(const char *fusepath_)
|
||||||
|
{
|
||||||
|
std::mutex *m = nullptr;
|
||||||
|
|
||||||
|
g_PT.visit(fusepath_,
|
||||||
|
[&](const PTMap::value_type &x_)
|
||||||
|
{
|
||||||
|
m = &x_.second.mutex;
|
||||||
|
});
|
||||||
|
|
||||||
|
if(!m)
|
||||||
|
{
|
||||||
|
g_PT.insert(PTMap::value_type{fusepath_,PTInfo{}});
|
||||||
|
g_PT.visit(fusepath_,
|
||||||
|
[&](const PTMap::value_type &x_)
|
||||||
|
{
|
||||||
|
m = &x_.second.mutex;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
PTInfo*
|
||||||
|
get_pti(const char *fusepath_)
|
||||||
|
{
|
||||||
|
PTInfo *pti = nullptr;
|
||||||
|
|
||||||
|
g_PT.visit(fusepath_,
|
||||||
|
[&](PTMap::value_type &x_)
|
||||||
|
{
|
||||||
|
pti = &x_.second;
|
||||||
|
});
|
||||||
|
|
||||||
|
if(!pti)
|
||||||
|
{
|
||||||
|
g_PT.insert(PTMap::value_type{fusepath_,PTInfo{}});
|
||||||
|
g_PT.visit(fusepath_,
|
||||||
|
[&](PTMap::value_type &x_)
|
||||||
|
{
|
||||||
|
pti = &x_.second;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return pti;
|
||||||
|
}
|
||||||
|
};
|
35
src/passthrough.hpp
Normal file
35
src/passthrough.hpp
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
struct PTInfo
|
||||||
|
{
|
||||||
|
PTInfo()
|
||||||
|
: path_fd(-1),
|
||||||
|
backing_id(0),
|
||||||
|
open_count(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
PTInfo(PTInfo &&pti_)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> _(mutex);
|
||||||
|
|
||||||
|
path_fd = pti_.path_fd;
|
||||||
|
backing_id = pti_.backing_id;
|
||||||
|
filepath = pti_.filepath;
|
||||||
|
open_count = pti_.open_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
int path_fd;
|
||||||
|
int backing_id;
|
||||||
|
unsigned open_count;
|
||||||
|
std::string filepath;
|
||||||
|
mutable std::mutex mutex;
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace PassthroughStuff
|
||||||
|
{
|
||||||
|
PTInfo* get_pti(const char *fusepath);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user