Mercurial > sm-archive
diff src/test.cpp @ 0:616666e2f34c
initial version
author | carl |
---|---|
date | Fri, 10 Mar 2006 10:30:08 -0800 |
parents | |
children | 75e1a9bcbc2e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test.cpp Fri Mar 10 10:30:08 2006 -0800 @@ -0,0 +1,124 @@ +/* + +Copyright (c) 2004 Carl Byington - 510 Software Group, released under +the GPL version 2 or any later version at your choice available at +http://www.fsf.org/licenses/gpl.txt + +*/ + +#include <stdio.h> +#include <unistd.h> +#include <pthread.h> +#include <set> + +static char* test_version="$Id$"; + +using namespace std; + +struct ltstr { + bool operator()(char* s1, char* s2) const { + return strcmp(s1, s2) < 0; + } +}; + +typedef set<char *, ltstr> string_set; + +static string_set all_strings; // owns all the strings, only modified by the config loader thread + +struct stats { + bool stop; + bool running; + int counter; + int errors; + stats(); +}; +stats::stats() { + stop = false; + running = false; + counter = 0; + errors = 0; +} + +//////////////////////////////////////////////// +// helper to discard the strings held by a string_set +// +static void discard(string_set &s); +static void discard(string_set &s) { + for (string_set::iterator i=s.begin(); i!=s.end(); i++) { + free(*i); + } + s.clear(); +} + +//////////////////////////////////////////////// +// helper to register a string in a string set +// +static char* register_string(string_set &s, char *name); +static char* register_string(string_set &s, char *name) { + string_set::iterator i = s.find(name); + if (i != s.end()) return *i; + char *x = strdup(name); + s.insert(x); + return x; +} + + +//////////////////////////////////////////////// +// thread tester +// +static void* tester(void *arg); +static void* tester(void *arg) { + stats &st = *((stats *)arg); + st.running = true; + while (!st.stop) { + const int LIMIT = 1000; + string_set *mine = new string_set; + string_set &me = *mine; + for (int i=0; i<LIMIT; i++) { + char buf[100]; + snprintf(buf, sizeof(buf), "this is string %d", i); + register_string(me, buf); + } + for (int i=0; i<LIMIT; i+=5) { + char buf[100]; + snprintf(buf, sizeof(buf), "this is string %d", i); + string_set::iterator j = me.find(buf); + if (j == me.end()) st.errors++; + } + discard(me); + delete mine; + st.counter++; + } + st.running = false; + return NULL; +} + +int main(int argc, char**argv) +{ + stats st1; + stats st2; + pthread_t tid; + if (pthread_create(&tid, 0, tester, &st1)) + fprintf(stdout, "failed to create test thread"); + if (pthread_detach(tid)) + fprintf(stdout, "failed to detach test thread"); + if (pthread_create(&tid, 0, tester, &st2)) + fprintf(stdout, "failed to create test thread"); + if (pthread_detach(tid)) + fprintf(stdout, "failed to detach test thread"); + + fprintf(stdout, "tests are running\n"); + sleep(60); + st1.stop = true; + st2.stop = true; + while (st1.running || st2.running) { + sleep(1); + } + + fprintf(stdout, "counter 1 = %d\n", st1.counter); + fprintf(stdout, "counter 2 = %d\n", st2.counter); + fprintf(stdout, "errors 1 = %d\n", st1.errors); + fprintf(stdout, "errors 2 = %d\n", st2.errors); + return 0; +} +