aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFrank Warmerdam <warmerdam@pobox.com>2010-03-16 12:37:28 +0000
committerFrank Warmerdam <warmerdam@pobox.com>2010-03-16 12:37:28 +0000
commit4ea16fcba0dd2e67c62488beeaddf8a93b49fdf7 (patch)
tree137b44c11e6fc2b44766a5582791a16da626ced3 /src
parent8313a5f3e2366784f77a2faffee786ea459a5ee6 (diff)
downloadPROJ-4ea16fcba0dd2e67c62488beeaddf8a93b49fdf7.tar.gz
PROJ-4ea16fcba0dd2e67c62488beeaddf8a93b49fdf7.zip
added multistresstest
git-svn-id: http://svn.osgeo.org/metacrs/proj/trunk@1830 4e78687f-474d-0410-85f9-8d5e500ac6b2
Diffstat (limited to 'src')
-rw-r--r--src/multistresstest.c218
-rwxr-xr-xsrc/runmultistresstest.sh4
2 files changed, 222 insertions, 0 deletions
diff --git a/src/multistresstest.c b/src/multistresstest.c
new file mode 100644
index 00000000..ddd483ff
--- /dev/null
+++ b/src/multistresstest.c
@@ -0,0 +1,218 @@
+/******************************************************************************
+ *
+ * Project: PROJ.4
+ * Purpose: Mainline program to stress test multithreaded PROJ.4 processing.
+ * Author: Frank Warmerdam, warmerdam@pobox.com
+ *
+ ******************************************************************************
+ * Copyright (c) 2010, Frank Warmerdam
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <unistd.h>
+#include "proj_api.h"
+
+typedef struct {
+ const char *src_def;
+ const char *dst_def;
+
+ double src_x, src_y, src_z;
+ double dst_x, dst_y, dst_z;
+
+ int dst_error;
+} TestItem;
+
+TestItem test_list[] = {
+ {
+ "+proj=utm +zone=11 +datum=WGS84",
+ "+proj=latlong +datum=WGS84",
+ 150000.0, 3000000.0, 0.0,
+ },
+ {
+ "+proj=utm +zone=11 +datum=NAD83",
+ "+proj=latlong +datum=NAD27",
+ 150000.0, 3000000.0, 0.0,
+ },
+ {
+ "+proj=utm +zone=11 +datum=WGS84",
+ "+proj=merc +datum=potsdam",
+ 150000.0, 3000000.0, 0.0,
+ },
+
+/*
+** This test currentsly sets pj_errno and messes up the others. It
+** should be re-enabled when the pj_errno conflict is resolved.
+*/
+#ifdef notdef
+ {
+ "+proj=latlong +nadgrids=nzgd2kgrid0005.gsb",
+ "+proj=latlong +datum=WGS84",
+ 150000.0, 3000000.0, 0.0,
+ },
+#endif
+ {
+ "+proj=latlong +nadgrids=nzgd2kgrid0005.gsb",
+ "+proj=latlong +datum=WGS84",
+ 170 * DEG_TO_RAD, -40 * DEG_TO_RAD, 0.0,
+ },
+ {
+ "+init=epsg:3309",
+ "+init=epsg:4326",
+ 150000.0, 30000.0, 0.0,
+ }
+};
+
+static volatile int active_thread_count = 0;
+
+/************************************************************************/
+/* TestThread() */
+/************************************************************************/
+
+static void *TestThread( void *pData )
+
+{
+ int i, test_count = sizeof(test_list) / sizeof(TestItem);
+
+/* -------------------------------------------------------------------- */
+/* Initialize coordinate system definitions. */
+/* -------------------------------------------------------------------- */
+ projPJ *src_pj_list, *dst_pj_list;
+
+ src_pj_list = (projPJ *) calloc(test_count,sizeof(projPJ));
+ dst_pj_list = (projPJ *) calloc(test_count,sizeof(projPJ));
+
+ for( i = 0; i < test_count; i++ )
+ {
+ TestItem *test = test_list + i;
+
+ src_pj_list[i] = pj_init_plus( test->src_def );
+ dst_pj_list[i] = pj_init_plus( test->dst_def );
+ }
+
+/* -------------------------------------------------------------------- */
+/* Perform tests - over and over. */
+/* -------------------------------------------------------------------- */
+ int repeat_count = 100000, i_iter;
+
+ for( i_iter = 0; i_iter < repeat_count; i_iter++ )
+ {
+ for( i = 0; i < test_count; i++ )
+ {
+ TestItem *test = test_list + i;
+ double x, y, z;
+ int error;
+
+ x = test->src_x;
+ y = test->src_y;
+ z = test->src_z;
+
+ error = pj_transform( src_pj_list[i], dst_pj_list[i], 1, 0,
+ &x, &y, &z );
+
+
+ if( error != test->dst_error )
+ {
+ fprintf( stderr, "Got error %d, expected %d\n",
+ error, test->dst_error );
+ }
+
+ if( x != test->dst_x || y != test->dst_y || z != test->dst_z )
+ {
+ fprintf( stderr,
+ "Got %.15g,%.15g,%.15g\n"
+ "Expected %.15g,%.15g,%.15g\n",
+ x, y, z,
+ test->dst_x, test->dst_y, test->dst_z );
+ }
+ }
+ }
+
+ printf( "%d iterations of the %d tests complete in thread X\n",
+ repeat_count, test_count );
+
+ active_thread_count--;
+}
+
+/************************************************************************/
+/* main() */
+/************************************************************************/
+int main( int argc, char **argv )
+
+{
+/* -------------------------------------------------------------------- */
+/* Our first pass is to establish the correct answers for all */
+/* the tests. */
+/* -------------------------------------------------------------------- */
+ int i, test_count = sizeof(test_list) / sizeof(TestItem);
+
+ for( i = 0; i < test_count; i++ )
+ {
+ TestItem *test = test_list + i;
+
+ projPJ src_pj, dst_pj;
+
+ src_pj = pj_init_plus( test->src_def );
+ dst_pj = pj_init_plus( test->dst_def );
+
+ test->dst_x = test->src_x;
+ test->dst_y = test->src_y;
+ test->dst_z = test->src_z;
+
+ test->dst_error = pj_transform( src_pj, dst_pj, 1, 0,
+ &(test->dst_x),
+ &(test->dst_y),
+ &(test->dst_z) );
+
+ pj_free( src_pj );
+ pj_free( dst_pj );
+ }
+
+ printf( "%d tests initialized.\n", test_count );
+
+/* -------------------------------------------------------------------- */
+/* Now launch a bunch of threads to repeat the tests. */
+/* -------------------------------------------------------------------- */
+#define num_threads 2
+
+ pthread_t ahThread[num_threads];
+ pthread_attr_t hThreadAttr;
+
+ pthread_attr_init( &hThreadAttr );
+ pthread_attr_setdetachstate( &hThreadAttr, PTHREAD_CREATE_DETACHED );
+
+ for( i = 0; i < num_threads; i++ )
+ {
+ active_thread_count++;
+
+ pthread_create( &(ahThread[i]), &hThreadAttr,
+ TestThread, NULL );
+ }
+
+ printf( "%d test threads launched.\n", num_threads );
+
+ while( active_thread_count > 0 )
+ sleep( 1 );
+
+ printf( "all tests complete.\n" );
+
+}
diff --git a/src/runmultistresstest.sh b/src/runmultistresstest.sh
new file mode 100755
index 00000000..ad5968f6
--- /dev/null
+++ b/src/runmultistresstest.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+gcc -g multistresstest.c .libs/libproj.so -lpthread -o multistresstest
+./multistresstest