mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-26 01:51:41 +00:00
Add braces to C++ single-line loops and conditionals (NFC) (#2973)
This makes code easier to read and more consistent between C++ and Java. Also update clang-format settings to always add a line break (even if no braces are used).
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
|
||||
namespace wpi {
|
||||
|
||||
@@ -161,7 +161,9 @@ class HttpPath {
|
||||
return equals(start, makeArrayRef(match.begin(), match.end()));
|
||||
}
|
||||
bool equals(size_t start, ArrayRef<StringRef> match) const {
|
||||
if (m_pathEnds.size() != (start + match.size())) return false;
|
||||
if (m_pathEnds.size() != (start + match.size())) {
|
||||
return false;
|
||||
}
|
||||
return startswith(start, match);
|
||||
}
|
||||
bool equals(size_t start, StringRef match) const {
|
||||
|
||||
@@ -22,7 +22,8 @@ HttpWebSocketServerConnection<Derived>::HttpWebSocketServerConnection(
|
||||
StringRef protocol = m_helper.MatchProtocol(protocols).second;
|
||||
|
||||
// Check that the upgrade is valid
|
||||
if (!IsValidWsUpgrade(protocol)) return;
|
||||
if (!IsValidWsUpgrade(protocol))
|
||||
return;
|
||||
|
||||
// Disconnect HttpServerConnection header reader
|
||||
m_dataConn.disconnect();
|
||||
|
||||
@@ -41,7 +41,9 @@ class Logger {
|
||||
|
||||
void Log(unsigned int level, const char* file, unsigned int line,
|
||||
const char* msg) {
|
||||
if (!m_func || level < m_min_level) return;
|
||||
if (!m_func || level < m_min_level) {
|
||||
return;
|
||||
}
|
||||
m_func(level, file, line, msg);
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,9 @@ class UidVectorIterator {
|
||||
UidVectorIterator() = default;
|
||||
explicit UidVectorIterator(It it, It end) : m_it(it), m_end(end) {
|
||||
// advance to first non-empty element
|
||||
while (m_it != m_end && !*m_it) ++m_it;
|
||||
while (m_it != m_end && !*m_it) {
|
||||
++m_it;
|
||||
}
|
||||
}
|
||||
|
||||
reference operator*() const noexcept { return *m_it; }
|
||||
@@ -104,7 +106,9 @@ class UidVector {
|
||||
// Removes the identified element by replacing it with a default-constructed
|
||||
// one. The element is added to the freelist for later reuse.
|
||||
void erase(size_type uid) {
|
||||
if (uid >= m_vector.size() || !m_vector[uid]) return;
|
||||
if (uid >= m_vector.size() || !m_vector[uid]) {
|
||||
return;
|
||||
}
|
||||
m_free.push_back(uid);
|
||||
m_vector[uid] = T();
|
||||
--m_active_count;
|
||||
|
||||
@@ -246,7 +246,9 @@ class WebSocket : public std::enable_shared_from_this<WebSocket> {
|
||||
*/
|
||||
void SendPing(std::function<void(uv::Error)> callback = nullptr) {
|
||||
SendPing(ArrayRef<uv::Buffer>{}, [callback](auto bufs, uv::Error err) {
|
||||
if (callback) callback(err);
|
||||
if (callback) {
|
||||
callback(err);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -269,7 +271,9 @@ class WebSocket : public std::enable_shared_from_this<WebSocket> {
|
||||
*/
|
||||
void SendPong(std::function<void(uv::Error)> callback = nullptr) {
|
||||
SendPong(ArrayRef<uv::Buffer>{}, [callback](auto bufs, uv::Error err) {
|
||||
if (callback) callback(err);
|
||||
if (callback) {
|
||||
callback(err);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -105,8 +105,9 @@ void RunWorkerThreadRequest(WorkerThreadThread<R, T...>& thr,
|
||||
WorkerThreadRequest<R, T...>& req) {
|
||||
R result = std::apply(req.work, std::move(req.params));
|
||||
if (req.afterWork) {
|
||||
if (auto async = thr.m_async.m_async.lock())
|
||||
if (auto async = thr.m_async.m_async.lock()) {
|
||||
async->Send(std::move(req.afterWork), std::move(result));
|
||||
}
|
||||
} else {
|
||||
thr.m_promises.SetValue(req.promiseId, std::move(result));
|
||||
}
|
||||
@@ -117,8 +118,9 @@ void RunWorkerThreadRequest(WorkerThreadThread<void, T...>& thr,
|
||||
WorkerThreadRequest<void, T...>& req) {
|
||||
std::apply(req.work, req.params);
|
||||
if (req.afterWork) {
|
||||
if (auto async = thr.m_async.m_async.lock())
|
||||
if (auto async = thr.m_async.m_async.lock()) {
|
||||
async->Send(std::move(req.afterWork));
|
||||
}
|
||||
} else {
|
||||
thr.m_promises.SetValue(req.promiseId);
|
||||
}
|
||||
@@ -130,14 +132,18 @@ void WorkerThreadThread<R, T...>::Main() {
|
||||
while (m_active) {
|
||||
std::unique_lock lock(m_mutex);
|
||||
m_cond.wait(lock, [&] { return !m_active || !m_requests.empty(); });
|
||||
if (!m_active) break;
|
||||
if (!m_active) {
|
||||
break;
|
||||
}
|
||||
|
||||
// don't want to hold the lock while executing the callbacks
|
||||
requests.swap(m_requests);
|
||||
lock.unlock();
|
||||
|
||||
for (auto&& req : requests) {
|
||||
if (!m_active) break; // requests may be long-running
|
||||
if (!m_active) {
|
||||
break; // requests may be long-running
|
||||
}
|
||||
RunWorkerThreadRequest(*this, req);
|
||||
}
|
||||
requests.clear();
|
||||
@@ -169,7 +175,9 @@ class WorkerThread<R(T...)> final {
|
||||
* @param loop the loop to use for running afterWork routines
|
||||
*/
|
||||
void SetLoop(uv::Loop& loop) {
|
||||
if (auto thr = m_owner.GetThread()) thr->m_async.SetLoop(loop);
|
||||
if (auto thr = m_owner.GetThread()) {
|
||||
thr->m_async.SetLoop(loop);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -186,7 +194,9 @@ class WorkerThread<R(T...)> final {
|
||||
* Subsequent calls to QueueWorkThen will no longer run afterWork.
|
||||
*/
|
||||
void UnsetLoop() {
|
||||
if (auto thr = m_owner.GetThread()) thr->m_async.UnsetLoop();
|
||||
if (auto thr = m_owner.GetThread()) {
|
||||
thr->m_async.UnsetLoop();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -197,10 +207,11 @@ class WorkerThread<R(T...)> final {
|
||||
* @return The handle (if nullptr, no handle is set)
|
||||
*/
|
||||
std::shared_ptr<uv::Handle> GetHandle() const {
|
||||
if (auto thr = m_owner.GetThread())
|
||||
if (auto thr = m_owner.GetThread()) {
|
||||
return thr->m_async.m_async.lock();
|
||||
else
|
||||
} else {
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -294,7 +294,9 @@ class future final {
|
||||
* Ignores the result of the future if it has not been retrieved.
|
||||
*/
|
||||
~future() {
|
||||
if (m_promises) m_promises->IgnoreResult(m_request);
|
||||
if (m_promises) {
|
||||
m_promises->IgnoreResult(m_request);
|
||||
}
|
||||
}
|
||||
|
||||
future& operator=(future&& oth) noexcept {
|
||||
@@ -313,10 +315,11 @@ class future final {
|
||||
* @return The value provided by the corresponding promise.set_value().
|
||||
*/
|
||||
T get() {
|
||||
if (m_promises)
|
||||
if (m_promises) {
|
||||
return m_promises->GetResult(m_request);
|
||||
else
|
||||
} else {
|
||||
return T();
|
||||
}
|
||||
}
|
||||
|
||||
template <typename R, typename F>
|
||||
@@ -355,7 +358,9 @@ class future final {
|
||||
* If the value has already been provided, returns immediately.
|
||||
*/
|
||||
void wait() const {
|
||||
if (m_promises) m_promises->WaitResult(m_request);
|
||||
if (m_promises) {
|
||||
m_promises->WaitResult(m_request);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -416,7 +421,9 @@ class future<void> final {
|
||||
* Ignores the result of the future if it has not been retrieved.
|
||||
*/
|
||||
~future() {
|
||||
if (m_promises) m_promises->IgnoreResult(m_request);
|
||||
if (m_promises) {
|
||||
m_promises->IgnoreResult(m_request);
|
||||
}
|
||||
}
|
||||
|
||||
future& operator=(future&& oth) noexcept {
|
||||
@@ -433,7 +440,9 @@ class future<void> final {
|
||||
* Can only be called once. The future will be marked invalid after the call.
|
||||
*/
|
||||
void get() {
|
||||
if (m_promises) m_promises->GetResult(m_request);
|
||||
if (m_promises) {
|
||||
m_promises->GetResult(m_request);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename R, typename F>
|
||||
@@ -471,7 +480,9 @@ class future<void> final {
|
||||
* If the value has already been provided, returns immediately.
|
||||
*/
|
||||
void wait() const {
|
||||
if (m_promises) m_promises->WaitResult(m_request);
|
||||
if (m_promises) {
|
||||
m_promises->WaitResult(m_request);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -537,7 +548,9 @@ class promise final {
|
||||
* Sets the promised value to a default-constructed T if not already set.
|
||||
*/
|
||||
~promise() {
|
||||
if (m_promises) m_promises->SetValue(m_request, T());
|
||||
if (m_promises) {
|
||||
m_promises->SetValue(m_request, T());
|
||||
}
|
||||
}
|
||||
|
||||
promise& operator=(promise&& oth) noexcept {
|
||||
@@ -572,7 +585,9 @@ class promise final {
|
||||
* @param value The value to provide to the waiting future
|
||||
*/
|
||||
void set_value(const T& value) {
|
||||
if (m_promises) m_promises->SetValue(m_request, value);
|
||||
if (m_promises) {
|
||||
m_promises->SetValue(m_request, value);
|
||||
}
|
||||
m_promises = nullptr;
|
||||
}
|
||||
|
||||
@@ -583,7 +598,9 @@ class promise final {
|
||||
* @param value The value to provide to the waiting future
|
||||
*/
|
||||
void set_value(T&& value) {
|
||||
if (m_promises) m_promises->SetValue(m_request, std::move(value));
|
||||
if (m_promises) {
|
||||
m_promises->SetValue(m_request, std::move(value));
|
||||
}
|
||||
m_promises = nullptr;
|
||||
}
|
||||
|
||||
@@ -622,7 +639,9 @@ class promise<void> final {
|
||||
* Sets the promised value if not already set.
|
||||
*/
|
||||
~promise() {
|
||||
if (m_promises) m_promises->SetValue(m_request);
|
||||
if (m_promises) {
|
||||
m_promises->SetValue(m_request);
|
||||
}
|
||||
}
|
||||
|
||||
promise& operator=(promise&& oth) noexcept {
|
||||
@@ -657,7 +676,9 @@ class promise<void> final {
|
||||
* Only effective once (subsequent calls will be ignored).
|
||||
*/
|
||||
void set_value() {
|
||||
if (m_promises) m_promises->SetValue(m_request);
|
||||
if (m_promises) {
|
||||
m_promises->SetValue(m_request);
|
||||
}
|
||||
m_promises = nullptr;
|
||||
}
|
||||
|
||||
@@ -707,7 +728,9 @@ inline promise<T> PromiseFactory<T>::CreatePromise(uint64_t request) {
|
||||
template <typename T>
|
||||
void PromiseFactory<T>::SetValue(uint64_t request, const T& value) {
|
||||
std::unique_lock lock(GetResultMutex());
|
||||
if (!EraseRequest(request)) return;
|
||||
if (!EraseRequest(request)) {
|
||||
return;
|
||||
}
|
||||
auto it = std::find_if(m_thens.begin(), m_thens.end(),
|
||||
[=](const auto& x) { return x.request == request; });
|
||||
if (it != m_thens.end()) {
|
||||
@@ -726,7 +749,9 @@ void PromiseFactory<T>::SetValue(uint64_t request, const T& value) {
|
||||
template <typename T>
|
||||
void PromiseFactory<T>::SetValue(uint64_t request, T&& value) {
|
||||
std::unique_lock lock(GetResultMutex());
|
||||
if (!EraseRequest(request)) return;
|
||||
if (!EraseRequest(request)) {
|
||||
return;
|
||||
}
|
||||
auto it = std::find_if(m_thens.begin(), m_thens.end(),
|
||||
[=](const auto& x) { return x.request == request; });
|
||||
if (it != m_thens.end()) {
|
||||
@@ -793,7 +818,9 @@ void PromiseFactory<T>::WaitResult(uint64_t request) {
|
||||
// Did we get a response to *our* request?
|
||||
auto it = std::find_if(m_results.begin(), m_results.end(),
|
||||
[=](const auto& r) { return r.first == request; });
|
||||
if (it != m_results.end()) return;
|
||||
if (it != m_results.end()) {
|
||||
return;
|
||||
}
|
||||
// No, keep waiting for a response
|
||||
Wait(lock);
|
||||
}
|
||||
@@ -810,10 +837,16 @@ bool PromiseFactory<T>::WaitResultUntil(
|
||||
// Did we get a response to *our* request?
|
||||
auto it = std::find_if(m_results.begin(), m_results.end(),
|
||||
[=](const auto& r) { return r.first == request; });
|
||||
if (it != m_results.end()) return true;
|
||||
if (timeout) break;
|
||||
if (it != m_results.end()) {
|
||||
return true;
|
||||
}
|
||||
if (timeout) {
|
||||
break;
|
||||
}
|
||||
// No, keep waiting for a response
|
||||
if (!WaitUntil(lock, timeout_time)) timeout = true;
|
||||
if (!WaitUntil(lock, timeout_time)) {
|
||||
timeout = true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -842,10 +875,16 @@ bool PromiseFactory<void>::WaitResultUntil(
|
||||
// Did we get a response to *our* request?
|
||||
auto it = std::find_if(m_results.begin(), m_results.end(),
|
||||
[=](const auto& r) { return r == request; });
|
||||
if (it != m_results.end()) return true;
|
||||
if (timeout) break;
|
||||
if (it != m_results.end()) {
|
||||
return true;
|
||||
}
|
||||
if (timeout) {
|
||||
break;
|
||||
}
|
||||
// No, keep waiting for a response
|
||||
if (!WaitUntil(lock, timeout_time)) timeout = true;
|
||||
if (!WaitUntil(lock, timeout_time)) {
|
||||
timeout = true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -44,13 +44,17 @@ class JClass {
|
||||
|
||||
JClass(JNIEnv* env, const char* name) {
|
||||
jclass local = env->FindClass(name);
|
||||
if (!local) return;
|
||||
if (!local) {
|
||||
return;
|
||||
}
|
||||
m_cls = static_cast<jclass>(env->NewGlobalRef(local));
|
||||
env->DeleteLocalRef(local);
|
||||
}
|
||||
|
||||
void free(JNIEnv* env) {
|
||||
if (m_cls) env->DeleteGlobalRef(m_cls);
|
||||
if (m_cls) {
|
||||
env->DeleteGlobalRef(m_cls);
|
||||
}
|
||||
m_cls = nullptr;
|
||||
}
|
||||
|
||||
@@ -77,7 +81,9 @@ class JGlobal {
|
||||
}
|
||||
|
||||
void free(JNIEnv* env) {
|
||||
if (m_cls) env->DeleteGlobalRef(m_cls);
|
||||
if (m_cls) {
|
||||
env->DeleteGlobalRef(m_cls);
|
||||
}
|
||||
m_cls = nullptr;
|
||||
}
|
||||
|
||||
@@ -107,7 +113,9 @@ class JLocal {
|
||||
return *this;
|
||||
}
|
||||
~JLocal() {
|
||||
if (m_obj) m_env->DeleteLocalRef(m_obj);
|
||||
if (m_obj) {
|
||||
m_env->DeleteLocalRef(m_obj);
|
||||
}
|
||||
}
|
||||
operator T() { return m_obj; }
|
||||
T obj() { return m_obj; }
|
||||
@@ -166,7 +174,9 @@ class JArrayRefInner<C, jbyte> {
|
||||
|
||||
StringRef str() const {
|
||||
auto arr = static_cast<const C*>(this)->array();
|
||||
if (arr.empty()) return StringRef{};
|
||||
if (arr.empty()) {
|
||||
return {};
|
||||
}
|
||||
return StringRef{reinterpret_cast<const char*>(arr.data()), arr.size()};
|
||||
}
|
||||
};
|
||||
@@ -180,7 +190,9 @@ class JArrayRefBase : public JArrayRefInner<JArrayRefBase<T>, T> {
|
||||
operator ArrayRef<T>() const { return array(); }
|
||||
|
||||
ArrayRef<T> array() const {
|
||||
if (!this->m_elements) return ArrayRef<T>{};
|
||||
if (!this->m_elements) {
|
||||
return {};
|
||||
}
|
||||
return ArrayRef<T>{this->m_elements, this->m_size};
|
||||
}
|
||||
|
||||
@@ -242,30 +254,34 @@ class JArrayRefBase : public JArrayRefInner<JArrayRefBase<T>, T> {
|
||||
env, \
|
||||
static_cast<T*>(bb ? env->GetDirectBufferAddress(bb) : nullptr), \
|
||||
len) { \
|
||||
if (!bb) \
|
||||
if (!bb) { \
|
||||
errs() << "JArrayRef was passed a null pointer at \n" \
|
||||
<< GetJavaStackTrace(env); \
|
||||
} \
|
||||
} \
|
||||
J##F##ArrayRef(JNIEnv* env, T##Array jarr, int len) \
|
||||
: detail::JArrayRefBase<T>(env, jarr, len) { \
|
||||
if (jarr) \
|
||||
if (jarr) { \
|
||||
m_elements = env->Get##F##ArrayElements(jarr, nullptr); \
|
||||
else \
|
||||
} else { \
|
||||
errs() << "JArrayRef was passed a null pointer at \n" \
|
||||
<< GetJavaStackTrace(env); \
|
||||
} \
|
||||
} \
|
||||
J##F##ArrayRef(JNIEnv* env, T##Array jarr) \
|
||||
: detail::JArrayRefBase<T>(env, jarr) { \
|
||||
if (jarr) \
|
||||
if (jarr) { \
|
||||
m_elements = env->Get##F##ArrayElements(jarr, nullptr); \
|
||||
else \
|
||||
} else { \
|
||||
errs() << "JArrayRef was passed a null pointer at \n" \
|
||||
<< GetJavaStackTrace(env); \
|
||||
} \
|
||||
} \
|
||||
~J##F##ArrayRef() { \
|
||||
if (m_jarr && m_elements) \
|
||||
if (m_jarr && m_elements) { \
|
||||
m_env->Release##F##ArrayElements(static_cast<T##Array>(m_jarr), \
|
||||
m_elements, JNI_ABORT); \
|
||||
} \
|
||||
} \
|
||||
}; \
|
||||
\
|
||||
@@ -273,25 +289,28 @@ class JArrayRefBase : public JArrayRefInner<JArrayRefBase<T>, T> {
|
||||
public: \
|
||||
CriticalJ##F##ArrayRef(JNIEnv* env, T##Array jarr, int len) \
|
||||
: detail::JArrayRefBase<T>(env, jarr, len) { \
|
||||
if (jarr) \
|
||||
if (jarr) { \
|
||||
m_elements = \
|
||||
static_cast<T*>(env->GetPrimitiveArrayCritical(jarr, nullptr)); \
|
||||
else \
|
||||
} else { \
|
||||
errs() << "JArrayRef was passed a null pointer at \n" \
|
||||
<< GetJavaStackTrace(env); \
|
||||
} \
|
||||
} \
|
||||
CriticalJ##F##ArrayRef(JNIEnv* env, T##Array jarr) \
|
||||
: detail::JArrayRefBase<T>(env, jarr) { \
|
||||
if (jarr) \
|
||||
if (jarr) { \
|
||||
m_elements = \
|
||||
static_cast<T*>(env->GetPrimitiveArrayCritical(jarr, nullptr)); \
|
||||
else \
|
||||
} else { \
|
||||
errs() << "JArrayRef was passed a null pointer at \n" \
|
||||
<< GetJavaStackTrace(env); \
|
||||
} \
|
||||
} \
|
||||
~CriticalJ##F##ArrayRef() { \
|
||||
if (m_jarr && m_elements) \
|
||||
if (m_jarr && m_elements) { \
|
||||
m_env->ReleasePrimitiveArrayCritical(m_jarr, m_elements, JNI_ABORT); \
|
||||
} \
|
||||
} \
|
||||
};
|
||||
|
||||
@@ -327,12 +346,17 @@ template <typename T,
|
||||
struct ConvertIntArray {
|
||||
static jintArray ToJava(JNIEnv* env, ArrayRef<T> arr) {
|
||||
jintArray jarr = env->NewIntArray(arr.size());
|
||||
if (!jarr) return nullptr;
|
||||
if (!jarr) {
|
||||
return nullptr;
|
||||
}
|
||||
jint* elements =
|
||||
static_cast<jint*>(env->GetPrimitiveArrayCritical(jarr, nullptr));
|
||||
if (!elements) return nullptr;
|
||||
for (size_t i = 0; i < arr.size(); ++i)
|
||||
if (!elements) {
|
||||
return nullptr;
|
||||
}
|
||||
for (size_t i = 0; i < arr.size(); ++i) {
|
||||
elements[i] = static_cast<jint>(arr[i]);
|
||||
}
|
||||
env->ReleasePrimitiveArrayCritical(jarr, elements, 0);
|
||||
return jarr;
|
||||
}
|
||||
@@ -343,7 +367,9 @@ template <typename T>
|
||||
struct ConvertIntArray<T, true> {
|
||||
static jintArray ToJava(JNIEnv* env, ArrayRef<T> arr) {
|
||||
jintArray jarr = env->NewIntArray(arr.size());
|
||||
if (!jarr) return nullptr;
|
||||
if (!jarr) {
|
||||
return nullptr;
|
||||
}
|
||||
env->SetIntArrayRegion(jarr, 0, arr.size(),
|
||||
reinterpret_cast<const jint*>(arr.data()));
|
||||
return jarr;
|
||||
@@ -375,7 +401,9 @@ inline jintArray MakeJIntArray(JNIEnv* env, const std::vector<T>& arr) {
|
||||
// Convert a StringRef into a jbyteArray.
|
||||
inline jbyteArray MakeJByteArray(JNIEnv* env, StringRef str) {
|
||||
jbyteArray jarr = env->NewByteArray(str.size());
|
||||
if (!jarr) return nullptr;
|
||||
if (!jarr) {
|
||||
return nullptr;
|
||||
}
|
||||
env->SetByteArrayRegion(jarr, 0, str.size(),
|
||||
reinterpret_cast<const jbyte*>(str.data()));
|
||||
return jarr;
|
||||
@@ -384,12 +412,17 @@ inline jbyteArray MakeJByteArray(JNIEnv* env, StringRef str) {
|
||||
// Convert an array of integers into a jbooleanArray.
|
||||
inline jbooleanArray MakeJBooleanArray(JNIEnv* env, ArrayRef<int> arr) {
|
||||
jbooleanArray jarr = env->NewBooleanArray(arr.size());
|
||||
if (!jarr) return nullptr;
|
||||
if (!jarr) {
|
||||
return nullptr;
|
||||
}
|
||||
jboolean* elements =
|
||||
static_cast<jboolean*>(env->GetPrimitiveArrayCritical(jarr, nullptr));
|
||||
if (!elements) return nullptr;
|
||||
for (size_t i = 0; i < arr.size(); ++i)
|
||||
if (!elements) {
|
||||
return nullptr;
|
||||
}
|
||||
for (size_t i = 0; i < arr.size(); ++i) {
|
||||
elements[i] = arr[i] ? JNI_TRUE : JNI_FALSE;
|
||||
}
|
||||
env->ReleasePrimitiveArrayCritical(jarr, elements, 0);
|
||||
return jarr;
|
||||
}
|
||||
@@ -397,12 +430,17 @@ inline jbooleanArray MakeJBooleanArray(JNIEnv* env, ArrayRef<int> arr) {
|
||||
// Convert an array of booleans into a jbooleanArray.
|
||||
inline jbooleanArray MakeJBooleanArray(JNIEnv* env, ArrayRef<bool> arr) {
|
||||
jbooleanArray jarr = env->NewBooleanArray(arr.size());
|
||||
if (!jarr) return nullptr;
|
||||
if (!jarr) {
|
||||
return nullptr;
|
||||
}
|
||||
jboolean* elements =
|
||||
static_cast<jboolean*>(env->GetPrimitiveArrayCritical(jarr, nullptr));
|
||||
if (!elements) return nullptr;
|
||||
for (size_t i = 0; i < arr.size(); ++i)
|
||||
if (!elements) {
|
||||
return nullptr;
|
||||
}
|
||||
for (size_t i = 0; i < arr.size(); ++i) {
|
||||
elements[i] = arr[i] ? JNI_TRUE : JNI_FALSE;
|
||||
}
|
||||
env->ReleasePrimitiveArrayCritical(jarr, elements, 0);
|
||||
return jarr;
|
||||
}
|
||||
@@ -412,7 +450,9 @@ inline jbooleanArray MakeJBooleanArray(JNIEnv* env, ArrayRef<bool> arr) {
|
||||
#define WPI_JNI_MAKEJARRAY(T, F) \
|
||||
inline T##Array MakeJ##F##Array(JNIEnv* env, ArrayRef<T> arr) { \
|
||||
T##Array jarr = env->New##F##Array(arr.size()); \
|
||||
if (!jarr) return nullptr; \
|
||||
if (!jarr) { \
|
||||
return nullptr; \
|
||||
} \
|
||||
env->Set##F##ArrayRegion(jarr, 0, arr.size(), arr.data()); \
|
||||
return jarr; \
|
||||
}
|
||||
@@ -429,9 +469,13 @@ WPI_JNI_MAKEJARRAY(jdouble, Double)
|
||||
// Convert an array of std::string into a jarray of jstring.
|
||||
inline jobjectArray MakeJStringArray(JNIEnv* env, ArrayRef<std::string> arr) {
|
||||
static JClass stringCls{env, "java/lang/String"};
|
||||
if (!stringCls) return nullptr;
|
||||
if (!stringCls) {
|
||||
return nullptr;
|
||||
}
|
||||
jobjectArray jarr = env->NewObjectArray(arr.size(), stringCls, nullptr);
|
||||
if (!jarr) return nullptr;
|
||||
if (!jarr) {
|
||||
return nullptr;
|
||||
}
|
||||
for (size_t i = 0; i < arr.size(); ++i) {
|
||||
JLocal<jstring> elem{env, MakeJString(env, arr[i])};
|
||||
env->SetObjectArrayElement(jarr, i, elem.obj());
|
||||
@@ -477,9 +521,13 @@ class JCallbackManager : public SafeThreadOwner<JCallbackThread<T>> {
|
||||
template <typename T>
|
||||
void JCallbackManager<T>::SetFunc(JNIEnv* env, jobject func, jmethodID mid) {
|
||||
auto thr = this->GetThread();
|
||||
if (!thr) return;
|
||||
if (!thr) {
|
||||
return;
|
||||
}
|
||||
// free global reference
|
||||
if (thr->m_func) env->DeleteGlobalRef(thr->m_func);
|
||||
if (thr->m_func) {
|
||||
env->DeleteGlobalRef(thr->m_func);
|
||||
}
|
||||
// create global reference
|
||||
thr->m_func = env->NewGlobalRef(func);
|
||||
thr->m_mid = mid;
|
||||
@@ -489,7 +537,9 @@ template <typename T>
|
||||
template <typename... Args>
|
||||
void JCallbackManager<T>::Send(Args&&... args) {
|
||||
auto thr = this->GetThread();
|
||||
if (!thr) return;
|
||||
if (!thr) {
|
||||
return;
|
||||
}
|
||||
thr->m_queue.emplace(std::forward<Args>(args)...);
|
||||
thr->m_cond.notify_one();
|
||||
}
|
||||
@@ -503,14 +553,20 @@ void JCallbackThread<T>::Main() {
|
||||
args.group = nullptr;
|
||||
jint rs = T::GetJVM()->AttachCurrentThreadAsDaemon(
|
||||
reinterpret_cast<void**>(&env), &args);
|
||||
if (rs != JNI_OK) return;
|
||||
if (rs != JNI_OK) {
|
||||
return;
|
||||
}
|
||||
|
||||
std::unique_lock lock(m_mutex);
|
||||
while (m_active) {
|
||||
m_cond.wait(lock, [&] { return !(m_active && m_queue.empty()); });
|
||||
if (!m_active) break;
|
||||
if (!m_active) {
|
||||
break;
|
||||
}
|
||||
while (!m_queue.empty()) {
|
||||
if (!m_active) break;
|
||||
if (!m_active) {
|
||||
break;
|
||||
}
|
||||
auto item = std::move(m_queue.front());
|
||||
m_queue.pop();
|
||||
auto func = m_func;
|
||||
@@ -526,7 +582,9 @@ void JCallbackThread<T>::Main() {
|
||||
}
|
||||
|
||||
JavaVM* jvm = T::GetJVM();
|
||||
if (jvm) jvm->DetachCurrentThread();
|
||||
if (jvm) {
|
||||
jvm->DetachCurrentThread();
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
@@ -542,37 +600,46 @@ inline std::string GetJavaStackTrace(JNIEnv* env, std::string* func,
|
||||
StringRef excludeFuncPrefix) {
|
||||
// create a throwable
|
||||
static JClass throwableCls(env, "java/lang/Throwable");
|
||||
if (!throwableCls) return "";
|
||||
if (!throwableCls) {
|
||||
return "";
|
||||
}
|
||||
static jmethodID constructorId = nullptr;
|
||||
if (!constructorId)
|
||||
if (!constructorId) {
|
||||
constructorId = env->GetMethodID(throwableCls, "<init>", "()V");
|
||||
}
|
||||
JLocal<jobject> throwable(env, env->NewObject(throwableCls, constructorId));
|
||||
|
||||
// retrieve information from the exception.
|
||||
// get method id
|
||||
// getStackTrace returns an array of StackTraceElement
|
||||
static jmethodID getStackTraceId = nullptr;
|
||||
if (!getStackTraceId)
|
||||
if (!getStackTraceId) {
|
||||
getStackTraceId = env->GetMethodID(throwableCls, "getStackTrace",
|
||||
"()[Ljava/lang/StackTraceElement;");
|
||||
}
|
||||
|
||||
// call getStackTrace
|
||||
JLocal<jobjectArray> stackTrace(
|
||||
env, static_cast<jobjectArray>(
|
||||
env->CallObjectMethod(throwable, getStackTraceId)));
|
||||
|
||||
if (!stackTrace) return "";
|
||||
if (!stackTrace) {
|
||||
return "";
|
||||
}
|
||||
|
||||
// get length of the array
|
||||
jsize stackTraceLength = env->GetArrayLength(stackTrace);
|
||||
|
||||
// get toString methodId of StackTraceElement class
|
||||
static JClass stackTraceElementCls(env, "java/lang/StackTraceElement");
|
||||
if (!stackTraceElementCls) return "";
|
||||
if (!stackTraceElementCls) {
|
||||
return "";
|
||||
}
|
||||
static jmethodID toStringId = nullptr;
|
||||
if (!toStringId)
|
||||
if (!toStringId) {
|
||||
toStringId = env->GetMethodID(stackTraceElementCls, "toString",
|
||||
"()Ljava/lang/String;");
|
||||
}
|
||||
|
||||
bool haveLoc = false;
|
||||
std::string buf;
|
||||
@@ -587,7 +654,9 @@ inline std::string GetJavaStackTrace(JNIEnv* env, std::string* func,
|
||||
env, static_cast<jstring>(
|
||||
env->CallObjectMethod(curStackTraceElement, toStringId)));
|
||||
|
||||
if (!stackElementString) return "";
|
||||
if (!stackElementString) {
|
||||
return "";
|
||||
}
|
||||
|
||||
// add a line to res
|
||||
JStringRef elem(env, stackElementString);
|
||||
@@ -617,9 +686,10 @@ class JException : public JClass {
|
||||
public:
|
||||
JException() = default;
|
||||
JException(JNIEnv* env, const char* name) : JClass(env, name) {
|
||||
if (m_cls)
|
||||
if (m_cls) {
|
||||
m_constructor =
|
||||
env->GetMethodID(m_cls, "<init>", "(Ljava/lang/String;)V");
|
||||
}
|
||||
}
|
||||
|
||||
void Throw(JNIEnv* env, jstring msg) {
|
||||
|
||||
@@ -47,7 +47,9 @@ class raw_istream {
|
||||
|
||||
size_t readsome(void* data, size_t len) {
|
||||
size_t readlen = (std::min)(in_avail(), len);
|
||||
if (readlen == 0) return 0;
|
||||
if (readlen == 0) {
|
||||
return 0;
|
||||
}
|
||||
read_impl(data, readlen);
|
||||
return m_read_count;
|
||||
}
|
||||
|
||||
@@ -27,8 +27,11 @@ class spinlock {
|
||||
|
||||
LLVM_ATTRIBUTE_ALWAYS_INLINE
|
||||
void lock() {
|
||||
for (unsigned int i = 1; !try_lock(); ++i)
|
||||
if ((i & 0xff) == 0) std::this_thread::yield();
|
||||
for (unsigned int i = 1; !try_lock(); ++i) {
|
||||
if ((i & 0xff) == 0) {
|
||||
std::this_thread::yield();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LLVM_ATTRIBUTE_ALWAYS_INLINE
|
||||
@@ -55,8 +58,9 @@ class recursive_spinlock1 {
|
||||
std::memory_order_release);
|
||||
} else {
|
||||
if (owner_thread_id.load(std::memory_order_acquire) !=
|
||||
std::this_thread::get_id())
|
||||
std::this_thread::get_id()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
++recursive_counter;
|
||||
return true;
|
||||
@@ -64,8 +68,11 @@ class recursive_spinlock1 {
|
||||
|
||||
LLVM_ATTRIBUTE_ALWAYS_INLINE
|
||||
void lock() {
|
||||
for (unsigned int i = 1; !try_lock(); ++i)
|
||||
if ((i & 0xffff) == 0) std::this_thread::yield();
|
||||
for (unsigned int i = 1; !try_lock(); ++i) {
|
||||
if ((i & 0xffff) == 0) {
|
||||
std::this_thread::yield();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LLVM_ATTRIBUTE_ALWAYS_INLINE
|
||||
@@ -97,7 +104,9 @@ class recursive_spinlock2 {
|
||||
auto us = std::this_thread::get_id();
|
||||
if (!owner_thread_id.compare_exchange_weak(owner, us,
|
||||
std::memory_order_acquire)) {
|
||||
if (owner != us) return false;
|
||||
if (owner != us) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
++recursive_counter;
|
||||
return true;
|
||||
@@ -105,8 +114,11 @@ class recursive_spinlock2 {
|
||||
|
||||
LLVM_ATTRIBUTE_ALWAYS_INLINE
|
||||
void lock() {
|
||||
for (unsigned int i = 1; !try_lock(); ++i)
|
||||
if ((i & 0xffff) == 0) std::this_thread::yield();
|
||||
for (unsigned int i = 1; !try_lock(); ++i) {
|
||||
if ((i & 0xffff) == 0) {
|
||||
std::this_thread::yield();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LLVM_ATTRIBUTE_ALWAYS_INLINE
|
||||
@@ -115,8 +127,9 @@ class recursive_spinlock2 {
|
||||
std::this_thread::get_id());
|
||||
assert(recursive_counter > 0);
|
||||
|
||||
if (--recursive_counter == 0)
|
||||
if (--recursive_counter == 0) {
|
||||
owner_thread_id.store(std::thread::id{}, std::memory_order_release);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -40,10 +40,11 @@ class Async final : public HandleImpl<Async<T...>, uv_async_t> {
|
||||
Async(const std::shared_ptr<Loop>& loop, const private_init&)
|
||||
: m_loop{loop} {}
|
||||
~Async() noexcept override {
|
||||
if (auto loop = m_loop.lock())
|
||||
if (auto loop = m_loop.lock()) {
|
||||
this->Close();
|
||||
else
|
||||
} else {
|
||||
this->ForceClosed();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -66,7 +67,9 @@ class Async final : public HandleImpl<Async<T...>, uv_async_t> {
|
||||
uv_async_init(loop->GetRaw(), h->GetRaw(), [](uv_async_t* handle) {
|
||||
auto& h = *static_cast<Async*>(handle->data);
|
||||
std::scoped_lock lock(h.m_mutex);
|
||||
for (auto&& v : h.m_data) std::apply(h.wakeup, v);
|
||||
for (auto&& v : h.m_data) {
|
||||
std::apply(h.wakeup, v);
|
||||
}
|
||||
h.m_data.clear();
|
||||
});
|
||||
if (err < 0) {
|
||||
@@ -96,7 +99,9 @@ class Async final : public HandleImpl<Async<T...>, uv_async_t> {
|
||||
std::scoped_lock lock(m_mutex);
|
||||
m_data.emplace_back(std::forward_as_tuple(std::forward<U>(u)...));
|
||||
}
|
||||
if (loop) this->Invoke(&uv_async_send, this->GetRaw());
|
||||
if (loop) {
|
||||
this->Invoke(&uv_async_send, this->GetRaw());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -146,7 +151,9 @@ class Async<> final : public HandleImpl<Async<>, uv_async_t> {
|
||||
* An async event will be emitted on the loop thread.
|
||||
*/
|
||||
void Send() {
|
||||
if (auto loop = m_loop.lock()) Invoke(&uv_async_send, GetRaw());
|
||||
if (auto loop = m_loop.lock()) {
|
||||
Invoke(&uv_async_send, GetRaw());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -41,10 +41,11 @@ class AsyncFunction<R(T...)> final
|
||||
std::function<void(promise<R>, T...)> func, const private_init&)
|
||||
: wakeup{func}, m_loop{loop} {}
|
||||
~AsyncFunction() noexcept override {
|
||||
if (auto loop = m_loop.lock())
|
||||
if (auto loop = m_loop.lock()) {
|
||||
this->Close();
|
||||
else
|
||||
} else {
|
||||
this->ForceClosed();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -86,10 +87,11 @@ class AsyncFunction<R(T...)> final
|
||||
// waiting for it
|
||||
for (auto&& v : h.m_params) {
|
||||
auto p = h.m_promises.CreatePromise(v.first);
|
||||
if (h.wakeup)
|
||||
if (h.wakeup) {
|
||||
std::apply(h.wakeup,
|
||||
std::tuple_cat(std::make_tuple(std::move(p)),
|
||||
std::move(v.second)));
|
||||
}
|
||||
}
|
||||
h.m_params.clear();
|
||||
// wake up any threads that might be waiting for the result
|
||||
@@ -136,7 +138,9 @@ class AsyncFunction<R(T...)> final
|
||||
}
|
||||
|
||||
// signal the loop
|
||||
if (loop) this->Invoke(&uv_async_send, this->GetRaw());
|
||||
if (loop) {
|
||||
this->Invoke(&uv_async_send, this->GetRaw());
|
||||
}
|
||||
|
||||
// return future
|
||||
return m_promises.CreateFuture(req);
|
||||
|
||||
@@ -113,7 +113,9 @@ class SimpleBufferPool {
|
||||
* Allocate a buffer.
|
||||
*/
|
||||
Buffer Allocate() {
|
||||
if (m_pool.empty()) return Buffer::Allocate(m_size);
|
||||
if (m_pool.empty()) {
|
||||
return Buffer::Allocate(m_size);
|
||||
}
|
||||
auto buf = m_pool.back();
|
||||
m_pool.pop_back();
|
||||
buf.len = m_size;
|
||||
@@ -131,14 +133,18 @@ class SimpleBufferPool {
|
||||
* allocated with the same size as the buffer pool allocation size.
|
||||
*/
|
||||
void Release(MutableArrayRef<Buffer> bufs) {
|
||||
for (auto& buf : bufs) m_pool.emplace_back(buf.Move());
|
||||
for (auto& buf : bufs) {
|
||||
m_pool.emplace_back(buf.Move());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear the pool, releasing all buffers.
|
||||
*/
|
||||
void Clear() {
|
||||
for (auto& buf : m_pool) buf.Deallocate();
|
||||
for (auto& buf : m_pool) {
|
||||
buf.Deallocate();
|
||||
}
|
||||
m_pool.clear();
|
||||
}
|
||||
|
||||
|
||||
@@ -249,7 +249,9 @@ class Handle : public std::enable_shared_from_this<Handle> {
|
||||
template <typename F, typename... Args>
|
||||
bool Invoke(F&& f, Args&&... args) const {
|
||||
auto err = std::forward<F>(f)(std::forward<Args>(args)...);
|
||||
if (err < 0) ReportError(err);
|
||||
if (err < 0) {
|
||||
ReportError(err);
|
||||
}
|
||||
return err == 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -59,7 +59,9 @@ class Tty final : public StreamImpl<Tty, uv_tty_t> {
|
||||
*/
|
||||
void SetMode(uv_tty_mode_t mode) {
|
||||
int err = uv_tty_set_mode(GetRaw(), mode);
|
||||
if (err < 0) ReportError(err);
|
||||
if (err < 0) {
|
||||
ReportError(err);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -63,10 +63,12 @@ int AddrToName(const sockaddr_in6& addr, T* ip, unsigned int* port) {
|
||||
*/
|
||||
template <typename T>
|
||||
int AddrToName(const sockaddr_storage& addr, T* ip, unsigned int* port) {
|
||||
if (addr.ss_family == AF_INET)
|
||||
if (addr.ss_family == AF_INET) {
|
||||
return AddrToName(reinterpret_cast<const sockaddr_in&>(addr), ip, port);
|
||||
if (addr.ss_family == AF_INET6)
|
||||
}
|
||||
if (addr.ss_family == AF_INET6) {
|
||||
return AddrToName(reinterpret_cast<const sockaddr_in6&>(addr), ip, port);
|
||||
}
|
||||
char name[1];
|
||||
ip->assign(name, name);
|
||||
return -1;
|
||||
@@ -82,10 +84,11 @@ template <typename T>
|
||||
int AddrToName(const in_addr& addr, T* ip) {
|
||||
char name[128];
|
||||
int err = uv_inet_ntop(AF_INET, &addr, name, 128);
|
||||
if (err == 0)
|
||||
if (err == 0) {
|
||||
ip->assign(name, name + std::strlen(name));
|
||||
else
|
||||
} else {
|
||||
ip->assign(name, name);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -99,10 +102,11 @@ template <typename T>
|
||||
int AddrToName(const in6_addr& addr, T* ip) {
|
||||
char name[128];
|
||||
int err = uv_inet_ntop(AF_INET6, &addr, name, 128);
|
||||
if (err == 0)
|
||||
if (err == 0) {
|
||||
ip->assign(name, name + std::strlen(name));
|
||||
else
|
||||
} else {
|
||||
ip->assign(name, name);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user