Commit Graph

552 Commits

Author SHA1 Message Date
Subv
ea80363cc2 Mutex: Add the calling thread to the waiting list when needed
This will happen when the mutex is already owned by another thread. Should fix some issues with games being stuck due to waiting threads not being awoken.
2015-01-04 12:52:34 -05:00
Subv
0276a75f24 AddressArbiter: Ported arbitration type 2 from 3dmoo.
(Thanks 3dmoo!)
2015-01-03 12:09:11 -05:00
Yuri Kunde Schlesner
7e2903cb74 Kernel: New handle manager
This handle manager more closely mirrors the behaviour of the CTR-OS
one. In addition object ref-counts and support for DuplicateHandle have
been added.

Note that support for DuplicateHandle is still experimental, since parts
of the kernel still use Handles internally, which will likely cause
troubles if two different handles to the same object are used to e.g.
wait on a synchronization primitive.
2014-12-28 11:52:55 -02:00
Yuri Kunde Schlesner
23f2142009 Kernel: Replace GetStaticHandleType by HANDLE_TYPE constants 2014-12-28 11:52:53 -02:00
Yuri Kunde Schlesner
73fba22c01 Rename ObjectPool to HandleTable 2014-12-28 11:52:52 -02:00
bunnei
0de6a08d75 Merge pull request #291 from purpasmart96/license
License change
2014-12-21 16:05:44 -05:00
purpasmart96
ebfd831ccb License change 2014-12-20 21:20:24 -08:00
bunnei
4fcdbed9f6 Thread: Wait current thread on svc_SleepThread
- Removed unused VBLANK sleep mode
- Added error log for bad context switch
- Renamed VerifyWait to CheckWaitType to be more clear
2014-12-20 23:20:19 -05:00
bunnei
2e5869c939 Merge pull request #316 from yuriks/thread-handle
Kernel: Implement support for current thread pseudo-handle
2014-12-20 16:36:01 -05:00
Chin
e795692614 Clean up some warnings 2014-12-20 10:03:36 -05:00
Yuri Kunde Schlesner
adee775f44 Kernel: Implement support for current thread pseudo-handle
This boots a few (mostly Nintendo 1st party) games further.
2014-12-20 03:27:47 -02:00
bunnei
7bae450379 Merge pull request #185 from purpasmart96/mem_perm
Kernel: Add missing permissions
2014-12-17 20:56:04 -05:00
Subv
ea9ce0fba7 Filesystem/Archives: Implemented the SaveData archive
The savedata for each game is stored in /savedata/<ProgramID> for NCCH files. ELF files and 3DSX files use the folder 0 because they have no ID information

Got rid of the code duplication in File and Directory

Files that deal with the host machine's file system now live in DiskFile, similarly for directories and DiskDirectory and archives with DiskArchive.

FS_U: Use the correct error code when a file wasn't found
2014-12-17 19:21:38 -05:00
Yuri Kunde Schlesner
ca67bb7945 HLE: Rename namespaces to match move & fix initialization order 2014-12-16 01:08:38 -02:00
Yuri Kunde Schlesner
c72ccfa6db HLE: Move kernel/archive.* to service/fs/ 2014-12-16 01:08:14 -02:00
Yuri Kunde Schlesner
e321decf98 Remove SyncRequest from K::Object and create a new K::Session type
This is a first step at fixing the conceptual insanity that is our
handling of service and IPC calls. For now, interfaces still directly
derived from Session because we don't have the infrastructure to do it
properly. (That is, Processes and scheduling them.)
2014-12-15 18:26:17 -02:00
Subv
ea95876431 Kernel/Semaphore: Small style change 2014-12-13 13:40:19 -05:00
Subv
effb181888 Kernel/Semaphores: Invert the available count checking.
Same semantics, idea by @yuriks
2014-12-13 13:40:18 -05:00
Subv
5e25986235 Kernel/Semaphores: Addressed some issues. 2014-12-13 13:40:16 -05:00
Subv
cc81a510e3 Semaphore: Removed an unneeded function 2014-12-13 13:40:15 -05:00
Subv
61434651d8 Semaphores: Addressed some style issues 2014-12-13 13:40:13 -05:00
Subv
abff4a7ee2 Semaphore: Implemented the initial_count parameter. 2014-12-13 13:40:12 -05:00
Subv
49b31badba SVC: Implemented ReleaseSemaphore.
This behavior was tested on hardware, however i'm still not sure what use the "initial_count" parameter has
2014-12-13 13:40:10 -05:00
Subv
82c84883a5 SVC: Implemented svcCreateSemaphore
ToDo: Implement svcReleaseSemaphore
* Some testing against hardware needed
2014-12-13 13:40:09 -05:00
Lioncash
cfc0ee9c60 kernel: Remove unused log arguments 2014-12-13 10:15:58 -05:00
Yuri Kunde Schlesner
0600e2d8b5 Convert old logging calls to new logging macros 2014-12-13 02:08:02 -02:00
bunnei
3a75c8069e Merge pull request #256 from Subv/mutex
Kernel/Mutex: Properly lock the mutex when a thread enters it
2014-12-10 22:52:55 -05:00
bunnei
dd203f7068 Thread: Fixed to wait on address when in arbitration. 2014-12-08 19:44:10 -05:00
archshift
20d2ed0950 Make OpenDirectory fail if the directory doesn't exist
This is in line with what the hardware itself does.

