/* * Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2009 * The President and Fellows of Harvard College. * * 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. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS 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 UNIVERSITY OR 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. */ /* * Synchronization test code. */ #include #include #include #include #include #include #define NSEMLOOPS 63 #define NLOCKLOOPS 120 #define NCVLOOPS 5 #define NTHREADS 32 static volatile unsigned long testval1; static volatile unsigned long testval2; static volatile unsigned long testval3; #ifdef UW static struct semaphore *testsem = 0; static struct lock *testlock = 0; static struct cv *testcv = 0; static struct semaphore *donesem = 0; #else static struct semaphore *testsem; static struct lock *testlock; static struct cv *testcv; static struct semaphore *donesem; #endif #ifdef UW static void cleanitems(void) { kprintf("cleanitems: Destroying sems, locks, and cvs\n"); sem_destroy(testsem); lock_destroy(testlock); cv_destroy(testcv); sem_destroy(donesem); } #endif static void inititems(void) { if (testsem==NULL) { testsem = sem_create("testsem", 2); if (testsem == NULL) { panic("synchtest: sem_create failed\n"); } } if (testlock==NULL) { testlock = lock_create("testlock"); if (testlock == NULL) { panic("synchtest: lock_create failed\n"); } } if (testcv==NULL) { #ifdef UW testcv = cv_create("testcv"); #else testcv = cv_create("testlock"); #endif if (testcv == NULL) { panic("synchtest: cv_create failed\n"); } } if (donesem==NULL) { donesem = sem_create("donesem", 0); if (donesem == NULL) { panic("synchtest: sem_create failed\n"); } } } static void semtestthread(void *junk, unsigned long num) { int i; (void)junk; /* * Only one of these should print at a time. */ P(testsem); kprintf("Thread %2lu: ", num); for (i=0; i