You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by dr...@apache.org on 2001/09/11 15:33:39 UTC

cvs commit: apr/include/arch/beos threadproc.h

dreid       01/09/11 06:33:39

  Modified:    threadproc/beos proc.c thread.c threadpriv.c
               include/arch/beos threadproc.h
  Log:
  Tidy up to get us working again...
  
  - add the thread_once stuff (cribbed from OS/2 - thanks Brian)
  - correct the return values we get from threads
  - change thread_join to return the correct value
  
  Revision  Changes    Path
  1.39      +1 -0      apr/threadproc/beos/proc.c
  
  Index: proc.c
  ===================================================================
  RCS file: /home/cvs/apr/threadproc/beos/proc.c,v
  retrieving revision 1.38
  retrieving revision 1.39
  diff -u -r1.38 -r1.39
  --- proc.c	2001/08/10 21:04:48	1.38
  +++ proc.c	2001/09/11 13:33:39	1.39
  @@ -256,6 +256,7 @@
       if ( newproc < B_NO_ERROR) {
           return errno;
       }
  +
       resume_thread(newproc);
   
       if (attr->child_in) {
  
  
  
  1.27      +45 -3     apr/threadproc/beos/thread.c
  
  Index: thread.c
  ===================================================================
  RCS file: /home/cvs/apr/threadproc/beos/thread.c,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- thread.c	2001/08/10 21:04:48	1.26
  +++ thread.c	2001/09/11 13:33:39	1.27
  @@ -144,17 +144,19 @@
   APR_DECLARE(apr_status_t) apr_thread_exit(apr_thread_t *thd, apr_status_t *retval)
   {
       apr_pool_destroy(thd->cntxt);
  -	exit_thread ((status_t)retval);
  +	exit_thread ((status_t)(*retval));
   	return APR_SUCCESS;
   }
   
   APR_DECLARE(apr_status_t) apr_thread_join(apr_status_t *retval, apr_thread_t *thd)
   {
  -    if (wait_for_thread(thd->td,(void *)&retval) == B_NO_ERROR) {
  +    status_t rv = 0, ret;
  +    if ((ret = wait_for_thread(thd->td,&rv)) == B_NO_ERROR) {
  +        *retval = rv;
           return APR_SUCCESS;
       }
       else {
  -        return errno;
  +        return ret;
       }
   }
   
  @@ -201,6 +203,46 @@
           (*thd)->cntxt = cont;
       }
       (*thd)->td = *thethd;
  +    return APR_SUCCESS;
  +}
  +
  +static apr_status_t thread_once_cleanup(void *vcontrol)
  +{
  +    apr_thread_once_t *control = (apr_thread_once_t *)vcontrol;
  +
  +    if (control->sem) {
  +        release_sem(control->sem);
  +        delete_sem(control->sem);
  +    }
  +
  +    return APR_SUCCESS;
  +}
  +
  +APR_DECLARE(apr_status_t) apr_thread_once_init(apr_thread_once_t **control,
  +                                               apr_pool_t *p)
  +{
  +    int rc;
  +    *control = (apr_thread_once_t *)apr_pcalloc(p, sizeof(apr_thread_once_t));
  +    (*control)->hit = 0; /* we haven't done it yet... */
  +    rc = ((*control)->sem = create_sem(1, "thread_once"));
  +    if (rc != 0) {
  +        return rc;
  +    }
  +    apr_pool_cleanup_register(p, control, thread_once_cleanup, apr_pool_cleanup_null);
  +    return APR_SUCCESS;
  +}
  +
  +
  +
  +APR_DECLARE(apr_status_t) apr_thread_once(apr_thread_once_t *control, 
  +                                          void (*func)(void))
  +{
  +    if (!control->hit) {
  +        if (acquire_sem(control->sem) == B_OK) {
  +            control->hit = 1;
  +            func();
  +        }
  +    }
       return APR_SUCCESS;
   }
   
  
  
  
  1.18      +1 -1      apr/threadproc/beos/threadpriv.c
  
  Index: threadpriv.c
  ===================================================================
  RCS file: /home/cvs/apr/threadproc/beos/threadpriv.c,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- threadpriv.c	2001/08/10 21:04:48	1.17
  +++ threadpriv.c	2001/09/11 13:33:39	1.18
  @@ -117,7 +117,7 @@
   APR_DECLARE(apr_status_t) apr_threadkey_private_set(void *priv, apr_threadkey_t *key)
   {
   	thread_id tid;
  -	int i,index = 0, ret;
  +	int i,index = 0, ret = 0;
   
   	tid = find_thread(NULL);	
   	for (i=0; i < BEOS_MAX_DATAKEYS; i++){
  
  
  
  1.19      +5 -0      apr/include/arch/beos/threadproc.h
  
  Index: threadproc.h
  ===================================================================
  RCS file: /home/cvs/apr/include/arch/beos/threadproc.h,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- threadproc.h	2001/07/24 05:16:32	1.18
  +++ threadproc.h	2001/09/11 13:33:39	1.19
  @@ -123,5 +123,10 @@
       apr_int32_t detached;
   };
   
  +struct apr_thread_once_t {
  +    sem_id sem;
  +    int hit;
  +};
  +
   #endif  /* ! THREAD_PROC_H */
   
  
  
  

Re: cvs commit: apr/include/arch/beos threadproc.h

Posted by David Reid <dr...@jetnet.co.uk>.
+1 from me.

(No offence taken :))

david

> [This is not directed at you David. Your patch reminded me that we
>  have this problem everywhere.]
>
>
> On Tue, Sep 11, 2001 at 01:33:39PM -0000, dreid@apache.org wrote:
> >    APR_DECLARE(apr_status_t) apr_thread_exit(apr_thread_t *thd,
apr_status_t *retval)
> >    {
> >        apr_pool_destroy(thd->cntxt);
> >   - exit_thread ((status_t)retval);
> >   + exit_thread ((status_t)(*retval));
> >    return APR_SUCCESS;
> >    }
>
> I still think we should change this prototype to:
> >    APR_DECLARE(apr_status_t) apr_thread_exit(apr_thread_t *thd,
apr_status_t retval)
> There is no good reason that the return status is a pointer. Where is
> that memory supposed to be allocated from? It better not be allocated
> from the thread pool, since that was destroyed on the previous line (not
> just on beos, but all other platforms too IIRC).
>
> I'd like to supply a patch that changes apr_thread_exit() to simply take
> (apr_status_t retval) as the return value, any takers?
>
> -aaron
>
>


Re: cvs commit: apr/include/arch/beos threadproc.h

Posted by Aaron Bannert <aa...@clove.org>.
[This is not directed at you David. Your patch reminded me that we
 have this problem everywhere.]


On Tue, Sep 11, 2001 at 01:33:39PM -0000, dreid@apache.org wrote:
>    APR_DECLARE(apr_status_t) apr_thread_exit(apr_thread_t *thd, apr_status_t *retval)
>    {
>        apr_pool_destroy(thd->cntxt);
>   -	exit_thread ((status_t)retval);
>   +	exit_thread ((status_t)(*retval));
>    	return APR_SUCCESS;
>    }

I still think we should change this prototype to:
>    APR_DECLARE(apr_status_t) apr_thread_exit(apr_thread_t *thd, apr_status_t retval)
There is no good reason that the return status is a pointer. Where is
that memory supposed to be allocated from? It better not be allocated
from the thread pool, since that was destroyed on the previous line (not
just on beos, but all other platforms too IIRC).

I'd like to supply a patch that changes apr_thread_exit() to simply take
(apr_status_t retval) as the return value, any takers?

-aaron