It does this by splitting the initial directory opening into Directory.Open(), which will return false if a stat fails.
Then, Archive::OpenDirectory will return nullptr, and archive.cpp will return an error code .
2014-12-07 14:47:14 -08:00
Subv
bc318c464b Mutex: Remove some forward declarations
Moved Mutex::WaitSynchronization to the end of the file.
2014-12-07 15:57:28 -05:00
Subv
64128aa61a Mutex: Release all held mutexes when a thread exits. 2014-12-07 15:44:21 -05:00
Subv
e3c8e4901c Mutex: Properly lock the mutex when a thread enters it
Also resume only the next immediate thread waiting for the mutex when it is released, instead of resuming them all.
2014-12-05 23:40:43 -05:00
bunnei
17fae11fc7 Merge pull request #250 from Subv/cbranch_2
SVC: Implemented GetThreadId.
2014-12-04 22:15:03 -05:00
bunnei
5056329a80 Merge pull request #222 from archshift/renamexyz
Implemented RenameFile and RenameDirectory in FS:USER
2014-12-04 22:07:47 -05:00
Subv
6fac2bf0ab Threads: Remove a redundant function.
Use the next_thread_id variable directly.
2014-12-04 14:59:56 -05:00
Subv
ef1d5cda06 Threads: Implemented a sequential thread id 2014-12-04 08:13:53 -05:00
archshift
139a4d91d9 Updated archive.cpp functions for proper error handling 2014-12-03 22:50:44 -08:00
Subv
029ff9f1fd SVC: Implemented GetThreadId.
For now threads are using their Handle value as their Id, it should not really cause any problems because Handle values are unique in Citra, but it should be changed. I left a ToDo there because this is not correct behavior as per hardware.
2014-12-04 00:25:35 -05:00
Lioncash
208598dbe2 kernel: Shorten GetCount 2014-12-03 22:52:02 -05:00
Lioncash
9b68d5e074 kernel: Make some functions const 2014-12-03 19:48:34 -05:00
bunnei
e3d1ffff4b Merge pull request #225 from bunnei/fix-release-mutex
Mutex: Changed behavior to always release mutex for all threads.
2014-11-30 08:47:49 -05:00
bunnei
de851ba1a1 Thread: Check that thread is actually in "wait state" when verifying wait. 2014-11-26 15:04:08 -05:00
bunnei
a449e0e11a Mutex: Changed behavior to always release mutex for all threads. 2014-11-26 14:38:42 -05:00
archshift
e5ff01c2cd Implemented RenameDirectory in FS:USER 2014-11-24 15:09:12 -08:00
archshift
45afc15aa6 Implemented RenameFile in FS:USER 2014-11-24 15:09:11 -08:00
Yuri Kunde Schlesner
8189593255 Use pointers instead of passing handles around in some functions. 2014-11-24 17:08:37 -02:00
Yuri Kunde Schlesner
22c86824a4 Remove duplicated docs/update them for changed parameters. 2014-11-24 17:08:36 -02:00
Yuri Kunde Schlesner
c2588403c0 HLE: Revamp error handling throrough the HLE code
All service calls in the CTR OS return result codes indicating the
success or failure of the call. Previous to this commit, Citra's HLE
emulation of services and the kernel universally either ignored errors
or returned dummy -1 error codes.

