diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-08-30 18:05:48 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-08-30 18:05:48 +0000 |
commit | 260b0c2155d809beb550b13fa4fcb08408af5d3f (patch) | |
tree | 3a3e630343dec8dc534a61a14e66476212269493 /c/src/exec/score/src/threadhandler.c | |
parent | Patch from Ralf Corsepius <corsepiu@faw.uni-ulm.de>: (diff) | |
download | rtems-260b0c2155d809beb550b13fa4fcb08408af5d3f.tar.bz2 |
Patch from Charles-Antoine Gauthier <charles.gauthier@iit.nrc.ca> to add
support for return codes from POSIX threads that do an implicit exit
by returning from the bottom of the main function.
Diffstat (limited to 'c/src/exec/score/src/threadhandler.c')
-rw-r--r-- | c/src/exec/score/src/threadhandler.c | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/c/src/exec/score/src/threadhandler.c b/c/src/exec/score/src/threadhandler.c index bd4e4d319f..6b1d2dc5e2 100644 --- a/c/src/exec/score/src/threadhandler.c +++ b/c/src/exec/score/src/threadhandler.c @@ -86,29 +86,40 @@ void _Thread_Handler( void ) switch ( executing->Start.prototype ) { case THREAD_START_NUMERIC: - (*(Thread_Entry_numeric) executing->Start.entry_point)( - executing->Start.numeric_argument + executing->Wait.return_argument = + (*(Thread_Entry_numeric) executing->Start.entry_point)( + executing->Start.numeric_argument ); break; case THREAD_START_POINTER: - (*(Thread_Entry_pointer) executing->Start.entry_point)( - executing->Start.pointer_argument - ); + executing->Wait.return_argument = + (*(Thread_Entry_pointer) executing->Start.entry_point)( + executing->Start.pointer_argument + ); break; case THREAD_START_BOTH_POINTER_FIRST: - (*(Thread_Entry_both_pointer_first) executing->Start.entry_point)( - executing->Start.pointer_argument, - executing->Start.numeric_argument - ); + executing->Wait.return_argument = + (*(Thread_Entry_both_pointer_first) executing->Start.entry_point)( + executing->Start.pointer_argument, + executing->Start.numeric_argument + ); break; case THREAD_START_BOTH_NUMERIC_FIRST: - (*(Thread_Entry_both_numeric_first) executing->Start.entry_point)( - executing->Start.numeric_argument, - executing->Start.pointer_argument - ); + executing->Wait.return_argument = + (*(Thread_Entry_both_numeric_first) executing->Start.entry_point)( + executing->Start.numeric_argument, + executing->Start.pointer_argument + ); break; } + /* + * In the switch above, the return code from the user thread body + * was placed in return_argument. This assumed that if it returned + * anything (which is not supporting in all APIs), then it would be + * able to fit in a (void *). + */ + _User_extensions_Thread_exitted( executing ); _Internal_error_Occurred( |