mirror of
https://github.com/Lorenzooone/cc3dsfs.git
synced 2026-08-12 03:45:50 -05:00
Initial Commit
This commit is contained in:
73
source/utils.cpp
Executable file
73
source/utils.cpp
Executable file
@@ -0,0 +1,73 @@
|
||||
#include "utils.hpp"
|
||||
|
||||
#include <mutex>
|
||||
#include <condition_variable>
|
||||
#include <chrono>
|
||||
#include <queue>
|
||||
|
||||
bool is_big_endian(void) {
|
||||
union {
|
||||
uint32_t i;
|
||||
char c[4];
|
||||
} value = {0x01020304};
|
||||
|
||||
return value.c[0] == 1;
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
|
||||
ConsumerMutex::ConsumerMutex() {
|
||||
count = 0;
|
||||
}
|
||||
|
||||
void ConsumerMutex::lock() {
|
||||
access_mutex.lock();
|
||||
bool success = false;
|
||||
while(!success) {
|
||||
if(count) {
|
||||
count--;
|
||||
success = true;
|
||||
}
|
||||
else {
|
||||
condition.wait(access_mutex);
|
||||
}
|
||||
}
|
||||
access_mutex.unlock();
|
||||
}
|
||||
|
||||
bool ConsumerMutex::timed_lock() {
|
||||
access_mutex.lock();
|
||||
bool success = false;
|
||||
while(!success) {
|
||||
if(count) {
|
||||
count--;
|
||||
success = true;
|
||||
}
|
||||
else {
|
||||
auto result = condition.wait_for(access_mutex, max_timed_wait);
|
||||
if((result == std::cv_status::timeout) && (!count))
|
||||
break;
|
||||
}
|
||||
}
|
||||
access_mutex.unlock();
|
||||
return success;
|
||||
}
|
||||
|
||||
bool ConsumerMutex::try_lock() {
|
||||
access_mutex.lock();
|
||||
bool success = false;
|
||||
if(count) {
|
||||
count--;
|
||||
success = true;
|
||||
}
|
||||
access_mutex.unlock();
|
||||
return success;
|
||||
}
|
||||
|
||||
void ConsumerMutex::unlock() {
|
||||
access_mutex.lock();
|
||||
// Enforce 1 max
|
||||
count = 1;
|
||||
condition.notify_one();
|
||||
access_mutex.unlock();
|
||||
}
|
||||
Reference in New Issue
Block a user