Browse Source

checkpoint

passthrough2
Antonio SJ Musumeci 8 months ago
parent
commit
e5aa69a010
  1. 59
      src/passthrough.cpp
  2. 35
      src/passthrough.hpp

59
src/passthrough.cpp

@ -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

@ -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…
Cancel
Save