This commit makes an initial effort to provide an infrastructure for
error reporting and propagation which can be use going forward to make
HLE calls accurately return errors as the original system. A few parts
of the code have been updated to use the new system where applicable.

One part of this effort is the definition of the `ResultCode` type,
which provides facilities for constructing and parsing error codes in
the structured format used by the CTR.

The `ResultVal` type builds on `ResultCode` by providing a container for
values returned by function that can report errors. It enforces that
correct error checking will be done on function returns by preventing
the use of the return value if the function returned an error code.

Currently this change is mostly internal since errors are still
suppressed on the ARM<->HLE border, as a temporary compatibility hack.
As functionality is implemented and tested this hack can be eventually
removed.
2014-11-24 17:08:36 -02:00
bunnei
ef1b16a7eb Merge pull request #191 from archshift/deletexyz
Added DeleteFile and DeleteDirectory functions to FS:USER and the archives.
2014-11-23 20:02:23 -05:00
archshift
8aeadbd95a Added DeleteFile and DeleteDirectory functions to FS:USER and the archives. 2014-11-23 00:33:43 -08:00
bunnei
c0cd0fa78e Merge pull request #211 from linkmauve/master
Remove trailing spaces from the entire project
2014-11-19 15:24:46 -05:00
bunnei
112768f436 Merge pull request #208 from lioncash/statics
Add static to some variables
2014-11-19 09:39:20 -05:00
Emmanuel Gil Peyrot
f5d38649c7 Remove trailing spaces in every file but the ones imported from SkyEye, AOSP or generated 2014-11-19 09:03:07 +00:00
Lioncash
7cbecde2ca Add static to some variables 2014-11-18 20:04:00 -05:00
purpasmart96
66431bceda Kernel:Add missing permissions in shared memory & svc 2014-11-18 15:57:25 -08:00
Lioncash
1a8f466217 Remove extraneous semicolons 2014-11-18 08:27:16 -05:00
bunnei
11641b5e79 Archive: Fixed to not destroy archive handle on close. 2014-11-17 22:19:14 -05:00
bunnei
bcb0dbf7e1 Archive: Fixed close archive before freeing. 2014-11-17 22:19:14 -05:00
bunnei
3e09c07378 FS_User: Support FileSye::Path in a more generic way.
added a todo to kernel archive
2014-11-17 22:18:58 -05:00
bunnei
a3107a6b57 FileSys: Updated backend code to use FileSys::Path instead of string for paths. 2014-11-17 21:49:24 -05:00
Lioncash
ac58b76e71 Fix two format strings. 2014-11-14 12:08:26 -05:00
archshift
04c90c395d Added CreateDirectory function to service/fs.cpp, and in Archive. 2014-11-02 10:48:28 -08:00
Sean
9a012ff007 Fix some warnings 2014-10-29 20:26:15 -04:00
Yuri Kunde Schlesner
d72708c1f5 Add override keyword through the code.
This was automated using `clang-modernize`.
2014-10-26 16:18:05 -02:00
Emmanuel Gil Peyrot
0be5c03176 FileSys: split the constructor into an Open method, in order to notify the opener something went wrong.
Kernel: Return an invalid handle to OpenFile when it failed to open.
2014-10-06 19:58:42 +02:00
Emmanuel Gil Peyrot
23c2fbfc7a FileSys/Kernel: Implement SetSize service call for File objects. 2014-10-06 19:58:37 +02:00
archshift
1966f7b0ad Use the citra user path for the sdmc directory 2014-09-21 09:34:33 -07:00
Emmanuel Gil Peyrot
3a570a9fee Kernel: Implement the Close command for Archive, File and Directory. 2014-09-17 14:35:46 +00:00
Emmanuel Gil Peyrot
c197ce2180 Kernel: Add a Directory object and a getter for it from an Archive object. 2014-09-17 14:35:46 +00:00
Emmanuel Gil Peyrot
19d04f3abe Kernel: Add a File object and a getter for it from an Archive object. 2014-09-17 14:35:46 +00:00
Lioncash
741321ac24 Core: Get rid of unnecessary switch statement in Kernel 2014-09-14 21:31:09 -04:00
archshift
6e606c515f core: Prune redundant includes 2014-09-08 17:54:14 -07:00
bunnei
304999dfeb Threading: Fix thread starting to execute first instruction correctly. 2014-08-28 17:51:49 -04:00
archshift
4c4a01bf41 Added FS functions to Archive and Archive_RomFS 2014-08-22 15:45:10 -07:00
Lioncash
ab4648d3ca Core: Use std::array for managing kernel object space
These avoid relying on memset for clearing the arrays.
2014-08-19 00:32:48 -04:00
Lioncash
98fa3f7cba Core: Alter the kernel string functions to use std::string instead of const char*.
Most functions already operate on std::strings. This also removes the need to manually null terminate thread names.
2014-08-17 23:12:20 -04:00
bunnei
d4bd2f2e5d Thread: Added more descriptive comment to WaitCurrentThread. 2014-08-06 18:19:59 -04:00
bunnei
2542350b85 AddressArbiter: Removed unnecessary HLE::Reschedule. 2014-08-05 23:54:28 -04:00
bunnei
60078baab1 AddressArbiter: Fixed bug with break statements missing from case statements. 2014-08-05 23:54:27 -04:00
bunnei
7a1f813be1 Kernel: Updated Event and Mutex to specify handle that they are blocking for. 2014-08-05 20:14:51 -04:00
bunnei
3eb89f3e98 Kernel: Added preliminary support for address arbiters.
AddressArbiter: Added documentation comment, fixed whitespace issue.

