"Fossies" - the Fresh Open Source Software Archive

Member "apr-1.7.0/locks/unix/thread_cond.c" (5 Mar 2016, 3746 Bytes) of package /linux/www/apr-1.7.0.tar.bz2:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "thread_cond.c" see the Fossies "Dox" file reference documentation and the latest Fossies "Diffs" side-by-side code changes report: 1.6.5_vs_1.7.0.

    1 /* Licensed to the Apache Software Foundation (ASF) under one or more
    2  * contributor license agreements.  See the NOTICE file distributed with
    3  * this work for additional information regarding copyright ownership.
    4  * The ASF licenses this file to You under the Apache License, Version 2.0
    5  * (the "License"); you may not use this file except in compliance with
    6  * the License.  You may obtain a copy of the License at
    7  *
    8  *     http://www.apache.org/licenses/LICENSE-2.0
    9  *
   10  * Unless required by applicable law or agreed to in writing, software
   11  * distributed under the License is distributed on an "AS IS" BASIS,
   12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   13  * See the License for the specific language governing permissions and
   14  * limitations under the License.
   15  */
   16 
   17 #include "apr.h"
   18 
   19 #if APR_HAS_THREADS
   20 
   21 #include "apr_arch_thread_mutex.h"
   22 #include "apr_arch_thread_cond.h"
   23 
   24 static apr_status_t thread_cond_cleanup(void *data)
   25 {
   26     apr_thread_cond_t *cond = (apr_thread_cond_t *)data;
   27     apr_status_t rv;
   28 
   29     rv = pthread_cond_destroy(&cond->cond);
   30 #ifdef HAVE_ZOS_PTHREADS
   31     if (rv) {
   32         rv = errno;
   33     }
   34 #endif
   35     return rv;
   36 } 
   37 
   38 APR_DECLARE(apr_status_t) apr_thread_cond_create(apr_thread_cond_t **cond,
   39                                                  apr_pool_t *pool)
   40 {
   41     apr_thread_cond_t *new_cond;
   42     apr_status_t rv;
   43 
   44     new_cond = apr_palloc(pool, sizeof(apr_thread_cond_t));
   45 
   46     new_cond->pool = pool;
   47 
   48     if ((rv = pthread_cond_init(&new_cond->cond, NULL))) {
   49 #ifdef HAVE_ZOS_PTHREADS
   50         rv = errno;
   51 #endif
   52         return rv;
   53     }
   54 
   55     apr_pool_cleanup_register(new_cond->pool,
   56                               (void *)new_cond, thread_cond_cleanup,
   57                               apr_pool_cleanup_null);
   58 
   59     *cond = new_cond;
   60     return APR_SUCCESS;
   61 }
   62 
   63 APR_DECLARE(apr_status_t) apr_thread_cond_wait(apr_thread_cond_t *cond,
   64                                                apr_thread_mutex_t *mutex)
   65 {
   66     apr_status_t rv;
   67 
   68     rv = pthread_cond_wait(&cond->cond, &mutex->mutex);
   69 #ifdef HAVE_ZOS_PTHREADS
   70     if (rv) {
   71         rv = errno;
   72     }
   73 #endif
   74     return rv;
   75 }
   76 
   77 APR_DECLARE(apr_status_t) apr_thread_cond_timedwait(apr_thread_cond_t *cond,
   78                                                     apr_thread_mutex_t *mutex,
   79                                                     apr_interval_time_t timeout)
   80 {
   81     apr_status_t rv;
   82     if (timeout < 0) {
   83         rv = pthread_cond_wait(&cond->cond, &mutex->mutex);
   84 #ifdef HAVE_ZOS_PTHREADS
   85         if (rv) {
   86             rv = errno;
   87         }
   88 #endif
   89     }
   90     else {
   91         apr_time_t then;
   92         struct timespec abstime;
   93 
   94         then = apr_time_now() + timeout;
   95         abstime.tv_sec = apr_time_sec(then);
   96         abstime.tv_nsec = apr_time_usec(then) * 1000; /* nanoseconds */
   97 
   98         rv = pthread_cond_timedwait(&cond->cond, &mutex->mutex, &abstime);
   99 #ifdef HAVE_ZOS_PTHREADS
  100         if (rv) {
  101             rv = errno;
  102         }
  103 #endif
  104         if (ETIMEDOUT == rv) {
  105             return APR_TIMEUP;
  106         }
  107     }
  108     return rv;
  109 }
  110 
  111 
  112 APR_DECLARE(apr_status_t) apr_thread_cond_signal(apr_thread_cond_t *cond)
  113 {
  114     apr_status_t rv;
  115 
  116     rv = pthread_cond_signal(&cond->cond);
  117 #ifdef HAVE_ZOS_PTHREADS
  118     if (rv) {
  119         rv = errno;
  120     }
  121 #endif
  122     return rv;
  123 }
  124 
  125 APR_DECLARE(apr_status_t) apr_thread_cond_broadcast(apr_thread_cond_t *cond)
  126 {
  127     apr_status_t rv;
  128 
  129     rv = pthread_cond_broadcast(&cond->cond);
  130 #ifdef HAVE_ZOS_PTHREADS
  131     if (rv) {
  132         rv = errno;
  133     }
  134 #endif
  135     return rv;
  136 }
  137 
  138 APR_DECLARE(apr_status_t) apr_thread_cond_destroy(apr_thread_cond_t *cond)
  139 {
  140     return apr_pool_cleanup_run(cond->pool, cond, thread_cond_cleanup);
  141 }
  142 
  143 APR_POOL_IMPLEMENT_ACCESSOR(thread_cond)
  144 
  145 #endif /* APR_HAS_THREADS */