Commit Graph

24 Commits

Author SHA1 Message Date
Sandy Carter e2bf48ac1d [threading linux] Implement TLS
Implement TLSHandle with pthread_key_t.

Test Alloc, Free, Get and Set.
2019-08-13 16:50:28 -04:00
Sandy Carter 41ba1eb1c1 [threading linux] Implement Callback Queuing
Add thread local bool for alertable state.
Use real-time event interrupt to run callback.
Fix sleep duration from miliseconds (microseconds / 1000) to seconds in sleep
command.
Add note for future implementation.

Ignore real-time event 37 in .gdbinit which is used to signal callback.

Test AlertableSleep
Test Thread QueueUserCallback.
TODO: Test alerted wait result when using IO functions.
2019-08-13 16:50:28 -04:00
Sandy Carter 00f223e737 [threading linux] Implement suspendable pthreads
Use real-time event interrupt to communicate suspend in timely manner.
Use conditional_variable to implement suspend wait and resume trigger.

Ignore real-time event 36 in .gdbinit which is used to signal suspend.

Test suspending threads.
2019-08-13 16:50:28 -04:00
Sandy Carter c02f0e9219 [threading linux] Wait for thread start 2019-08-13 16:50:28 -04:00
Sandy Carter 82cbb11ff2 [threading linux] Implement basic Thread function
Add Basic Tests on Threads
2019-08-13 16:50:28 -04:00
Sandy Carter fb3533ec45 [threading linux] Implement Timer
Test Manual Reset and Synchronization timers single threaded.
Test Cancelling timers.
Test WaitMultiple.
Ignore real-time event 35 in .gdbinit which is used to signal timer.

Callbacks don't seem to be called so testing them is difficult.
2019-08-13 16:50:28 -04:00
Sandy Carter 996d629538 [threading linux] Implement Mutant
Keep track of recursive locks with owner and count of locks.
Only allow recursive locks from same thread and increment count.
Only allow first locks from when count is zero.

Test acquiring and releasing mutant on same and on different threads.
Test Release return values.
Test WaitAll and WaitAny.
2019-08-13 16:50:28 -04:00
Sandy Carter 01f1ca283f [threading linux] Implement Semaphore
Test acquiring and releasing semaphores on same and on different threads.
Test previous_count values.
Test WaitAll and WaitAny.

Add tests for invalid semaphore creation parameters but disactivated as
they do not pass on any platform. These should be enabled and the
implementations fixed to match documentation.
2019-08-13 16:50:28 -04:00
Sandy Carter 4289349654 [threading linux] Make PosixCondition base class
Add PosixConditionBase as base class for Waitables to use common
primitives mutex and conditional variable
Add abstract signaled() and post_execution() to use single WaitMultiple
implementation.
2019-08-13 16:50:28 -04:00
Sandy Carter fb505eaed1 [threading linux] Implement WaitMultiple
Make conditional_variable and mutex static and create generalisation of
Wait for vector of handles.
Use std::any for waitany and std::all for waitall
2019-08-13 16:50:28 -04:00
Sandy Carter dedf7cb184 [threading linux] Implement Events
Remove file-descriptor specific wait implementation to PosixFdHandle class
which breaks on waits of non-fd handles.
Replace with PosixConditionHandle and extend to support auto reset and
initial values.
Simplify mutex and conditional variable use with stdlib versions which
wrap these primitives but provide better C++ interface.
Test Event and Reset
2019-08-13 16:49:48 -04:00
Sandy Carter 9137e56381 [threading linux] Fix events with closed handles
Linux: Remove copy and destroy call in make_unique invokation which closes
handles on all events.
Testing: Add Wait test for Events set and unset.
2019-08-13 15:56:42 -04:00
Sandy Carter 8087b5a58b [threading] Implement Posix HighResolutionTimer
Implement HighResolutionTimer for Posix by using native timers.
Callbacks are triggered with realtime interrupts if they are supported.
Create an enum to track user-defined interrupts as well as an initializer and
handler to register these interrupts per thread.
Add test cases for timers for both single and multiple.
Fix Sleep function to continue sleeping if interrupted by system.
Add local .gdbinit to ignore signal 34 which is used by high res timer
2019-08-13 15:56:42 -04:00
Sandy Carter bc2bb4391b [threading linux] Fix nanosleep using microseconds
Add Sleep Test for 50ms.
Fix Sleep under linux that was using microseconds as nanoseconds.
Factor timespec creation to template function using div/mod and nanoseconds
from duration cast.
2019-08-13 15:56:42 -04:00
DrChat a47417117e [Base] Implement PosixEvent using eventfd 2017-12-20 17:51:31 -06:00
DrChat 3bc5d90662 Return dummy values for unimplemented threading functions 2017-12-16 17:02:06 -06:00
scribam b6e7e66fbe Fix travis LINT 2017-09-20 23:29:39 +02:00
Doug Johnson b143b91fbb base: threading_linux: Stub out several synchronization constructs 2017-07-11 11:47:25 -06:00
Dr. Chat af493ffbc7 xenia-base: Use unique_ptr constructor rather than make_unique to support GCC 4.8.4 2017-05-12 10:17:56 -05:00
Dr. Chat 737b78ad49 Last stretch to get PPC native tests working 2017-05-11 15:09:43 -05:00
DrChat 26456280f1 Travis: print error log on command failure 2017-02-11 00:02:15 -06:00
DrChat d43e2c7ff8 xenia-cpu-ppc-tests is now building on linux 2017-02-10 23:54:10 -06:00
Ben Vanik 8b0d4fb51c Linux tweaks. 2015-08-18 14:18:00 -07:00
Ben Vanik e3220f7ae6 Code cleanup: moving poly/ into xenia/base/ 2015-05-02 03:42:51 -07:00