AddressArbiter: Fixed incorrect comment, reordered if-statement to be more clear.

SVC: Removed trailing whitespace.
2014-07-08 18:46:38 -04:00
bunnei
ba840d3200 Thread: Added functions to resume threads from address arbitration.
Thread: Cleaned up arbitrate address functions.

Thread: Cleaned up ArbitrateAllThreads function.
2014-07-08 18:46:15 -04:00
bunnei
7ff92c36ed SharedMemory: Updated MapSharedMemory to use an enum for permissions.
- Also added some safety checks to MapSharedMemory.
2014-07-05 10:24:54 -04:00
bunnei
e547128185 Kernel: Added support for shared memory objects.
SharedMemory: Added optional name field for tracking known objects.
2014-07-05 01:21:05 -04:00
bunnei
542700ccb7 Archive: Added Init/Shutdown methods to reset kernel archive state. 2014-07-04 20:37:51 -04:00
bunnei
17a6148f9d FileSys: Added preliminary support for applications reading the RomFS archive.
Archive: Fixed brace ugliness for neobrain :)

FS: Commented out unused local variables to prevent warnings.

...But keeping them here for future use.

archive_romfs: Removed unused #include.
2014-07-04 20:37:45 -04:00
bunnei
8b8c8f4c13 Kernel: Added stubbed code to support creation of kernel Archive objects. 2014-06-27 16:58:30 -04:00
bunnei
b45a38f557 Kernel: Removed unnecessary "#pragma once". 2014-06-13 09:51:20 -04:00
bunnei
f49ac3a2d7 Kernel: Added freeing of kernel objects on emulator shutdown. 2014-06-13 09:51:19 -04:00
bunnei
83a4ad2885 Event: Updated several log messages to be assertions. 2014-06-13 09:51:18 -04:00
bunnei
b62ef4bbd2 Thread: Renamed occurrences of "t" to "thread" to improve readability. 2014-06-13 09:51:17 -04:00
bunnei
5b7cf50a77 Thread: Cleaned up VerifyWait, fixed issue where nullptr msg could unnecessarily be logged. 2014-06-13 09:51:16 -04:00
bunnei
4620e2a741 HLE: Removed usnused EatCycles function. 2014-06-13 09:51:16 -04:00
bunnei
bfdd874b1f Thread: Moved position of * in arguments. 2014-06-13 09:51:14 -04:00
bunnei
12e2a59565 Thread: Updated VerifyWait to be more readable (but functionally the same). 2014-06-13 09:51:14 -04:00
bunnei
c95972275e HLE: Updated all uses of NULL to nullptr (to be C++11 compliant) 2014-06-13 09:51:13 -04:00
bunnei
5365ca157d Kernel: Updated various kernel function "name" arguments to be const references. 2014-06-13 09:51:12 -04:00
bunnei
d7363322c7 HLE: Updated various handle debug assertions to be more clear. 2014-06-13 09:51:11 -04:00
bunnei
780a443b08 Mutex: Moved ReleaseMutex iterator declaration to be inside while loop. 2014-06-13 09:51:11 -04:00
bunnei
8cac527c94 Kernel: Updated several member functions to be const 2014-06-13 09:51:10 -04:00
bunnei
b774b8b04e Thread: Fixed bug with ResetThread where cpu_registers[15] was being incorrectly set 2014-06-13 09:51:08 -04:00
bunnei
aae9fcf4a4 Kernel: Made SyncRequest not pure virtual, with a default implementation of error (as this is not required for all kernel objects) 2014-06-13 09:51:08 -04:00
bunnei
f5c7c15434 Kernel: Added real support for thread and event blocking
- SVC: Added ExitThread support
- SVC: Added SignalEvent support
- Thread: Added WAITTYPE_EVENT for waiting threads for event signals
- Thread: Added support for blocking on other threads to finish (e.g. Thread::Join)
- Thread: Added debug function for printing current threads ready for execution
- Thread: Removed hack/broken thread ready state code from Kernel::Reschedule
- Mutex: Moved WaitCurrentThread from SVC to Mutex::WaitSynchronization
- Event: Added support for blocking threads on event signalling

