You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by aa...@apache.org on 2001/12/27 18:03:00 UTC
cvs commit: apr/test testthread.c
aaron 01/12/27 09:03:00
Modified: include apr_thread_proc.h
include/arch/netware threadproc.h
include/arch/os2 threadproc.h
include/arch/unix threadproc.h
include/arch/win32 threadproc.h
threadproc/beos thread.c
threadproc/netware thread.c
threadproc/os2 thread.c
threadproc/unix thread.c
threadproc/win32 thread.c
test testthread.c
Log:
Convert apr_thread_exit(..., apr_status_t *retval) to
apr_thread_exit(..., apr_status_t retval) so that status values
can actually be returned back to apr_thread_join.
This patch converts all platforms to store the returned status
in the platform-specific opaque thread structure.
Revision Changes Path
1.78 +1 -1 apr/include/apr_thread_proc.h
Index: apr_thread_proc.h
===================================================================
RCS file: /home/cvs/apr/include/apr_thread_proc.h,v
retrieving revision 1.77
retrieving revision 1.78
diff -u -r1.77 -r1.78
--- apr_thread_proc.h 2001/11/27 22:10:31 1.77
+++ apr_thread_proc.h 2001/12/27 17:02:59 1.78
@@ -227,7 +227,7 @@
* @param retval The return value to pass back to any thread that cares
*/
APR_DECLARE(apr_status_t) apr_thread_exit(apr_thread_t *thd,
- apr_status_t *retval);
+ apr_status_t retval);
/**
* block until the desired thread stops executing.
1.4 +1 -0 apr/include/arch/netware/threadproc.h
Index: threadproc.h
===================================================================
RCS file: /home/cvs/apr/include/arch/netware/threadproc.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- threadproc.h 2001/10/05 16:56:21 1.3
+++ threadproc.h 2001/12/27 17:03:00 1.4
@@ -72,6 +72,7 @@
apr_int32_t cancel_how;
void *data;
apr_thread_start_t func;
+ apr_status_t exitval;
};
struct apr_threadattr_t {
1.13 +1 -1 apr/include/arch/os2/threadproc.h
Index: threadproc.h
===================================================================
RCS file: /home/cvs/apr/include/arch/os2/threadproc.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- threadproc.h 2001/09/02 05:44:43 1.12
+++ threadproc.h 2001/12/27 17:03:00 1.13
@@ -74,7 +74,7 @@
unsigned long tid;
apr_thread_start_t func;
void *data;
- apr_status_t rv;
+ apr_status_t exitval;
};
struct apr_threadkey_t {
1.21 +1 -0 apr/include/arch/unix/threadproc.h
Index: threadproc.h
===================================================================
RCS file: /home/cvs/apr/include/arch/unix/threadproc.h,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- threadproc.h 2001/08/27 03:17:15 1.20
+++ threadproc.h 2001/12/27 17:03:00 1.21
@@ -92,6 +92,7 @@
pthread_t *td;
void *data;
apr_thread_start_t func;
+ apr_status_t exitval;
};
struct apr_threadattr_t {
1.17 +1 -0 apr/include/arch/win32/threadproc.h
Index: threadproc.h
===================================================================
RCS file: /home/cvs/apr/include/arch/win32/threadproc.h,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- threadproc.h 2001/09/09 06:03:05 1.16
+++ threadproc.h 2001/12/27 17:03:00 1.17
@@ -68,6 +68,7 @@
apr_int32_t cancel_how;
void *data;
apr_thread_start_t func;
+ apr_status_t exitval;
};
struct apr_threadattr_t {
1.30 +2 -2 apr/threadproc/beos/thread.c
Index: thread.c
===================================================================
RCS file: /home/cvs/apr/threadproc/beos/thread.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- thread.c 2001/10/29 17:29:32 1.29
+++ thread.c 2001/12/27 17:03:00 1.30
@@ -142,10 +142,10 @@
return tid1 == tid2;
}
-APR_DECLARE(apr_status_t) apr_thread_exit(apr_thread_t *thd, apr_status_t *retval)
+APR_DECLARE(apr_status_t) apr_thread_exit(apr_thread_t *thd, apr_status_t retval)
{
apr_pool_destroy(thd->cntxt);
- thd->exitval = *retval;
+ thd->exitval = retval;
exit_thread ((status_t)(*retval));
/* This will never be reached... */
return APR_SUCCESS;
1.9 +5 -3 apr/threadproc/netware/thread.c
Index: thread.c
===================================================================
RCS file: /home/cvs/apr/threadproc/netware/thread.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- thread.c 2001/12/11 19:40:50 1.8
+++ thread.c 2001/12/27 17:03:00 1.9
@@ -182,10 +182,11 @@
}
apr_status_t apr_thread_exit(apr_thread_t *thd,
- apr_status_t *retval)
+ apr_status_t retval)
{
+ thd->exitval = retval;
apr_pool_destroy(thd->cntxt);
- NXThreadExit((void *)*retval);
+ NXThreadExit(NULL);
return APR_SUCCESS;
}
@@ -195,7 +196,8 @@
apr_status_t stat;
NXThreadId_t dthr;
- if ((stat = NXThreadJoin(thd->td, &dthr, (void *)&retval)) == 0) {
+ if ((stat = NXThreadJoin(thd->td, &dthr, NULL)) == 0) {
+ *retval = thd->exitval;
return APR_SUCCESS;
}
else {
1.30 +3 -3 apr/threadproc/os2/thread.c
Index: thread.c
===================================================================
RCS file: /home/cvs/apr/threadproc/os2/thread.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- thread.c 2001/09/02 05:34:55 1.29
+++ thread.c 2001/12/27 17:03:00 1.30
@@ -154,9 +154,9 @@
-APR_DECLARE(apr_status_t) apr_thread_exit(apr_thread_t *thd, apr_status_t *retval)
+APR_DECLARE(apr_status_t) apr_thread_exit(apr_thread_t *thd, apr_status_t retval)
{
- thd->rv = *retval;
+ thd->exitval = retval;
_endthread();
return -1; /* If we get here something's wrong */
}
@@ -176,7 +176,7 @@
if (rc == ERROR_INVALID_THREADID)
rc = 0; /* Thread had already terminated */
- *retval = (apr_status_t)thd->rv;
+ *retval = thd->exitval;
return APR_OS2_STATUS(rc);
}
1.49 +4 -3 apr/threadproc/unix/thread.c
Index: thread.c
===================================================================
RCS file: /home/cvs/apr/threadproc/unix/thread.c,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -r1.48 -r1.49
--- thread.c 2001/09/02 03:44:37 1.48
+++ thread.c 2001/12/27 17:03:00 1.49
@@ -176,10 +176,11 @@
return pthread_equal(tid1, tid2);
}
-APR_DECLARE(apr_status_t) apr_thread_exit(apr_thread_t *thd, apr_status_t *retval)
+APR_DECLARE(apr_status_t) apr_thread_exit(apr_thread_t *thd, apr_status_t retval)
{
+ thd->exitval = retval;
apr_pool_destroy(thd->cntxt);
- pthread_exit(retval);
+ pthread_exit(NULL);
return APR_SUCCESS;
}
@@ -189,7 +190,7 @@
apr_status_t *thread_stat;
if ((stat = pthread_join(*thd->td,(void *)&thread_stat)) == 0) {
- *retval = thread_stat ? *thread_stat : APR_SUCCESS;
+ *retval = thd->exitval;
return APR_SUCCESS;
}
else {
1.41 +5 -6 apr/threadproc/win32/thread.c
Index: thread.c
===================================================================
RCS file: /home/cvs/apr/threadproc/win32/thread.c,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -r1.40 -r1.41
--- thread.c 2001/11/27 02:32:37 1.40
+++ thread.c 2001/12/27 17:03:00 1.41
@@ -140,10 +140,11 @@
}
APR_DECLARE(apr_status_t) apr_thread_exit(apr_thread_t *thd,
- apr_status_t *retval)
+ apr_status_t retval)
{
+ thd->exitval = retval;
apr_pool_destroy(thd->cntxt);
- _endthreadex(*retval);
+ _endthreadex(0);
return APR_SUCCESS;
}
@@ -153,10 +154,8 @@
apr_status_t stat;
if ((stat = WaitForSingleObject(thd->td, INFINITE)) == WAIT_OBJECT_0) {
- if (GetExitCodeThread(thd->td, retval) == 0) {
- return APR_SUCCESS;
- }
- return apr_get_os_error();
+ *retval = thd->exitval;
+ return APR_SUCCESS;
}
else {
return stat;
1.26 +1 -1 apr/test/testthread.c
Index: testthread.c
===================================================================
RCS file: /home/cvs/apr/test/testthread.c,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -r1.25 -r1.26
--- testthread.c 2001/10/29 17:37:12 1.25
+++ testthread.c 2001/12/27 17:03:00 1.26
@@ -102,7 +102,7 @@
x++;
apr_lock_release(thread_lock);
}
- apr_thread_exit(thd, &exit_ret_val);
+ apr_thread_exit(thd, exit_ret_val);
return NULL;
}
Re: cvs commit: apr/test testthread.c
Posted by Aaron Bannert <aa...@clove.org>.
On Fri, Dec 28, 2001 at 10:03:57AM +1000, Brian Havard wrote:
> > Log:
> > Convert apr_thread_exit(..., apr_status_t *retval) to
> > apr_thread_exit(..., apr_status_t retval) so that status values
> > can actually be returned back to apr_thread_join.
> >
> > This patch converts all platforms to store the returned status
> > in the platform-specific opaque thread structure.
>
> Ok, but wouldn't it make sense for apr_thread_start_t to have a return type
> of apr_status_t too rather than void *? That way a return from the thread
> has the same type as apr_thread_exit().
A problem with this is that it introduces a second way to return a
status from an exiting thread. One reason we need apr_thread_exit is
so that we can exit the thread without falling all the way back to the
initially called apr_thread_start_t function.
Another reason* why we need apr_thread_exit that I just relized is that
it destroys the thread's pool. If the thread exits w/o calling
apr_thread_exit then it is leaking memory.
-aaron
*I'll rush off and check all apr_thread_create's to make sure they
have all the apr_thread_exit()s that they need.
Re: cvs commit: apr/test testthread.c
Posted by Brian Havard <br...@kheldar.apana.org.au>.
On 27 Dec 2001 17:03:00 -0000, aaron@apache.org wrote:
>aaron 01/12/27 09:03:00
>
> Modified: include apr_thread_proc.h
> include/arch/netware threadproc.h
> include/arch/os2 threadproc.h
> include/arch/unix threadproc.h
> include/arch/win32 threadproc.h
> threadproc/beos thread.c
> threadproc/netware thread.c
> threadproc/os2 thread.c
> threadproc/unix thread.c
> threadproc/win32 thread.c
> test testthread.c
> Log:
> Convert apr_thread_exit(..., apr_status_t *retval) to
> apr_thread_exit(..., apr_status_t retval) so that status values
> can actually be returned back to apr_thread_join.
>
> This patch converts all platforms to store the returned status
> in the platform-specific opaque thread structure.
Ok, but wouldn't it make sense for apr_thread_start_t to have a return type
of apr_status_t too rather than void *? That way a return from the thread
has the same type as apr_thread_exit().
--
______________________________________________________________________________
| Brian Havard | "He is not the messiah! |
| brianh@kheldar.apana.org.au | He's a very naughty boy!" - Life of Brian |
------------------------------------------------------------------------------