| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 | /* * benchtest4.c * * * -------------------------------------------------------------------------- * *      Pthreads-embedded (PTE) - POSIX Threads Library for embedded systems *      Copyright(C) 2008 Jason Schmidlapp * *      Contact Email: jschmidlapp@users.sourceforge.net * * *      Based upon Pthreads-win32 - POSIX Threads Library for Win32 *      Copyright(C) 1998 John E. Bossom *      Copyright(C) 1999,2005 Pthreads-win32 contributors * *      Contact Email: rpj@callisto.canberra.edu.au * *      The original list of contributors to the Pthreads-win32 project *      is contained in the file CONTRIBUTORS.ptw32 included with the *      source code distribution. The list can also be seen at the *      following World Wide Web location: *      http://sources.redhat.com/pthreads-win32/contributors.html * *      This library is free software; you can redistribute it and/or *      modify it under the terms of the GNU Lesser General Public *      License as published by the Free Software Foundation; either *      version 2 of the License, or (at your option) any later version. * *      This library is distributed in the hope that it will be useful, *      but WITHOUT ANY WARRANTY; without even the implied warranty of *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU *      Lesser General Public License for more details. * *      You should have received a copy of the GNU Lesser General Public *      License along with this library in the file COPYING.LIB; *      if not, write to the Free Software Foundation, Inc., *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * * -------------------------------------------------------------------------- * * Measure time taken to complete an elementary operation. * * - Mutex *   Single thread iteration over trylock/unlock for each mutex type. */#include "test.h"#ifdef __GNUC__#include <stdlib.h>#endif#include "benchtest.h"#define PTW32_MUTEX_TYPES#define ITERATIONS      100000Lstatic pthread_mutex_t mx;static pthread_mutexattr_t ma;static struct _timeb currSysTimeStart;static struct _timeb currSysTimeStop;static long durationMilliSecs;static long overHeadMilliSecs = 0;#define GetDurationMilliSecs(_TStart, _TStop) ((_TStop.time*1000+_TStop.millitm) \                                               - (_TStart.time*1000+_TStart.millitm))/* * Dummy use of j, otherwise the loop may be removed by the optimiser * when doing the overhead timing with an empty loop. */#define TESTSTART \  { int i, j = 0, k = 0; _ftime(&currSysTimeStart); for (i = 0; i < ITERATIONS; i++) { j++;#define TESTSTOP \  }; _ftime(&currSysTimeStop); if (j + k == i) j++; }static voidrunTest (char * testNameString, int mType){#ifdef PTW32_MUTEX_TYPES  pthread_mutexattr_settype(&ma, mType);#endif  pthread_mutex_init(&mx, &ma);  TESTSTART  (void) pthread_mutex_trylock(&mx);  (void) pthread_mutex_unlock(&mx);  TESTSTOP  pthread_mutex_destroy(&mx);  durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs;  printf( "%-45s %15ld %15.3f\n",          testNameString,          durationMilliSecs,          (float) durationMilliSecs * 1E3 / ITERATIONS);}int pthread_test_bench4(){  pthread_mutexattr_init(&ma);  printf( "=============================================================================\n");  printf( "Trylock plus unlock on an unlocked mutex.\n");  printf( "%ld iterations.\n\n", ITERATIONS);  printf( "%-45s %15s %15s\n",          "Test",          "Total(msec)",          "average(usec)");  /*   * Time the loop overhead so we can subtract it from the actual test times.   */  TESTSTART  TESTSTOP  durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs;  overHeadMilliSecs = durationMilliSecs;  /*   * Now we can start the actual tests   */#ifdef PTW32_MUTEX_TYPES  runTest("PTHREAD_MUTEX_DEFAULT", PTHREAD_MUTEX_DEFAULT);  runTest("PTHREAD_MUTEX_NORMAL", PTHREAD_MUTEX_NORMAL);  runTest("PTHREAD_MUTEX_ERRORCHECK", PTHREAD_MUTEX_ERRORCHECK);  runTest("PTHREAD_MUTEX_RECURSIVE", PTHREAD_MUTEX_RECURSIVE);#else  runTest("Non-blocking lock", 0);#endif  printf( "=============================================================================\n");  /*   * End of tests.   */  pthread_mutexattr_destroy(&ma);  return 0;}
 |