Kernel: Added missing algorithm #include for use of std::find on non-Windows platforms.
2014-06-13 09:51:02 -04:00
bunnei
ce1c561278 kernel: changed current default thread priority back to 0x30 - I think this is more correct 2014-06-05 00:20:58 -04:00
bunnei
b78aff8585 svc: added optional name field to Event and Mutex (used for debugging) 2014-06-02 20:38:34 -04:00
bunnei
8c0f02a70c kernel: moved position of * for GetTypeName and GetName 2014-06-02 20:36:58 -04:00
bunnei
3fb31fbc57 svc: added GetThreadPriority and SetThreadPriority, added (incomplete) DuplicateHandle support 2014-06-01 22:12:54 -04:00
bunnei
10447d1f48 kernel: changed main thread priority to default, updated Kernel::Reschedule to use PrepareReschedule 2014-06-01 21:42:50 -04:00
bunnei
ba98e25e97 thread: updated Reschedule to sit at a synchronization barrier when no other threads are ready for execution 2014-06-01 10:35:42 -04:00
bunnei
f7cececc5c event: added a hackish ability to set an event as "locked" to its current state, cleaned up some comments 2014-06-01 10:33:55 -04:00
bunnei
d8a2c8c657 mutex: fixed typo in ReleaseMutex 2014-05-29 23:31:01 -04:00
bunnei
d51c84dde2 event: added support for ClearEvent, fixed a bug with CreateEvent, fixed some comments 2014-05-29 20:00:44 -04:00
bunnei
2ed6652f10 mutex: added preliminary SyncRequest/WaitSynchronization, added some comments/assertions 2014-05-27 22:42:16 -04:00
bunnei
ea8627d536 event: fixed typos and updated CMakeLists 2014-05-27 22:14:38 -04:00
bunnei
beea6f054a event: added SetEventLocked method to change status an events lock 2014-05-27 22:14:00 -04:00
bunnei
fd69fd0325 kernel: added event module to support creation of CTR "Event" objects 2014-05-27 20:16:13 -04:00
bunnei
d493d725ac mutex: removed docstring comment that is no longer relevant 2014-05-26 22:49:11 -04:00
bunnei
93cd5a0691 mutex: added additional docstrings 2014-05-26 22:47:47 -04:00
bunnei
a432dc8f39 kernel: added WaitSynchronization method to Kernel::Object 2014-05-26 22:17:49 -04:00
bunnei
58a3adcdd2 kernel: updated SyncRequest to take boolean thread wait result as a parameter 2014-05-26 22:12:46 -04:00
bunnei
3d7693f75f kernel: added enum for known CurrentThread and CurrentProcess handles 2014-05-26 21:56:23 -04:00
bunnei
d73d782ba7 kernel: add a SyncRequest method to KernelObject for use with svcSendSyncRequest 2014-05-26 21:01:27 -04:00
bunnei
b99ac2c3d6 thread: renamed "WaitCurThread" to "WaitCurrentThread", removed unused "reason" argument 2014-05-22 19:36:56 -04:00
bunnei
7c0b006076 thread: removed unused SwitchContext/Reschedule reason field, added missing arg parameter to SVC CreateThread 2014-05-22 19:32:45 -04:00
bunnei
d26f3d4c1f kernel: refactored function naming to remove "__" prefix 2014-05-22 19:06:12 -04:00
bunnei
14bd37c5dc thread: moved ThreadStatus/WaitType to header, added support for arg on CreateThread, added correct CPSR reset 2014-05-22 18:50:36 -04:00
bunnei
6a78be5930 thread: fixed bug where result of __NextThread was not being properly checked when NULL 2014-05-21 21:42:18 -04:00
bunnei
eb537c560a mutex: refactored the interface to code to return a Mutex* handle 2014-05-20 23:23:58 -04:00
bunnei
978e1d4653 mutex: initial commit of HLE module 2014-05-20 23:03:45 -04:00
bunnei
1c5802c35a kernel: fixed include, in general include "common.h" not "common_types.h" 2014-05-20 22:27:46 -04:00
bunnei
203541da11 thread: added correct lowest thread priority, added a thread priority check, and added some comments 2014-05-20 21:02:35 -04:00
bunnei
bed4e920fa thread: exposed ResumeThreadFromWait function for use in other kernel modules 2014-05-20 21:00:10 -04:00
bunnei
75c6d2a8fa thread: moved threading calls to the Kernel namespace 2014-05-20 19:37:46 -04:00
bunnei
49dc2ce8ac ARM_Interface: added SaveContext and LoadContext functions for HLE thread switching 2014-05-20 18:50:16 -04:00
bunnei
143bba2045 renamed "syscall" module to "svc" (more accurate naming) 2014-05-20 18:28:38 -04:00
bunnei
f654a03f1f thread: whitespace change - fixed * and & placement 2014-05-20 18:20:35 -04:00
bunnei
44336329ed - created a Kernel namespace
- cleaned up Kernel code a bit (moved stuff into namespace, fixed whitespace issues)
- added handle types for all different CTROS handles
2014-05-20 18:13:25 -04:00
bunnei
f5a119a367 thread: added declaration for __KernelReschedule to be used by syscall module 2014-05-19 22:19:48 -04:00
bunnei
eab6fd01d7 - updated service(s) to be KernelObject's
- various cleanups
2014-05-18 21:43:29 -04:00
bunnei
772abad778 - moved Handle/Result definitions to kernel.h
- added ResetType enum
2014-05-18 18:12:29 -04:00
bunnei
09b8e8fb6a changed a comment 2014-05-17 13:47:55 -04:00
bunnei
14ae026386 - added enum ThreadProcessorId
- reorganized some kernel thread functions
- added placeholder __KernelWaitThread_Synchronization function
2014-05-17 00:56:00 -04:00
bunnei
7cdb705059 - replaced KERNELOBJECT_MAX_NAME_LENGTH with KERNEL_MAX_NAME_LENGTH
- added KERNEL_DEFAULT_STACK_SIZE definition (0x4000)
2014-05-16 23:48:15 -04:00
bunnei
940330c6e1 completely gutted/refactored threading code to be simpler 2014-05-15 18:27:08 -04:00
bunnei
a7cc430aa4 changed "UID" to "Handle" to be a little more consistent with CTR naming 2014-05-15 18:26:28 -04:00
bunnei
b99a5da65b - added helper function for __KernelCreateThread
- added __KernelSwitchToThread for enabling a thread
- added __KernelRotateThreadReadyQueue
2014-05-14 20:50:30 -04:00
bunnei
9f5588725c changed primary thread priority to 0x30 - this is typical, not 0x31 2014-05-14 20:49:27 -04:00
bunnei
0de78eb3c4 fixed thread reset to not set stack address 2014-05-13 23:18:28 -04:00
bunnei
7d078189da various cleanups / remove unused code 2014-05-13 22:29:31 -04:00
bunnei
3838d46b90 added a bunch of threading code, recycled from PPSSPP, with lots of hacks in for 3DS... doesn't really do much yet. Just a jumping off point 2014-05-13 22:00:11 -04:00
bunnei
1583d2b6f3 - added __KernelLoadExec function
- fixed some logging
2014-05-13 21:57:12 -04:00
bunnei
6b264518a5 added initial kernel/thread modules 2014-05-09 22:11:18 -04:00