cellPamf: remove unused code
This commit is contained in:
@@ -5,14 +5,6 @@
|
|||||||
#include <bitset>
|
#include <bitset>
|
||||||
#include "cellPamf.h"
|
#include "cellPamf.h"
|
||||||
|
|
||||||
const std::function<bool()> SQUEUE_ALWAYS_EXIT = []() { return true; };
|
|
||||||
const std::function<bool()> SQUEUE_NEVER_EXIT = []() { return false; };
|
|
||||||
|
|
||||||
bool squeue_test_exit()
|
|
||||||
{
|
|
||||||
return Emu.IsStopped();
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_CHANNEL(cellPamf);
|
LOG_CHANNEL(cellPamf);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
|||||||
@@ -595,345 +595,3 @@ struct CellPamfReader
|
|||||||
CHECK_SIZE(CellPamfReader, 128);
|
CHECK_SIZE(CellPamfReader, 128);
|
||||||
|
|
||||||
error_code cellPamfReaderInitialize(vm::ptr<CellPamfReader> pSelf, vm::cptr<PamfHeader> pAddr, u64 fileSize, u32 attribute);
|
error_code cellPamfReaderInitialize(vm::ptr<CellPamfReader> pSelf, vm::cptr<PamfHeader> pAddr, u64 fileSize, u32 attribute);
|
||||||
|
|
||||||
#include <mutex>
|
|
||||||
#include <condition_variable>
|
|
||||||
|
|
||||||
extern const std::function<bool()> SQUEUE_ALWAYS_EXIT;
|
|
||||||
extern const std::function<bool()> SQUEUE_NEVER_EXIT;
|
|
||||||
|
|
||||||
bool squeue_test_exit();
|
|
||||||
|
|
||||||
// TODO: eliminate this boolshit
|
|
||||||
template<typename T, u32 sq_size = 256>
|
|
||||||
class squeue_t
|
|
||||||
{
|
|
||||||
struct squeue_sync_var_t
|
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
u32 position : 31;
|
|
||||||
u32 pop_lock : 1;
|
|
||||||
};
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
u32 count : 31;
|
|
||||||
u32 push_lock : 1;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
atomic_t<squeue_sync_var_t> m_sync;
|
|
||||||
|
|
||||||
mutable std::mutex m_rcv_mutex;
|
|
||||||
mutable std::mutex m_wcv_mutex;
|
|
||||||
mutable std::condition_variable m_rcv;
|
|
||||||
mutable std::condition_variable m_wcv;
|
|
||||||
|
|
||||||
T m_data[sq_size];
|
|
||||||
|
|
||||||
enum squeue_sync_var_result : u32
|
|
||||||
{
|
|
||||||
SQSVR_OK = 0,
|
|
||||||
SQSVR_LOCKED = 1,
|
|
||||||
SQSVR_FAILED = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
|
||||||
squeue_t()
|
|
||||||
: m_sync(squeue_sync_var_t{})
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static u32 get_max_size()
|
|
||||||
{
|
|
||||||
return sq_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool is_full() const
|
|
||||||
{
|
|
||||||
return m_sync.load().count == sq_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool push(const T& data, const std::function<bool()>& test_exit)
|
|
||||||
{
|
|
||||||
u32 pos = 0;
|
|
||||||
|
|
||||||
while (u32 res = m_sync.atomic_op([&pos](squeue_sync_var_t& sync) -> u32
|
|
||||||
{
|
|
||||||
ensure(sync.count <= sq_size);
|
|
||||||
ensure(sync.position < sq_size);
|
|
||||||
|
|
||||||
if (sync.push_lock)
|
|
||||||
{
|
|
||||||
return SQSVR_LOCKED;
|
|
||||||
}
|
|
||||||
if (sync.count == sq_size)
|
|
||||||
{
|
|
||||||
return SQSVR_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
sync.push_lock = 1;
|
|
||||||
pos = sync.position + sync.count;
|
|
||||||
return SQSVR_OK;
|
|
||||||
}))
|
|
||||||
{
|
|
||||||
if (res == SQSVR_FAILED && (test_exit() || squeue_test_exit()))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::unique_lock<std::mutex> wcv_lock(m_wcv_mutex);
|
|
||||||
m_wcv.wait_for(wcv_lock, std::chrono::milliseconds(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
m_data[pos >= sq_size ? pos - sq_size : pos] = data;
|
|
||||||
|
|
||||||
m_sync.atomic_op([](squeue_sync_var_t& sync)
|
|
||||||
{
|
|
||||||
ensure(sync.count <= sq_size);
|
|
||||||
ensure(sync.position < sq_size);
|
|
||||||
ensure(!!sync.push_lock);
|
|
||||||
sync.push_lock = 0;
|
|
||||||
sync.count++;
|
|
||||||
});
|
|
||||||
|
|
||||||
m_rcv.notify_one();
|
|
||||||
m_wcv.notify_one();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool push(const T& data, const volatile bool* do_exit)
|
|
||||||
{
|
|
||||||
return push(data, [do_exit]() { return do_exit && *do_exit; });
|
|
||||||
}
|
|
||||||
|
|
||||||
bool push(const T& data)
|
|
||||||
{
|
|
||||||
return push(data, SQUEUE_NEVER_EXIT);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool try_push(const T& data)
|
|
||||||
{
|
|
||||||
return push(data, SQUEUE_ALWAYS_EXIT);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool pop(T& data, const std::function<bool()>& test_exit)
|
|
||||||
{
|
|
||||||
u32 pos = 0;
|
|
||||||
|
|
||||||
while (u32 res = m_sync.atomic_op([&pos](squeue_sync_var_t& sync) -> u32
|
|
||||||
{
|
|
||||||
ensure(sync.count <= sq_size);
|
|
||||||
ensure(sync.position < sq_size);
|
|
||||||
|
|
||||||
if (!sync.count)
|
|
||||||
{
|
|
||||||
return SQSVR_FAILED;
|
|
||||||
}
|
|
||||||
if (sync.pop_lock)
|
|
||||||
{
|
|
||||||
return SQSVR_LOCKED;
|
|
||||||
}
|
|
||||||
|
|
||||||
sync.pop_lock = 1;
|
|
||||||
pos = sync.position;
|
|
||||||
return SQSVR_OK;
|
|
||||||
}))
|
|
||||||
{
|
|
||||||
if (res == SQSVR_FAILED && (test_exit() || squeue_test_exit()))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::unique_lock<std::mutex> rcv_lock(m_rcv_mutex);
|
|
||||||
m_rcv.wait_for(rcv_lock, std::chrono::milliseconds(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
data = m_data[pos];
|
|
||||||
|
|
||||||
m_sync.atomic_op([](squeue_sync_var_t& sync)
|
|
||||||
{
|
|
||||||
ensure(sync.count <= sq_size);
|
|
||||||
ensure(sync.position < sq_size);
|
|
||||||
ensure(!!sync.pop_lock);
|
|
||||||
sync.pop_lock = 0;
|
|
||||||
sync.position++;
|
|
||||||
sync.count--;
|
|
||||||
if (sync.position == sq_size)
|
|
||||||
{
|
|
||||||
sync.position = 0;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
m_rcv.notify_one();
|
|
||||||
m_wcv.notify_one();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool pop(T& data, const volatile bool* do_exit)
|
|
||||||
{
|
|
||||||
return pop(data, [do_exit]() { return do_exit && *do_exit; });
|
|
||||||
}
|
|
||||||
|
|
||||||
bool pop(T& data)
|
|
||||||
{
|
|
||||||
return pop(data, SQUEUE_NEVER_EXIT);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool try_pop(T& data)
|
|
||||||
{
|
|
||||||
return pop(data, SQUEUE_ALWAYS_EXIT);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool peek(T& data, u32 start_pos, const std::function<bool()>& test_exit)
|
|
||||||
{
|
|
||||||
ensure(start_pos < sq_size);
|
|
||||||
u32 pos = 0;
|
|
||||||
|
|
||||||
while (u32 res = m_sync.atomic_op([&pos, start_pos](squeue_sync_var_t& sync) -> u32
|
|
||||||
{
|
|
||||||
ensure(sync.count <= sq_size);
|
|
||||||
ensure(sync.position < sq_size);
|
|
||||||
|
|
||||||
if (sync.count <= start_pos)
|
|
||||||
{
|
|
||||||
return SQSVR_FAILED;
|
|
||||||
}
|
|
||||||
if (sync.pop_lock)
|
|
||||||
{
|
|
||||||
return SQSVR_LOCKED;
|
|
||||||
}
|
|
||||||
|
|
||||||
sync.pop_lock = 1;
|
|
||||||
pos = sync.position + start_pos;
|
|
||||||
return SQSVR_OK;
|
|
||||||
}))
|
|
||||||
{
|
|
||||||
if (res == SQSVR_FAILED && (test_exit() || squeue_test_exit()))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::unique_lock<std::mutex> rcv_lock(m_rcv_mutex);
|
|
||||||
m_rcv.wait_for(rcv_lock, std::chrono::milliseconds(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
data = m_data[pos >= sq_size ? pos - sq_size : pos];
|
|
||||||
|
|
||||||
m_sync.atomic_op([](squeue_sync_var_t& sync)
|
|
||||||
{
|
|
||||||
ensure(sync.count <= sq_size);
|
|
||||||
ensure(sync.position < sq_size);
|
|
||||||
ensure(!!sync.pop_lock);
|
|
||||||
sync.pop_lock = 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
m_rcv.notify_one();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool peek(T& data, u32 start_pos, const volatile bool* do_exit)
|
|
||||||
{
|
|
||||||
return peek(data, start_pos, [do_exit]() { return do_exit && *do_exit; });
|
|
||||||
}
|
|
||||||
|
|
||||||
bool peek(T& data, u32 start_pos = 0)
|
|
||||||
{
|
|
||||||
return peek(data, start_pos, SQUEUE_NEVER_EXIT);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool try_peek(T& data, u32 start_pos = 0)
|
|
||||||
{
|
|
||||||
return peek(data, start_pos, SQUEUE_ALWAYS_EXIT);
|
|
||||||
}
|
|
||||||
|
|
||||||
class squeue_data_t
|
|
||||||
{
|
|
||||||
T* const m_data;
|
|
||||||
const u32 m_pos;
|
|
||||||
const u32 m_count;
|
|
||||||
|
|
||||||
squeue_data_t(T* data, u32 pos, u32 count)
|
|
||||||
: m_data(data)
|
|
||||||
, m_pos(pos)
|
|
||||||
, m_count(count)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
T& operator [] (u32 index)
|
|
||||||
{
|
|
||||||
ensure(index < m_count);
|
|
||||||
index += m_pos;
|
|
||||||
index = index < sq_size ? index : index - sq_size;
|
|
||||||
return m_data[index];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void process(void(*proc)(squeue_data_t data))
|
|
||||||
{
|
|
||||||
u32 pos, count;
|
|
||||||
|
|
||||||
while (m_sync.atomic_op([&pos, &count](squeue_sync_var_t& sync) -> u32
|
|
||||||
{
|
|
||||||
ensure(sync.count <= sq_size);
|
|
||||||
ensure(sync.position < sq_size);
|
|
||||||
|
|
||||||
if (sync.pop_lock || sync.push_lock)
|
|
||||||
{
|
|
||||||
return SQSVR_LOCKED;
|
|
||||||
}
|
|
||||||
|
|
||||||
pos = sync.position;
|
|
||||||
count = sync.count;
|
|
||||||
sync.pop_lock = 1;
|
|
||||||
sync.push_lock = 1;
|
|
||||||
return SQSVR_OK;
|
|
||||||
}))
|
|
||||||
{
|
|
||||||
std::unique_lock<std::mutex> rcv_lock(m_rcv_mutex);
|
|
||||||
m_rcv.wait_for(rcv_lock, std::chrono::milliseconds(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
proc(squeue_data_t(m_data, pos, count));
|
|
||||||
|
|
||||||
m_sync.atomic_op([](squeue_sync_var_t& sync)
|
|
||||||
{
|
|
||||||
ensure(sync.count <= sq_size);
|
|
||||||
ensure(sync.position < sq_size);
|
|
||||||
ensure(!!sync.pop_lock);
|
|
||||||
ensure(!!sync.push_lock);
|
|
||||||
sync.pop_lock = 0;
|
|
||||||
sync.push_lock = 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
m_wcv.notify_one();
|
|
||||||
m_rcv.notify_one();
|
|
||||||
}
|
|
||||||
|
|
||||||
void clear()
|
|
||||||
{
|
|
||||||
while (m_sync.atomic_op([](squeue_sync_var_t& sync) -> u32
|
|
||||||
{
|
|
||||||
ensure(sync.count <= sq_size);
|
|
||||||
ensure(sync.position < sq_size);
|
|
||||||
|
|
||||||
if (sync.pop_lock || sync.push_lock)
|
|
||||||
{
|
|
||||||
return SQSVR_LOCKED;
|
|
||||||
}
|
|
||||||
|
|
||||||
sync.pop_lock = 1;
|
|
||||||
sync.push_lock = 1;
|
|
||||||
return SQSVR_OK;
|
|
||||||
}))
|
|
||||||
{
|
|
||||||
std::unique_lock<std::mutex> rcv_lock(m_rcv_mutex);
|
|
||||||
m_rcv.wait_for(rcv_lock, std::chrono::milliseconds(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
m_sync.exchange({});
|
|
||||||
m_wcv.notify_one();
|
|
||||||
m_rcv.notify_one();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|||||||
Reference in New Issue
Block a user