diff options
| author | 2020-06-28 12:37:50 -0400 | |
|---|---|---|
| committer | 2020-06-28 12:37:50 -0400 | |
| commit | b05795d704e0c194215f815a5703db09e524b59a (patch) | |
| tree | ecf4023b4ee0c91555c1d8263762fcb9dcb04a17 /src/core/hle/kernel/thread.h | |
| parent | Merge pull request #4196 from ogniK5377/nrr-nro-fixes (diff) | |
| parent | Core/Common: Address Feedback. (diff) | |
| download | yuzu-b05795d704e0c194215f815a5703db09e524b59a.tar.gz yuzu-b05795d704e0c194215f815a5703db09e524b59a.tar.xz yuzu-b05795d704e0c194215f815a5703db09e524b59a.zip | |
Merge pull request #3955 from FernandoS27/prometheus-2b
Remake Kernel Scheduling, CPU Management & Boot Management (Prometheus)
Diffstat (limited to 'src/core/hle/kernel/thread.h')
| -rw-r--r-- | src/core/hle/kernel/thread.h | 277 |
1 files changed, 202 insertions, 75 deletions
diff --git a/src/core/hle/kernel/thread.h b/src/core/hle/kernel/thread.h index 23fdef8a4..c0342c462 100644 --- a/src/core/hle/kernel/thread.h +++ b/src/core/hle/kernel/thread.h | |||
| @@ -6,26 +6,47 @@ | |||
| 6 | 6 | ||
| 7 | #include <functional> | 7 | #include <functional> |
| 8 | #include <string> | 8 | #include <string> |
| 9 | #include <utility> | ||
| 9 | #include <vector> | 10 | #include <vector> |
| 10 | 11 | ||
| 11 | #include "common/common_types.h" | 12 | #include "common/common_types.h" |
| 13 | #include "common/spin_lock.h" | ||
| 12 | #include "core/arm/arm_interface.h" | 14 | #include "core/arm/arm_interface.h" |
| 13 | #include "core/hle/kernel/object.h" | 15 | #include "core/hle/kernel/object.h" |
| 14 | #include "core/hle/kernel/synchronization_object.h" | 16 | #include "core/hle/kernel/synchronization_object.h" |
| 15 | #include "core/hle/result.h" | 17 | #include "core/hle/result.h" |
| 16 | 18 | ||
| 19 | namespace Common { | ||
| 20 | class Fiber; | ||
| 21 | } | ||
| 22 | |||
| 23 | namespace Core { | ||
| 24 | class ARM_Interface; | ||
| 25 | class System; | ||
| 26 | } // namespace Core | ||
| 27 | |||
| 17 | namespace Kernel { | 28 | namespace Kernel { |
| 18 | 29 | ||
| 30 | class GlobalScheduler; | ||
| 19 | class KernelCore; | 31 | class KernelCore; |
| 20 | class Process; | 32 | class Process; |
| 21 | class Scheduler; | 33 | class Scheduler; |
| 22 | 34 | ||
| 23 | enum ThreadPriority : u32 { | 35 | enum ThreadPriority : u32 { |
| 24 | THREADPRIO_HIGHEST = 0, ///< Highest thread priority | 36 | THREADPRIO_HIGHEST = 0, ///< Highest thread priority |
| 25 | THREADPRIO_USERLAND_MAX = 24, ///< Highest thread priority for userland apps | 37 | THREADPRIO_MAX_CORE_MIGRATION = 2, ///< Highest priority for a core migration |
| 26 | THREADPRIO_DEFAULT = 44, ///< Default thread priority for userland apps | 38 | THREADPRIO_USERLAND_MAX = 24, ///< Highest thread priority for userland apps |
| 27 | THREADPRIO_LOWEST = 63, ///< Lowest thread priority | 39 | THREADPRIO_DEFAULT = 44, ///< Default thread priority for userland apps |
| 28 | THREADPRIO_COUNT = 64, ///< Total number of possible thread priorities. | 40 | THREADPRIO_LOWEST = 63, ///< Lowest thread priority |
| 41 | THREADPRIO_COUNT = 64, ///< Total number of possible thread priorities. | ||
| 42 | }; | ||
| 43 | |||
| 44 | enum ThreadType : u32 { | ||
| 45 | THREADTYPE_USER = 0x1, | ||
| 46 | THREADTYPE_KERNEL = 0x2, | ||
| 47 | THREADTYPE_HLE = 0x4, | ||
| 48 | THREADTYPE_IDLE = 0x8, | ||
| 49 | THREADTYPE_SUSPEND = 0x10, | ||
| 29 | }; | 50 | }; |
| 30 | 51 | ||
| 31 | enum ThreadProcessorId : s32 { | 52 | enum ThreadProcessorId : s32 { |
| @@ -107,26 +128,45 @@ public: | |||
| 107 | 128 | ||
| 108 | using ThreadSynchronizationObjects = std::vector<std::shared_ptr<SynchronizationObject>>; | 129 | using ThreadSynchronizationObjects = std::vector<std::shared_ptr<SynchronizationObject>>; |
| 109 | 130 | ||
| 110 | using WakeupCallback = | 131 | using HLECallback = std::function<bool(std::shared_ptr<Thread> thread)>; |
| 111 | std::function<bool(ThreadWakeupReason reason, std::shared_ptr<Thread> thread, | 132 | |
| 112 | std::shared_ptr<SynchronizationObject> object, std::size_t index)>; | 133 | /** |
| 134 | * Creates and returns a new thread. The new thread is immediately scheduled | ||
| 135 | * @param system The instance of the whole system | ||
| 136 | * @param name The friendly name desired for the thread | ||
| 137 | * @param entry_point The address at which the thread should start execution | ||
| 138 | * @param priority The thread's priority | ||
| 139 | * @param arg User data to pass to the thread | ||
| 140 | * @param processor_id The ID(s) of the processors on which the thread is desired to be run | ||
| 141 | * @param stack_top The address of the thread's stack top | ||
| 142 | * @param owner_process The parent process for the thread, if null, it's a kernel thread | ||
| 143 | * @return A shared pointer to the newly created thread | ||
| 144 | */ | ||
| 145 | static ResultVal<std::shared_ptr<Thread>> Create(Core::System& system, ThreadType type_flags, | ||
| 146 | std::string name, VAddr entry_point, | ||
| 147 | u32 priority, u64 arg, s32 processor_id, | ||
| 148 | VAddr stack_top, Process* owner_process); | ||
| 113 | 149 | ||
| 114 | /** | 150 | /** |
| 115 | * Creates and returns a new thread. The new thread is immediately scheduled | 151 | * Creates and returns a new thread. The new thread is immediately scheduled |
| 116 | * @param kernel The kernel instance this thread will be created under. | 152 | * @param system The instance of the whole system |
| 117 | * @param name The friendly name desired for the thread | 153 | * @param name The friendly name desired for the thread |
| 118 | * @param entry_point The address at which the thread should start execution | 154 | * @param entry_point The address at which the thread should start execution |
| 119 | * @param priority The thread's priority | 155 | * @param priority The thread's priority |
| 120 | * @param arg User data to pass to the thread | 156 | * @param arg User data to pass to the thread |
| 121 | * @param processor_id The ID(s) of the processors on which the thread is desired to be run | 157 | * @param processor_id The ID(s) of the processors on which the thread is desired to be run |
| 122 | * @param stack_top The address of the thread's stack top | 158 | * @param stack_top The address of the thread's stack top |
| 123 | * @param owner_process The parent process for the thread | 159 | * @param owner_process The parent process for the thread, if null, it's a kernel thread |
| 160 | * @param thread_start_func The function where the host context will start. | ||
| 161 | * @param thread_start_parameter The parameter which will passed to host context on init | ||
| 124 | * @return A shared pointer to the newly created thread | 162 | * @return A shared pointer to the newly created thread |
| 125 | */ | 163 | */ |
| 126 | static ResultVal<std::shared_ptr<Thread>> Create(KernelCore& kernel, std::string name, | 164 | static ResultVal<std::shared_ptr<Thread>> Create(Core::System& system, ThreadType type_flags, |
| 127 | VAddr entry_point, u32 priority, u64 arg, | 165 | std::string name, VAddr entry_point, |
| 128 | s32 processor_id, VAddr stack_top, | 166 | u32 priority, u64 arg, s32 processor_id, |
| 129 | Process& owner_process); | 167 | VAddr stack_top, Process* owner_process, |
| 168 | std::function<void(void*)>&& thread_start_func, | ||
| 169 | void* thread_start_parameter); | ||
| 130 | 170 | ||
| 131 | std::string GetName() const override { | 171 | std::string GetName() const override { |
| 132 | return name; | 172 | return name; |
| @@ -181,7 +221,7 @@ public: | |||
| 181 | void UpdatePriority(); | 221 | void UpdatePriority(); |
| 182 | 222 | ||
| 183 | /// Changes the core that the thread is running or scheduled to run on. | 223 | /// Changes the core that the thread is running or scheduled to run on. |
| 184 | void ChangeCore(u32 core, u64 mask); | 224 | ResultCode SetCoreAndAffinityMask(s32 new_core, u64 new_affinity_mask); |
| 185 | 225 | ||
| 186 | /** | 226 | /** |
| 187 | * Gets the thread's thread ID | 227 | * Gets the thread's thread ID |
| @@ -194,6 +234,10 @@ public: | |||
| 194 | /// Resumes a thread from waiting | 234 | /// Resumes a thread from waiting |
| 195 | void ResumeFromWait(); | 235 | void ResumeFromWait(); |
| 196 | 236 | ||
| 237 | void OnWakeUp(); | ||
| 238 | |||
| 239 | ResultCode Start(); | ||
| 240 | |||
| 197 | /// Cancels a waiting operation that this thread may or may not be within. | 241 | /// Cancels a waiting operation that this thread may or may not be within. |
| 198 | /// | 242 | /// |
| 199 | /// When the thread is within a waiting state, this will set the thread's | 243 | /// When the thread is within a waiting state, this will set the thread's |
| @@ -202,26 +246,19 @@ public: | |||
| 202 | /// | 246 | /// |
| 203 | void CancelWait(); | 247 | void CancelWait(); |
| 204 | 248 | ||
| 205 | /** | 249 | void SetSynchronizationResults(SynchronizationObject* object, ResultCode result); |
| 206 | * Schedules an event to wake up the specified thread after the specified delay | ||
| 207 | * @param nanoseconds The time this thread will be allowed to sleep for | ||
| 208 | */ | ||
| 209 | void WakeAfterDelay(s64 nanoseconds); | ||
| 210 | 250 | ||
| 211 | /// Cancel any outstanding wakeup events for this thread | 251 | Core::ARM_Interface& ArmInterface(); |
| 212 | void CancelWakeupTimer(); | ||
| 213 | 252 | ||
| 214 | /** | 253 | const Core::ARM_Interface& ArmInterface() const; |
| 215 | * Sets the result after the thread awakens (from svcWaitSynchronization) | ||
| 216 | * @param result Value to set to the returned result | ||
| 217 | */ | ||
| 218 | void SetWaitSynchronizationResult(ResultCode result); | ||
| 219 | 254 | ||
| 220 | /** | 255 | SynchronizationObject* GetSignalingObject() const { |
| 221 | * Sets the output parameter value after the thread awakens (from svcWaitSynchronization) | 256 | return signaling_object; |
| 222 | * @param output Value to set to the output parameter | 257 | } |
| 223 | */ | 258 | |
| 224 | void SetWaitSynchronizationOutput(s32 output); | 259 | ResultCode GetSignalingResult() const { |
| 260 | return signaling_result; | ||
| 261 | } | ||
| 225 | 262 | ||
| 226 | /** | 263 | /** |
| 227 | * Retrieves the index that this particular object occupies in the list of objects | 264 | * Retrieves the index that this particular object occupies in the list of objects |
| @@ -269,11 +306,6 @@ public: | |||
| 269 | */ | 306 | */ |
| 270 | VAddr GetCommandBufferAddress() const; | 307 | VAddr GetCommandBufferAddress() const; |
| 271 | 308 | ||
| 272 | /// Returns whether this thread is waiting on objects from a WaitSynchronization call. | ||
| 273 | bool IsSleepingOnWait() const { | ||
| 274 | return status == ThreadStatus::WaitSynch; | ||
| 275 | } | ||
| 276 | |||
| 277 | ThreadContext32& GetContext32() { | 309 | ThreadContext32& GetContext32() { |
| 278 | return context_32; | 310 | return context_32; |
| 279 | } | 311 | } |
| @@ -290,6 +322,28 @@ public: | |||
| 290 | return context_64; | 322 | return context_64; |
| 291 | } | 323 | } |
| 292 | 324 | ||
| 325 | bool IsHLEThread() const { | ||
| 326 | return (type & THREADTYPE_HLE) != 0; | ||
| 327 | } | ||
| 328 | |||
| 329 | bool IsSuspendThread() const { | ||
| 330 | return (type & THREADTYPE_SUSPEND) != 0; | ||
| 331 | } | ||
| 332 | |||
| 333 | bool IsIdleThread() const { | ||
| 334 | return (type & THREADTYPE_IDLE) != 0; | ||
| 335 | } | ||
| 336 | |||
| 337 | bool WasRunning() const { | ||
| 338 | return was_running; | ||
| 339 | } | ||
| 340 | |||
| 341 | void SetWasRunning(bool value) { | ||
| 342 | was_running = value; | ||
| 343 | } | ||
| 344 | |||
| 345 | std::shared_ptr<Common::Fiber>& GetHostContext(); | ||
| 346 | |||
| 293 | ThreadStatus GetStatus() const { | 347 | ThreadStatus GetStatus() const { |
| 294 | return status; | 348 | return status; |
| 295 | } | 349 | } |
| @@ -325,18 +379,18 @@ public: | |||
| 325 | } | 379 | } |
| 326 | 380 | ||
| 327 | const ThreadSynchronizationObjects& GetSynchronizationObjects() const { | 381 | const ThreadSynchronizationObjects& GetSynchronizationObjects() const { |
| 328 | return wait_objects; | 382 | return *wait_objects; |
| 329 | } | 383 | } |
| 330 | 384 | ||
| 331 | void SetSynchronizationObjects(ThreadSynchronizationObjects objects) { | 385 | void SetSynchronizationObjects(ThreadSynchronizationObjects* objects) { |
| 332 | wait_objects = std::move(objects); | 386 | wait_objects = objects; |
| 333 | } | 387 | } |
| 334 | 388 | ||
| 335 | void ClearSynchronizationObjects() { | 389 | void ClearSynchronizationObjects() { |
| 336 | for (const auto& waiting_object : wait_objects) { | 390 | for (const auto& waiting_object : *wait_objects) { |
| 337 | waiting_object->RemoveWaitingThread(SharedFrom(this)); | 391 | waiting_object->RemoveWaitingThread(SharedFrom(this)); |
| 338 | } | 392 | } |
| 339 | wait_objects.clear(); | 393 | wait_objects->clear(); |
| 340 | } | 394 | } |
| 341 | 395 | ||
| 342 | /// Determines whether all the objects this thread is waiting on are ready. | 396 | /// Determines whether all the objects this thread is waiting on are ready. |
| @@ -386,26 +440,35 @@ public: | |||
| 386 | arb_wait_address = address; | 440 | arb_wait_address = address; |
| 387 | } | 441 | } |
| 388 | 442 | ||
| 389 | bool HasWakeupCallback() const { | 443 | bool HasHLECallback() const { |
| 390 | return wakeup_callback != nullptr; | 444 | return hle_callback != nullptr; |
| 391 | } | 445 | } |
| 392 | 446 | ||
| 393 | void SetWakeupCallback(WakeupCallback callback) { | 447 | void SetHLECallback(HLECallback callback) { |
| 394 | wakeup_callback = std::move(callback); | 448 | hle_callback = std::move(callback); |
| 395 | } | 449 | } |
| 396 | 450 | ||
| 397 | void InvalidateWakeupCallback() { | 451 | void SetHLETimeEvent(Handle time_event) { |
| 398 | SetWakeupCallback(nullptr); | 452 | hle_time_event = time_event; |
| 399 | } | 453 | } |
| 400 | 454 | ||
| 401 | /** | 455 | void SetHLESyncObject(SynchronizationObject* object) { |
| 402 | * Invokes the thread's wakeup callback. | 456 | hle_object = object; |
| 403 | * | 457 | } |
| 404 | * @pre A valid wakeup callback has been set. Violating this precondition | 458 | |
| 405 | * will cause an assertion to trigger. | 459 | Handle GetHLETimeEvent() const { |
| 406 | */ | 460 | return hle_time_event; |
| 407 | bool InvokeWakeupCallback(ThreadWakeupReason reason, std::shared_ptr<Thread> thread, | 461 | } |
| 408 | std::shared_ptr<SynchronizationObject> object, std::size_t index); | 462 | |
| 463 | SynchronizationObject* GetHLESyncObject() const { | ||
| 464 | return hle_object; | ||
| 465 | } | ||
| 466 | |||
| 467 | void InvalidateHLECallback() { | ||
| 468 | SetHLECallback(nullptr); | ||
| 469 | } | ||
| 470 | |||
| 471 | bool InvokeHLECallback(std::shared_ptr<Thread> thread); | ||
| 409 | 472 | ||
| 410 | u32 GetIdealCore() const { | 473 | u32 GetIdealCore() const { |
| 411 | return ideal_core; | 474 | return ideal_core; |
| @@ -415,23 +478,19 @@ public: | |||
| 415 | return affinity_mask; | 478 | return affinity_mask; |
| 416 | } | 479 | } |
| 417 | 480 | ||
| 418 | ThreadActivity GetActivity() const { | 481 | ResultCode SetActivity(ThreadActivity value); |
| 419 | return activity; | ||
| 420 | } | ||
| 421 | |||
| 422 | void SetActivity(ThreadActivity value); | ||
| 423 | 482 | ||
| 424 | /// Sleeps this thread for the given amount of nanoseconds. | 483 | /// Sleeps this thread for the given amount of nanoseconds. |
| 425 | void Sleep(s64 nanoseconds); | 484 | ResultCode Sleep(s64 nanoseconds); |
| 426 | 485 | ||
| 427 | /// Yields this thread without rebalancing loads. | 486 | /// Yields this thread without rebalancing loads. |
| 428 | bool YieldSimple(); | 487 | std::pair<ResultCode, bool> YieldSimple(); |
| 429 | 488 | ||
| 430 | /// Yields this thread and does a load rebalancing. | 489 | /// Yields this thread and does a load rebalancing. |
| 431 | bool YieldAndBalanceLoad(); | 490 | std::pair<ResultCode, bool> YieldAndBalanceLoad(); |
| 432 | 491 | ||
| 433 | /// Yields this thread and if the core is left idle, loads are rebalanced | 492 | /// Yields this thread and if the core is left idle, loads are rebalanced |
| 434 | bool YieldAndWaitForLoadBalancing(); | 493 | std::pair<ResultCode, bool> YieldAndWaitForLoadBalancing(); |
| 435 | 494 | ||
| 436 | void IncrementYieldCount() { | 495 | void IncrementYieldCount() { |
| 437 | yield_count++; | 496 | yield_count++; |
| @@ -446,6 +505,10 @@ public: | |||
| 446 | static_cast<u32>(ThreadSchedMasks::LowMask)); | 505 | static_cast<u32>(ThreadSchedMasks::LowMask)); |
| 447 | } | 506 | } |
| 448 | 507 | ||
| 508 | bool IsRunnable() const { | ||
| 509 | return scheduling_state == static_cast<u32>(ThreadSchedStatus::Runnable); | ||
| 510 | } | ||
| 511 | |||
| 449 | bool IsRunning() const { | 512 | bool IsRunning() const { |
| 450 | return is_running; | 513 | return is_running; |
| 451 | } | 514 | } |
| @@ -466,17 +529,67 @@ public: | |||
| 466 | return global_handle; | 529 | return global_handle; |
| 467 | } | 530 | } |
| 468 | 531 | ||
| 532 | bool IsWaitingForArbitration() const { | ||
| 533 | return waiting_for_arbitration; | ||
| 534 | } | ||
| 535 | |||
| 536 | void WaitForArbitration(bool set) { | ||
| 537 | waiting_for_arbitration = set; | ||
| 538 | } | ||
| 539 | |||
| 540 | bool IsWaitingSync() const { | ||
| 541 | return is_waiting_on_sync; | ||
| 542 | } | ||
| 543 | |||
| 544 | void SetWaitingSync(bool is_waiting) { | ||
| 545 | is_waiting_on_sync = is_waiting; | ||
| 546 | } | ||
| 547 | |||
| 548 | bool IsPendingTermination() const { | ||
| 549 | return will_be_terminated || GetSchedulingStatus() == ThreadSchedStatus::Exited; | ||
| 550 | } | ||
| 551 | |||
| 552 | bool IsPaused() const { | ||
| 553 | return pausing_state != 0; | ||
| 554 | } | ||
| 555 | |||
| 556 | bool IsContinuousOnSVC() const { | ||
| 557 | return is_continuous_on_svc; | ||
| 558 | } | ||
| 559 | |||
| 560 | void SetContinuousOnSVC(bool is_continuous) { | ||
| 561 | is_continuous_on_svc = is_continuous; | ||
| 562 | } | ||
| 563 | |||
| 564 | bool IsPhantomMode() const { | ||
| 565 | return is_phantom_mode; | ||
| 566 | } | ||
| 567 | |||
| 568 | void SetPhantomMode(bool phantom) { | ||
| 569 | is_phantom_mode = phantom; | ||
| 570 | } | ||
| 571 | |||
| 572 | bool HasExited() const { | ||
| 573 | return has_exited; | ||
| 574 | } | ||
| 575 | |||
| 469 | private: | 576 | private: |
| 577 | friend class GlobalScheduler; | ||
| 578 | friend class Scheduler; | ||
| 579 | |||
| 470 | void SetSchedulingStatus(ThreadSchedStatus new_status); | 580 | void SetSchedulingStatus(ThreadSchedStatus new_status); |
| 581 | void AddSchedulingFlag(ThreadSchedFlags flag); | ||
| 582 | void RemoveSchedulingFlag(ThreadSchedFlags flag); | ||
| 583 | |||
| 471 | void SetCurrentPriority(u32 new_priority); | 584 | void SetCurrentPriority(u32 new_priority); |
| 472 | ResultCode SetCoreAndAffinityMask(s32 new_core, u64 new_affinity_mask); | ||
| 473 | 585 | ||
| 474 | void AdjustSchedulingOnStatus(u32 old_flags); | ||
| 475 | void AdjustSchedulingOnPriority(u32 old_priority); | ||
| 476 | void AdjustSchedulingOnAffinity(u64 old_affinity_mask, s32 old_core); | 586 | void AdjustSchedulingOnAffinity(u64 old_affinity_mask, s32 old_core); |
| 477 | 587 | ||
| 588 | Common::SpinLock context_guard{}; | ||
| 478 | ThreadContext32 context_32{}; | 589 | ThreadContext32 context_32{}; |
| 479 | ThreadContext64 context_64{}; | 590 | ThreadContext64 context_64{}; |
| 591 | std::unique_ptr<Core::ARM_Interface> arm_interface{}; | ||
| 592 | std::shared_ptr<Common::Fiber> host_context{}; | ||
| 480 | 593 | ||
| 481 | u64 thread_id = 0; | 594 | u64 thread_id = 0; |
| 482 | 595 | ||
| @@ -485,6 +598,8 @@ private: | |||
| 485 | VAddr entry_point = 0; | 598 | VAddr entry_point = 0; |
| 486 | VAddr stack_top = 0; | 599 | VAddr stack_top = 0; |
| 487 | 600 | ||
| 601 | ThreadType type; | ||
| 602 | |||
| 488 | /// Nominal thread priority, as set by the emulated application. | 603 | /// Nominal thread priority, as set by the emulated application. |
| 489 | /// The nominal priority is the thread priority without priority | 604 | /// The nominal priority is the thread priority without priority |
| 490 | /// inheritance taken into account. | 605 | /// inheritance taken into account. |
| @@ -509,7 +624,10 @@ private: | |||
| 509 | 624 | ||
| 510 | /// Objects that the thread is waiting on, in the same order as they were | 625 | /// Objects that the thread is waiting on, in the same order as they were |
| 511 | /// passed to WaitSynchronization. | 626 | /// passed to WaitSynchronization. |
| 512 | ThreadSynchronizationObjects wait_objects; | 627 | ThreadSynchronizationObjects* wait_objects; |
| 628 | |||
| 629 | SynchronizationObject* signaling_object; | ||
| 630 | ResultCode signaling_result{RESULT_SUCCESS}; | ||
| 513 | 631 | ||
| 514 | /// List of threads that are waiting for a mutex that is held by this thread. | 632 | /// List of threads that are waiting for a mutex that is held by this thread. |
| 515 | MutexWaitingThreads wait_mutex_threads; | 633 | MutexWaitingThreads wait_mutex_threads; |
| @@ -526,30 +644,39 @@ private: | |||
| 526 | 644 | ||
| 527 | /// If waiting for an AddressArbiter, this is the address being waited on. | 645 | /// If waiting for an AddressArbiter, this is the address being waited on. |
| 528 | VAddr arb_wait_address{0}; | 646 | VAddr arb_wait_address{0}; |
| 647 | bool waiting_for_arbitration{}; | ||
| 529 | 648 | ||
| 530 | /// Handle used as userdata to reference this object when inserting into the CoreTiming queue. | 649 | /// Handle used as userdata to reference this object when inserting into the CoreTiming queue. |
| 531 | Handle global_handle = 0; | 650 | Handle global_handle = 0; |
| 532 | 651 | ||
| 533 | /// Callback that will be invoked when the thread is resumed from a waiting state. If the thread | 652 | /// Callback for HLE Events |
| 534 | /// was waiting via WaitSynchronization then the object will be the last object that became | 653 | HLECallback hle_callback; |
| 535 | /// available. In case of a timeout, the object will be nullptr. | 654 | Handle hle_time_event; |
| 536 | WakeupCallback wakeup_callback; | 655 | SynchronizationObject* hle_object; |
| 537 | 656 | ||
| 538 | Scheduler* scheduler = nullptr; | 657 | Scheduler* scheduler = nullptr; |
| 539 | 658 | ||
| 540 | u32 ideal_core{0xFFFFFFFF}; | 659 | u32 ideal_core{0xFFFFFFFF}; |
| 541 | u64 affinity_mask{0x1}; | 660 | u64 affinity_mask{0x1}; |
| 542 | 661 | ||
| 543 | ThreadActivity activity = ThreadActivity::Normal; | ||
| 544 | |||
| 545 | s32 ideal_core_override = -1; | 662 | s32 ideal_core_override = -1; |
| 546 | u64 affinity_mask_override = 0x1; | 663 | u64 affinity_mask_override = 0x1; |
| 547 | u32 affinity_override_count = 0; | 664 | u32 affinity_override_count = 0; |
| 548 | 665 | ||
| 549 | u32 scheduling_state = 0; | 666 | u32 scheduling_state = 0; |
| 667 | u32 pausing_state = 0; | ||
| 550 | bool is_running = false; | 668 | bool is_running = false; |
| 669 | bool is_waiting_on_sync = false; | ||
| 551 | bool is_sync_cancelled = false; | 670 | bool is_sync_cancelled = false; |
| 552 | 671 | ||
| 672 | bool is_continuous_on_svc = false; | ||
| 673 | |||
| 674 | bool will_be_terminated = false; | ||
| 675 | bool is_phantom_mode = false; | ||
| 676 | bool has_exited = false; | ||
| 677 | |||
| 678 | bool was_running = false; | ||
| 679 | |||
| 553 | std::string name; | 680 | std::string name; |
| 554 | }; | 681 | }; |
| 555 | 682 | ||