Return-Path: Delivered-To: apmail-apr-cvs-archive@apr.apache.org Received: (qmail 83127 invoked by uid 500); 19 Sep 2001 20:14:21 -0000 Mailing-List: contact cvs-help@apr.apache.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Reply-To: dev@apr.apache.org Delivered-To: mailing list cvs@apr.apache.org Received: (qmail 83116 invoked from network); 19 Sep 2001 20:14:21 -0000 Date: 19 Sep 2001 20:08:05 -0000 Message-ID: <20010919200805.77185.qmail@icarus.apache.org> From: rbb@apache.org To: apr-cvs@apache.org Subject: cvs commit: apr/test testprocmutex.c Makefile.in X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N rbb 01/09/19 13:08:05 Modified: . CHANGES test Makefile.in Added: test testprocmutex.c Log: Add a test for the new process mutex, and a CHANGES entry about the process locks. Revision Changes Path 1.158 +2 -0 apr/CHANGES Index: CHANGES =================================================================== RCS file: /home/cvs/apr/CHANGES,v retrieving revision 1.157 retrieving revision 1.158 diff -u -r1.157 -r1.158 --- CHANGES 2001/09/19 15:09:41 1.157 +++ CHANGES 2001/09/19 20:08:05 1.158 @@ -1,5 +1,7 @@ Changes with APR b1 + *) Add process locking API to APR. [Aaron Bannert ] + *) Add condition variables for Windows. [Ryan Bloom] *) Add condition variables to the APR set of locking functions. 1.67 +5 -1 apr/test/Makefile.in Index: Makefile.in =================================================================== RCS file: /home/cvs/apr/test/Makefile.in,v retrieving revision 1.66 retrieving revision 1.67 diff -u -r1.66 -r1.67 --- Makefile.in 2001/09/10 15:47:25 1.66 +++ Makefile.in 2001/09/19 20:08:05 1.67 @@ -29,7 +29,8 @@ occhild@EXEEXT@ \ teststr@EXEEXT@ \ testuser@EXEEXT@ \ - testsockets@EXEEXT@ + testsockets@EXEEXT@ \ + testprocmutex@EXEEXT@ TARGETS = $(PROGRAMS) @@ -140,5 +141,8 @@ testuser@EXEEXT@: testuser.lo $(LOCAL_LIBS) $(LINK) testuser.lo $(LOCAL_LIBS) $(ALL_LIBS) + +testprocmutex@EXEEXT@: testprocmutex.lo $(LOCAL_LIBS) + $(LINK) testprocmutex.lo $(LOCAL_LIBS) $(ALL_LIBS) # DO NOT REMOVE 1.1 apr/test/testprocmutex.c Index: testprocmutex.c =================================================================== /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2000-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . */ #include "apr_shmem.h" #include "apr_thread_proc.h" #include "apr_file_io.h" #include "apr_lock.h" #include "apr_proc_mutex.h" #include "apr_errno.h" #include "apr_general.h" #include "apr_getopt.h" #include "errno.h" #include #include #include "test_apr.h" #define MAX_ITER 40000 #define MAX_COUNTER (MAX_ITER * 4) apr_proc_mutex_t *proc_lock; apr_pool_t *pool; int *x; static int make_child(apr_proc_t **proc, apr_pool_t *p) { int i = 0; *proc = apr_pcalloc(p, sizeof(**proc)); /* slight delay to allow things to settle */ apr_sleep (1); if (apr_proc_fork(*proc, p) == APR_INCHILD) { while (1) { apr_proc_mutex_lock(proc_lock); if (i == MAX_ITER) { apr_proc_mutex_unlock(proc_lock); exit(1); } i++; (*x)++; apr_proc_mutex_unlock(proc_lock); } exit(1); } return APR_SUCCESS; } apr_status_t test_exclusive(const char *lockname) { apr_proc_t *p1, *p2, *p3, *p4; apr_status_t s1, s2, s3, s4; printf("Exclusive lock test\n"); printf("%-60s", " Initializing the lock"); s1 = apr_proc_mutex_create(&proc_lock, lockname, pool); if (s1 != APR_SUCCESS) { printf("Failed!\n"); return s1; } printf("OK\n"); printf("%-60s", " Starting all of the processes"); fflush(stdout); s1 = make_child(&p1, pool); s2 = make_child(&p2, pool); s3 = make_child(&p3, pool); s4 = make_child(&p4, pool); if (s1 != APR_SUCCESS || s2 != APR_SUCCESS || s3 != APR_SUCCESS || s4 != APR_SUCCESS) { printf("Failed!\n"); return s1; } printf("OK\n"); printf("%-60s", " Waiting for processes to exit"); s1 = apr_proc_wait(p1, APR_WAIT); s2 = apr_proc_wait(p2, APR_WAIT); s3 = apr_proc_wait(p3, APR_WAIT); s4 = apr_proc_wait(p4, APR_WAIT); printf("OK\n"); if ((*x) != MAX_COUNTER) { fprintf(stderr, "Locks don't appear to work! x = %d instead of %d\n", (*x), MAX_COUNTER); } else { printf("Test passed\n"); } return APR_SUCCESS; } int main(int argc, const char * const *argv) { apr_status_t rv; char errmsg[200]; const char *lockname = "multi.lock"; const char *shmname = "shm.file"; apr_getopt_t *opt; char optchar; const char *optarg; apr_shmem_t *shm; printf("APR Proc Mutex Test\n==============\n\n"); apr_initialize(); atexit(apr_terminate); if (apr_pool_create(&pool, NULL) != APR_SUCCESS) exit(-1); if ((rv = apr_getopt_init(&opt, pool, argc, argv)) != APR_SUCCESS) { fprintf(stderr, "Could not set up to parse options: [%d] %s\n", rv, apr_strerror(rv, errmsg, sizeof errmsg)); exit(-1); } while ((rv = apr_getopt(opt, "f:", &optchar, &optarg)) == APR_SUCCESS) { if (optchar == 'f') { lockname = optarg; } } if (rv != APR_SUCCESS && rv != APR_EOF) { fprintf(stderr, "Could not parse options: [%d] %s\n", rv, apr_strerror(rv, errmsg, sizeof errmsg)); exit(-1); } apr_shm_init(&shm, sizeof(int), shmname, pool); x = apr_shm_calloc(shm, sizeof(int)); if ((rv = test_exclusive(lockname)) != APR_SUCCESS) { fprintf(stderr,"Exclusive Lock test failed : [%d] %s\n", rv, apr_strerror(rv, (char*)errmsg, 200)); exit(-2); } return 0; }