diff options
Diffstat (limited to 'test/bench/chameneosredux.c')
-rw-r--r-- | test/bench/chameneosredux.c | 330 |
1 files changed, 0 insertions, 330 deletions
diff --git a/test/bench/chameneosredux.c b/test/bench/chameneosredux.c deleted file mode 100644 index ed78c31d7..000000000 --- a/test/bench/chameneosredux.c +++ /dev/null @@ -1,330 +0,0 @@ -/* -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * 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. - - * Neither the name of "The Computer Language Benchmarks Game" nor the - name of "The Computer Language Shootout Benchmarks" 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. -*/ - -/* The Computer Language Benchmarks Game - http://shootout.alioth.debian.org/ - - contributed by Michael Barker - based on a Java contribution by Luzius Meisser - - convert to C by dualamd -*/ - -#include <stdlib.h> -#include <stdio.h> -#include <pthread.h> - - -enum Colour -{ - blue = 0, - red = 1, - yellow = 2, - Invalid = 3 -}; - -const char* ColourName[] = {"blue", "red", "yellow"}; -const int STACK_SIZE = 32*1024; - -typedef unsigned int BOOL; -const BOOL TRUE = 1; -const BOOL FALSE = 0; - -int CreatureID = 0; - - -enum Colour doCompliment(enum Colour c1, enum Colour c2) -{ - switch (c1) - { - case blue: - switch (c2) - { - case blue: - return blue; - case red: - return yellow; - case yellow: - return red; - default: - goto errlb; - } - case red: - switch (c2) - { - case blue: - return yellow; - case red: - return red; - case yellow: - return blue; - default: - goto errlb; - } - case yellow: - switch (c2) - { - case blue: - return red; - case red: - return blue; - case yellow: - return yellow; - default: - goto errlb; - } - default: - break; - } - -errlb: - printf("Invalid colour\n"); - exit( 1 ); -} - -/* convert integer to number string: 1234 -> "one two three four" */ -char* formatNumber(int n, char* outbuf) -{ - int ochar = 0, ichar = 0; - int i; - char tmp[64]; - - const char* NUMBERS[] = - { - "zero", "one", "two", "three", "four", "five", - "six", "seven", "eight", "nine" - }; - - ichar = sprintf(tmp, "%d", n); - - for (i = 0; i < ichar; i++) - ochar += sprintf( outbuf + ochar, " %s", NUMBERS[ tmp[i] - '0' ] ); - - return outbuf; -} - - -struct MeetingPlace -{ - pthread_mutex_t mutex; - int meetingsLeft; - struct Creature* firstCreature; -}; - -struct Creature -{ - pthread_t ht; - pthread_attr_t stack_att; - - struct MeetingPlace* place; - int count; - int sameCount; - - enum Colour colour; - int id; - - BOOL two_met; - BOOL sameid; -}; - - -void MeetingPlace_Init(struct MeetingPlace* m, int meetings ) -{ - pthread_mutex_init( &m->mutex, 0 ); - m->meetingsLeft = meetings; - m->firstCreature = 0; -} - - -BOOL Meet( struct Creature* cr) -{ - BOOL retval = TRUE; - - struct MeetingPlace* mp = cr->place; - pthread_mutex_lock( &(mp->mutex) ); - - if ( mp->meetingsLeft > 0 ) - { - if ( mp->firstCreature == 0 ) - { - cr->two_met = FALSE; - mp->firstCreature = cr; - } - else - { - struct Creature* first; - enum Colour newColour; - - first = mp->firstCreature; - newColour = doCompliment( cr->colour, first->colour ); - - cr->sameid = cr->id == first->id; - cr->colour = newColour; - cr->two_met = TRUE; - - first->sameid = cr->sameid; - first->colour = newColour; - first->two_met = TRUE; - - mp->firstCreature = 0; - mp->meetingsLeft--; - } - } - else - retval = FALSE; - - pthread_mutex_unlock( &(mp->mutex) ); - return retval; -} - - -void* CreatureThreadRun(void* param) -{ - struct Creature* cr = (struct Creature*)param; - - while (TRUE) - { - if ( Meet(cr) ) - { - while (cr->two_met == FALSE) - sched_yield(); - - if (cr->sameid) - cr->sameCount++; - cr->count++; - } - else - break; - } - - return 0; -} - -void Creature_Init( struct Creature *cr, struct MeetingPlace* place, enum Colour colour ) -{ - cr->place = place; - cr->count = cr->sameCount = 0; - - cr->id = ++CreatureID; - cr->colour = colour; - cr->two_met = FALSE; - - pthread_attr_init( &cr->stack_att ); - pthread_attr_setstacksize( &cr->stack_att, STACK_SIZE ); - pthread_create( &cr->ht, &cr->stack_att, &CreatureThreadRun, (void*)(cr) ); -} - -/* format meeting times of each creature to string */ -char* Creature_getResult(struct Creature* cr, char* str) -{ - char numstr[256]; - formatNumber(cr->sameCount, numstr); - - sprintf( str, "%u%s", cr->count, numstr ); - return str; -} - - -void runGame( int n_meeting, int ncolor, const enum Colour* colours ) -{ - int i; - int total = 0; - char str[256]; - - struct MeetingPlace place; - struct Creature *creatures = (struct Creature*) calloc( ncolor, sizeof(struct Creature) ); - - MeetingPlace_Init( &place, n_meeting ); - - /* print initial color of each creature */ - for (i = 0; i < ncolor; i++) - { - printf( "%s ", ColourName[ colours[i] ] ); - Creature_Init( &(creatures[i]), &place, colours[i] ); - } - printf("\n"); - - /* wait for them to meet */ - for (i = 0; i < ncolor; i++) - pthread_join( creatures[i].ht, 0 ); - - /* print meeting times of each creature */ - for (i = 0; i < ncolor; i++) - { - printf( "%s\n", Creature_getResult(&(creatures[i]), str) ); - total += creatures[i].count; - } - - /* print total meeting times, should equal n_meeting */ - printf( "%s\n\n", formatNumber(total, str) ); - - /* cleaup & quit */ - pthread_mutex_destroy( &place.mutex ); - free( creatures ); -} - - -void printColours( enum Colour c1, enum Colour c2 ) -{ - printf( "%s + %s -> %s\n", - ColourName[c1], - ColourName[c2], - ColourName[doCompliment(c1, c2)] ); -} - -void printColoursTable(void) -{ - printColours(blue, blue); - printColours(blue, red); - printColours(blue, yellow); - printColours(red, blue); - printColours(red, red); - printColours(red, yellow); - printColours(yellow, blue); - printColours(yellow, red); - printColours(yellow, yellow); -} - -int main(int argc, char** argv) -{ - int n = (argc == 2) ? atoi(argv[1]) : 600; - - printColoursTable(); - printf("\n"); - - const enum Colour r1[] = { blue, red, yellow }; - const enum Colour r2[] = { blue, red, yellow, - red, yellow, blue, - red, yellow, red, blue }; - - runGame( n, sizeof(r1) / sizeof(r1[0]), r1 ); - runGame( n, sizeof(r2) / sizeof(r2[0]), r2 ); - - return 0; -} |