⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testmutexscope.c

📁 apache的软件linux版本
💻 C
字号:
/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements.  See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */#include <assert.h>#include <errno.h>#include <stdio.h>#include <stdlib.h>#include "apr.h"#include "apr_general.h"#include "apr_proc_mutex.h"#include "apr_global_mutex.h"#include "apr_thread_proc.h"#if !APR_HAS_THREADSint main(void){    printf("This test requires APR thread support.\n");    return 0;}#else /* APR_HAS_THREADS */static apr_thread_mutex_t *thread_mutex;static apr_proc_mutex_t *proc_mutex;static apr_global_mutex_t *global_mutex;static apr_pool_t *p;static volatile int counter;typedef enum {TEST_GLOBAL, TEST_PROC} test_mode_e;static void lock_init(apr_lockmech_e mech, test_mode_e test_mode){    if (test_mode == TEST_PROC) {        assert(apr_proc_mutex_create(&proc_mutex,                                     NULL,                                     mech,                                     p) == APR_SUCCESS);    }    else {        assert(apr_global_mutex_create(&global_mutex,                                       NULL,                                       mech,                                       p) == APR_SUCCESS);    }}static void lock_destroy(test_mode_e test_mode){    if (test_mode == TEST_PROC) {        assert(apr_proc_mutex_destroy(proc_mutex) == APR_SUCCESS);    }    else {        assert(apr_global_mutex_destroy(global_mutex) == APR_SUCCESS);    }}static void lock_grab(test_mode_e test_mode){    if (test_mode == TEST_PROC) {        assert(apr_proc_mutex_lock(proc_mutex) == APR_SUCCESS);    }    else {        assert(apr_global_mutex_lock(global_mutex) == APR_SUCCESS);    }}static void lock_release(test_mode_e test_mode){    if (test_mode == TEST_PROC) {        assert(apr_proc_mutex_unlock(proc_mutex) == APR_SUCCESS);    }    else {        assert(apr_global_mutex_unlock(global_mutex) == APR_SUCCESS);    }}static void * APR_THREAD_FUNC eachThread(apr_thread_t *id, void *p){    test_mode_e test_mode = (test_mode_e)p;    lock_grab(test_mode);    ++counter;    assert(apr_thread_mutex_lock(thread_mutex) == APR_SUCCESS);    assert(apr_thread_mutex_unlock(thread_mutex) == APR_SUCCESS);    lock_release(test_mode);    return NULL;}static void test_mech_mode(apr_lockmech_e mech, const char *mech_name,                           test_mode_e test_mode){  apr_thread_t *threads[20];  int numThreads = 5;  int i;  apr_status_t rv;  printf("Trying %s mutexes with mechanism `%s'...\n",         test_mode == TEST_GLOBAL ? "global" : "proc", mech_name);  assert(numThreads <= sizeof(threads) / sizeof(threads[0]));  assert(apr_pool_create(&p, NULL) == APR_SUCCESS);  assert(apr_thread_mutex_create(&thread_mutex, 0, p) == APR_SUCCESS);  assert(apr_thread_mutex_lock(thread_mutex) == APR_SUCCESS);    lock_init(mech, test_mode);  counter = 0;  i = 0;  while (i < numThreads)  {    rv = apr_thread_create(&threads[i],                           NULL,                           eachThread,                           (void *)test_mode,                           p);    if (rv != APR_SUCCESS) {      fprintf(stderr, "apr_thread_create->%d\n", rv);      exit(1);    }    ++i;  }  apr_sleep(apr_time_from_sec(5));  if (test_mode == TEST_PROC) {      printf("  Mutex mechanism `%s' is %sglobal in scope on this platform.\n",             mech_name, counter == 1 ? "" : "not ");  }  else {      if (counter != 1) {          fprintf(stderr, "\n!!!apr_global_mutex operations are broken on this "                  "platform for mutex mechanism `%s'!\n"                  "They don't block out threads within the same process.\n",                  mech_name);          fprintf(stderr, "counter value: %d\n", counter);          exit(1);      }      else {          printf("  no problems encountered...\n");      }  }    assert(apr_thread_mutex_unlock(thread_mutex) == APR_SUCCESS);  i = 0;  while (i < numThreads)  {    apr_status_t ignored;    rv = apr_thread_join(&ignored,                         threads[i]);    assert(rv == APR_SUCCESS);    ++i;  }  lock_destroy(test_mode);  apr_thread_mutex_destroy(thread_mutex);  apr_pool_destroy(p);}static void test_mech(apr_lockmech_e mech, const char *mech_name){    test_mech_mode(mech, mech_name, TEST_PROC);    test_mech_mode(mech, mech_name, TEST_GLOBAL);}int main(void){    struct {        apr_lockmech_e mech;        const char *mech_name;    } lockmechs[] = {        {APR_LOCK_DEFAULT, "default"}#if APR_HAS_FLOCK_SERIALIZE        ,{APR_LOCK_FLOCK, "flock"}#endif#if APR_HAS_SYSVSEM_SERIALIZE        ,{APR_LOCK_SYSVSEM, "sysvsem"}#endif#if APR_HAS_POSIXSEM_SERIALIZE        ,{APR_LOCK_POSIXSEM, "posix"}#endif#if APR_HAS_FCNTL_SERIALIZE        ,{APR_LOCK_FCNTL, "fcntl"}#endif#if APR_HAS_PROC_PTHREAD_SERIALIZE        ,{APR_LOCK_PROC_PTHREAD, "proc_pthread"}#endif    };    int i;            assert(apr_initialize() == APR_SUCCESS);    for (i = 0; i < sizeof(lockmechs) / sizeof(lockmechs[0]); i++) {        test_mech(lockmechs[i].mech, lockmechs[i].mech_name);    }        apr_terminate();    return 0;}#endif /* APR_HAS_THREADS */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -