summaryrefslogtreecommitdiffstats
path: root/c/src/exec/score/src/threadhandler.c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1999-08-30 18:05:48 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1999-08-30 18:05:48 +0000
commit260b0c2155d809beb550b13fa4fcb08408af5d3f (patch)
tree3a3e630343dec8dc534a61a14e66476212269493 /c/src/exec/score/src/threadhandler.c
parentPatch from Ralf Corsepius <corsepiu@faw.uni-ulm.de>: (diff)
downloadrtems-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.c37
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(