diff --git a/dart_filament/native/include/filament/utils/linux/Condition.h b/dart_filament/native/include/filament/utils/linux/Condition.h new file mode 100644 index 00000000..c2ff21f8 --- /dev/null +++ b/dart_filament/native/include/filament/utils/linux/Condition.h @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_UTILS_LINUX_CONDITION_H +#define TNT_UTILS_LINUX_CONDITION_H + +#include +#include +#include // for cv_status +#include +#include // for unique_lock + +#include + +#include + +namespace utils { + +/* + * A very simple condition variable class that can be used as an (almost) drop-in replacement + * for std::condition_variable (doesn't have the timed wait() though). + * It is very low overhead as most of it is inlined. + */ + +class Condition { +public: + Condition() noexcept = default; + Condition(const Condition&) = delete; + Condition& operator=(const Condition&) = delete; + + void notify_all() noexcept { + pulse(std::numeric_limits::max()); + } + + void notify_one() noexcept { + pulse(1); + } + + void notify_n(size_t n) noexcept { + if (n > 0) pulse(n); + } + + void wait(std::unique_lock& lock) noexcept { + wait_until(lock.mutex(), false, nullptr); + } + + template + void wait(std::unique_lock& lock, P predicate) { + while (!predicate()) { + wait(lock); + } + } + + template + std::cv_status wait_until(std::unique_lock& lock, + const std::chrono::time_point& timeout_time) noexcept { + // convert to nanoseconds + uint64_t ns = std::chrono::duration(timeout_time.time_since_epoch()).count(); + using sec_t = decltype(timespec::tv_sec); + using nsec_t = decltype(timespec::tv_nsec); + timespec ts{ sec_t(ns / 1000000000), nsec_t(ns % 1000000000) }; + return wait_until(lock.mutex(), false, &ts); + } + + template + std::cv_status wait_until(std::unique_lock& lock, + const std::chrono::time_point& timeout_time) noexcept { + // convert to nanoseconds + uint64_t ns = std::chrono::duration(timeout_time.time_since_epoch()).count(); + using sec_t = decltype(timespec::tv_sec); + using nsec_t = decltype(timespec::tv_nsec); + timespec ts{ sec_t(ns / 1000000000), nsec_t(ns % 1000000000) }; + return wait_until(lock.mutex(), true, &ts); + } + + template + bool wait_until(std::unique_lock& lock, + const std::chrono::time_point& timeout_time, P predicate) noexcept { + while (!predicate()) { + if (wait_until(lock, timeout_time) == std::cv_status::timeout) { + return predicate(); + } + } + return true; + } + + template + std::cv_status wait_for(std::unique_lock& lock, + const std::chrono::duration& rel_time) noexcept { + return wait_until(lock, std::chrono::steady_clock::now() + rel_time); + } + + template + bool wait_for(std::unique_lock& lock, + const std::chrono::duration& rel_time, P pred) noexcept { + return wait_until(lock, std::chrono::steady_clock::now() + rel_time, std::move(pred)); + } + +private: + std::atomic mState = { 0 }; + + void pulse(int threadCount) noexcept; + + std::cv_status wait_until(Mutex* lock, + bool realtimeClock, timespec* ts) noexcept; +}; + +} // namespace utils + +#endif // TNT_UTILS_LINUX_CONDITION_H diff --git a/dart_filament/native/include/filament/utils/linux/Mutex.h b/dart_filament/native/include/filament/utils/linux/Mutex.h new file mode 100644 index 00000000..f548d53e --- /dev/null +++ b/dart_filament/native/include/filament/utils/linux/Mutex.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_UTILS_LINUX_MUTEX_H +#define TNT_UTILS_LINUX_MUTEX_H + +#include + +#include + +#include + +namespace utils { + +/* + * A very simple mutex class that can be used as an (almost) drop-in replacement + * for std::mutex. + * It is very low overhead as most of it is inlined. + */ + +class Mutex { +public: + constexpr Mutex() noexcept = default; + Mutex(const Mutex&) = delete; + Mutex& operator=(const Mutex&) = delete; + + void lock() noexcept { + uint32_t old_state = UNLOCKED; + if (UTILS_UNLIKELY(!mState.compare_exchange_strong(old_state, + LOCKED, std::memory_order_acquire, std::memory_order_relaxed))) { + wait(); + } + } + + void unlock() noexcept { + if (UTILS_UNLIKELY(mState.exchange(UNLOCKED, std::memory_order_release) == LOCKED_CONTENDED)) { + wake(); + } + } + +private: + enum { + UNLOCKED = 0, LOCKED = 1, LOCKED_CONTENDED = 2 + }; + std::atomic mState = { UNLOCKED }; + + void wait() noexcept; + void wake() noexcept; +}; + +} // namespace utils + +#endif // TNT_UTILS_LINUX_MUTEX_H diff --git a/dart_filament/native/lib/android/arm64-v8a/libimageio.a b/dart_filament/native/lib/android/arm64-v8a/libimageio.a index 46904f96..ed443bb7 100644 Binary files a/dart_filament/native/lib/android/arm64-v8a/libimageio.a and b/dart_filament/native/lib/android/arm64-v8a/libimageio.a differ diff --git a/dart_filament/native/lib/android/arm64-v8a/libpng.a b/dart_filament/native/lib/android/arm64-v8a/libpng.a index 3e14c006..1b543a81 100644 Binary files a/dart_filament/native/lib/android/arm64-v8a/libpng.a and b/dart_filament/native/lib/android/arm64-v8a/libpng.a differ diff --git a/dart_filament/native/lib/android/arm64-v8a/libtinyexr.a b/dart_filament/native/lib/android/arm64-v8a/libtinyexr.a index ee67bb55..98f1f5aa 100644 Binary files a/dart_filament/native/lib/android/arm64-v8a/libtinyexr.a and b/dart_filament/native/lib/android/arm64-v8a/libtinyexr.a differ diff --git a/dart_filament/native/lib/android/armeabi-v7a/libimageio.a b/dart_filament/native/lib/android/armeabi-v7a/libimageio.a index cfa51f4c..e92315b0 100644 Binary files a/dart_filament/native/lib/android/armeabi-v7a/libimageio.a and b/dart_filament/native/lib/android/armeabi-v7a/libimageio.a differ diff --git a/dart_filament/native/lib/android/armeabi-v7a/libpng.a b/dart_filament/native/lib/android/armeabi-v7a/libpng.a index ddc733de..c9cb1d1a 100644 Binary files a/dart_filament/native/lib/android/armeabi-v7a/libpng.a and b/dart_filament/native/lib/android/armeabi-v7a/libpng.a differ diff --git a/dart_filament/native/lib/android/armeabi-v7a/libtinyexr.a b/dart_filament/native/lib/android/armeabi-v7a/libtinyexr.a index 64b0e5fe..95eb6c23 100644 Binary files a/dart_filament/native/lib/android/armeabi-v7a/libtinyexr.a and b/dart_filament/native/lib/android/armeabi-v7a/libtinyexr.a differ diff --git a/dart_filament/native/lib/android/x86/libimageio.a b/dart_filament/native/lib/android/x86/libimageio.a index cc15d726..b09fd963 100644 Binary files a/dart_filament/native/lib/android/x86/libimageio.a and b/dart_filament/native/lib/android/x86/libimageio.a differ diff --git a/dart_filament/native/lib/android/x86/libpng.a b/dart_filament/native/lib/android/x86/libpng.a index da729667..a8e2e83f 100644 Binary files a/dart_filament/native/lib/android/x86/libpng.a and b/dart_filament/native/lib/android/x86/libpng.a differ diff --git a/dart_filament/native/lib/android/x86/libtinyexr.a b/dart_filament/native/lib/android/x86/libtinyexr.a index c6e736b1..b447dc24 100644 Binary files a/dart_filament/native/lib/android/x86/libtinyexr.a and b/dart_filament/native/lib/android/x86/libtinyexr.a differ diff --git a/dart_filament/native/lib/android/x86_64/libimageio.a b/dart_filament/native/lib/android/x86_64/libimageio.a index 64ec15d3..6e339e7a 100644 Binary files a/dart_filament/native/lib/android/x86_64/libimageio.a and b/dart_filament/native/lib/android/x86_64/libimageio.a differ diff --git a/dart_filament/native/lib/android/x86_64/libpng.a b/dart_filament/native/lib/android/x86_64/libpng.a index 96d50b1d..b66842a9 100644 Binary files a/dart_filament/native/lib/android/x86_64/libpng.a and b/dart_filament/native/lib/android/x86_64/libpng.a differ diff --git a/dart_filament/native/lib/android/x86_64/libtinyexr.a b/dart_filament/native/lib/android/x86_64/libtinyexr.a index faa29388..187f817b 100644 Binary files a/dart_filament/native/lib/android/x86_64/libtinyexr.a and b/dart_filament/native/lib/android/x86_64/libtinyexr.a differ