diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/file_sys/system_archive/time_zone_binary.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_thread.cpp | 15 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_thread.h | 4 | ||||
| -rw-r--r-- | src/core/hle/service/time/time_zone_manager.cpp | 5 | ||||
| -rw-r--r-- | src/core/hle/service/time/time_zone_service.cpp | 10 | 
5 files changed, 20 insertions, 16 deletions
diff --git a/src/core/file_sys/system_archive/time_zone_binary.cpp b/src/core/file_sys/system_archive/time_zone_binary.cpp index ceb0b41c6..7c17bbefa 100644 --- a/src/core/file_sys/system_archive/time_zone_binary.cpp +++ b/src/core/file_sys/system_archive/time_zone_binary.cpp @@ -15,7 +15,7 @@ namespace FileSys::SystemArchive {  const static std::map<std::string, const std::map<const char*, const std::vector<u8>>&>      tzdb_zoneinfo_dirs = {{"Africa", NxTzdb::africa},                            {"America", NxTzdb::america}, -                          {"Antartica", NxTzdb::antartica}, +                          {"Antarctica", NxTzdb::antarctica},                            {"Arctic", NxTzdb::arctic},                            {"Asia", NxTzdb::asia},                            {"Atlantic", NxTzdb::atlantic}, diff --git a/src/core/hle/kernel/k_thread.cpp b/src/core/hle/kernel/k_thread.cpp index 70480b725..908811e2c 100644 --- a/src/core/hle/kernel/k_thread.cpp +++ b/src/core/hle/kernel/k_thread.cpp @@ -4,6 +4,8 @@  #include <algorithm>  #include <atomic>  #include <cinttypes> +#include <condition_variable> +#include <mutex>  #include <optional>  #include <vector> @@ -1313,7 +1315,8 @@ void KThread::RequestDummyThreadWait() {      ASSERT(this->IsDummyThread());      // We will block when the scheduler lock is released. -    m_dummy_thread_runnable.store(false); +    std::scoped_lock lock{m_dummy_thread_mutex}; +    m_dummy_thread_runnable = false;  }  void KThread::DummyThreadBeginWait() { @@ -1323,7 +1326,8 @@ void KThread::DummyThreadBeginWait() {      }      // Block until runnable is no longer false. -    m_dummy_thread_runnable.wait(false); +    std::unique_lock lock{m_dummy_thread_mutex}; +    m_dummy_thread_cv.wait(lock, [this] { return m_dummy_thread_runnable; });  }  void KThread::DummyThreadEndWait() { @@ -1331,8 +1335,11 @@ void KThread::DummyThreadEndWait() {      ASSERT(this->IsDummyThread());      // Wake up the waiting thread. -    m_dummy_thread_runnable.store(true); -    m_dummy_thread_runnable.notify_one(); +    { +        std::scoped_lock lock{m_dummy_thread_mutex}; +        m_dummy_thread_runnable = true; +    } +    m_dummy_thread_cv.notify_one();  }  void KThread::BeginWait(KThreadQueue* queue) { diff --git a/src/core/hle/kernel/k_thread.h b/src/core/hle/kernel/k_thread.h index f9814ac8f..37fe5db77 100644 --- a/src/core/hle/kernel/k_thread.h +++ b/src/core/hle/kernel/k_thread.h @@ -892,7 +892,9 @@ private:      std::shared_ptr<Common::Fiber> m_host_context{};      ThreadType m_thread_type{};      StepState m_step_state{}; -    std::atomic<bool> m_dummy_thread_runnable{true}; +    bool m_dummy_thread_runnable{true}; +    std::mutex m_dummy_thread_mutex{}; +    std::condition_variable m_dummy_thread_cv{};      // For debugging      std::vector<KSynchronizationObject*> m_wait_objects_for_debugging{}; diff --git a/src/core/hle/service/time/time_zone_manager.cpp b/src/core/hle/service/time/time_zone_manager.cpp index e1728c06d..63aacd19f 100644 --- a/src/core/hle/service/time/time_zone_manager.cpp +++ b/src/core/hle/service/time/time_zone_manager.cpp @@ -849,8 +849,9 @@ static Result CreateCalendarTime(s64 time, int gmt_offset, CalendarTimeInternal&  static Result ToCalendarTimeInternal(const TimeZoneRule& rules, s64 time,                                       CalendarTimeInternal& calendar_time,                                       CalendarAdditionalInfo& calendar_additional_info) { -    if ((rules.go_ahead && time < rules.ats[0]) || -        (rules.go_back && time > rules.ats[rules.time_count - 1])) { +    ASSERT(rules.go_ahead ? rules.time_count > 0 : true); +    if ((rules.go_back && time < rules.ats[0]) || +        (rules.go_ahead && time > rules.ats[rules.time_count - 1])) {          s64 seconds{};          if (time < rules.ats[0]) {              seconds = rules.ats[0] - time; diff --git a/src/core/hle/service/time/time_zone_service.cpp b/src/core/hle/service/time/time_zone_service.cpp index e8273e152..8171c82a5 100644 --- a/src/core/hle/service/time/time_zone_service.cpp +++ b/src/core/hle/service/time/time_zone_service.cpp @@ -112,20 +112,14 @@ void ITimeZoneService::LoadTimeZoneRule(HLERequestContext& ctx) {      LOG_DEBUG(Service_Time, "called, location_name={}", location_name);      TimeZone::TimeZoneRule time_zone_rule{}; -    if (const Result result{ -            time_zone_content_manager.LoadTimeZoneRule(time_zone_rule, location_name)}; -        result != ResultSuccess) { -        IPC::ResponseBuilder rb{ctx, 2}; -        rb.Push(result); -        return; -    } +    const Result result{time_zone_content_manager.LoadTimeZoneRule(time_zone_rule, location_name)};      std::vector<u8> time_zone_rule_outbuffer(sizeof(TimeZone::TimeZoneRule));      std::memcpy(time_zone_rule_outbuffer.data(), &time_zone_rule, sizeof(TimeZone::TimeZoneRule));      ctx.WriteBuffer(time_zone_rule_outbuffer);      IPC::ResponseBuilder rb{ctx, 2}; -    rb.Push(ResultSuccess); +    rb.Push(result);  }  void ITimeZoneService::ToCalendarTime(HLERequestContext& ctx) {  | 
