You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by da...@apache.org on 2007/08/05 17:36:03 UTC
svn commit: r562893 - in /apr/apr-util/trunk/test: Makefile.in abts_tests.h
testqueue.c testutil.h
Author: davi
Date: Sun Aug 5 08:36:02 2007
New Revision: 562893
URL: http://svn.apache.org/viewvc?view=rev&rev=562893
Log:
Cleanup and merge testqueue into the abts test suite (testall). Also use
apr_thread_pool for the tests.
Modified:
apr/apr-util/trunk/test/Makefile.in
apr/apr-util/trunk/test/abts_tests.h
apr/apr-util/trunk/test/testqueue.c
apr/apr-util/trunk/test/testutil.h
Modified: apr/apr-util/trunk/test/Makefile.in
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/test/Makefile.in?view=diff&rev=562893&r1=562892&r2=562893
==============================================================================
--- apr/apr-util/trunk/test/Makefile.in (original)
+++ apr/apr-util/trunk/test/Makefile.in Sun Aug 5 08:36:02 2007
@@ -3,7 +3,7 @@
INCLUDES = @APRUTIL_PRIV_INCLUDES@ @APR_INCLUDES@ @APRUTIL_INCLUDES@
PROGRAMS = testall testdbm testxml testrmm \
- testqueue testxlate dbd testssl \
+ testxlate dbd testssl \
echod sockperf
TARGETS = $(PROGRAMS)
@@ -56,11 +56,6 @@
testrmm: $(testrmm_OBJECTS) $(testrmm_LDADD)
$(LINK_PROG) $(APRUTIL_LDFLAGS) $(testrmm_OBJECTS) $(testrmm_LDADD) $(PROGRAM_DEPENDENCIES)
-testqueue_OBJECTS = testqueue.lo
-testqueue_LDADD = $(TARGET_LIB_PATH)
-testqueue: $(testqueue_OBJECTS) $(testqueue_LDADD)
- $(LINK_PROG) $(APRUTIL_LDFLAGS) $(testqueue_OBJECTS) $(testqueue_LDADD) $(PROGRAM_DEPENDENCIES)
-
testxlate_OBJECTS = testxlate.lo
testxlate_LDADD = $(TARGET_LIB_PATH)
testxlate: $(testxlate_OBJECTS) $(testxlate_LDADD)
@@ -85,7 +80,7 @@
testall_OBJECTS = teststrmatch.lo testuri.lo testuuid.lo abts.lo testutil.lo \
testbuckets.lo testpass.lo testmd4.lo testmd5.lo testldap.lo \
- testdate.lo testdbd.lo testmemcache.lo testreslist.lo
+ testdate.lo testdbd.lo testmemcache.lo testreslist.lo testqueue.lo
testall_LDADD = $(TARGET_LIB_PATH)
testall: $(testall_OBJECTS) $(testall_LDADD)
$(LINK_PROG) $(APRUTIL_LDFLAGS) $(testall_OBJECTS) $(testall_LDADD) $(PROGRAM_DEPENDENCIES)
Modified: apr/apr-util/trunk/test/abts_tests.h
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/test/abts_tests.h?view=diff&rev=562893&r1=562892&r2=562893
==============================================================================
--- apr/apr-util/trunk/test/abts_tests.h (original)
+++ apr/apr-util/trunk/test/abts_tests.h Sun Aug 5 08:36:02 2007
@@ -34,7 +34,8 @@
{testdbd},
{testdate},
{testmemcache},
- {testreslist}
+ {testreslist},
+ {testqueue}
};
#endif /* APR_TEST_INCLUDES */
Modified: apr/apr-util/trunk/test/testqueue.c
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/test/testqueue.c?view=diff&rev=562893&r1=562892&r2=562893
==============================================================================
--- apr/apr-util/trunk/test/testqueue.c (original)
+++ apr/apr-util/trunk/test/testqueue.c Sun Aug 5 08:36:02 2007
@@ -14,269 +14,118 @@
* limitations under the License.
*/
-#include <apr_thread_proc.h>
-#include <apr_errno.h>
-#include <apr_general.h>
-#include <apr_getopt.h>
-#include <apr_strings.h>
-#include "errno.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <apr_time.h>
-#if APR_HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <apr_portable.h>
+#include "apu.h"
#include "apr_queue.h"
+#include "apr_thread_pool.h"
+#include "apr_time.h"
+#include "abts.h"
+#include "testutil.h"
+
+#if APR_HAS_THREADS
+
+#define NUMBER_CONSUMERS 3
+#define CONSUMER_ACTIVITY 4
+#define NUMBER_PRODUCERS 4
+#define PRODUCER_ACTIVITY 5
+#define QUEUE_SIZE 100
+#define SLEEP_TIME 30
-#if !APR_HAS_THREADS
-int main(void)
-{
- fprintf(stderr,
- "This program won't work on this platform because there is no "
- "support for threads.\n");
- return 0;
-}
-#else /* !APR_HAS_THREADS */
-
-apr_pool_t *context;
-int consumer_activity=400;
-int producer_activity=300;
-int verbose=0;
-static void * APR_THREAD_FUNC consumer(apr_thread_t *thd, void *data);
-static void * APR_THREAD_FUNC producer(apr_thread_t *thd, void *data);
-static void usage(void);
+static apr_queue_t *queue;
static void * APR_THREAD_FUNC consumer(apr_thread_t *thd, void *data)
{
long sleeprate;
- apr_queue_t *q = (apr_queue_t*)data;
+ abts_case *tc = data;
apr_status_t rv;
- int val;
void *v;
- char current_thread_str[30];
- apr_os_thread_t current_thread = apr_os_thread_current();
- apr_snprintf(current_thread_str, sizeof current_thread_str,
- "%pT", ¤t_thread);
+ sleeprate = 1000000/CONSUMER_ACTIVITY;
+ apr_sleep((rand() % 4) * 1000000); /* sleep random seconds */
- sleeprate = 1000000/consumer_activity;
- apr_sleep( (rand() % 4 ) * 1000000 ); /* sleep random seconds */
while (1) {
- do {
- rv = apr_queue_pop(q, &v);
- if (rv == APR_EINTR) {
- fprintf(stderr, "%s\tconsumer intr\n", current_thread_str);
- }
-
- } while (rv == APR_EINTR) ;
- if (rv != APR_SUCCESS) {
- if (rv == APR_EOF) {
- fprintf(stderr, "%s\tconsumer:queue terminated APR_EOF\n", current_thread_str);
- rv=APR_SUCCESS;
- }
- else
- fprintf(stderr, "%s\tconsumer thread exit rv %d\n", current_thread_str, rv);
- apr_thread_exit(thd, rv);
- return NULL;
+ rv = apr_queue_pop(queue, &v);
+
+ if (rv == APR_EINTR) {
+ continue;
+ } else if (rv == APR_EOF) {
+ break;
}
- val = *(int*)v;
- if (verbose)
- fprintf(stderr, "%s\tpop %d\n", current_thread_str, val);
- apr_sleep( sleeprate ); /* sleep this long to acheive our rate */
+
+ ABTS_TRUE(tc, v == NULL);
+ ABTS_TRUE(tc, rv == APR_SUCCESS);
+
+ apr_sleep(sleeprate); /* sleep this long to acheive our rate */
}
- /* not reached */
+
return NULL;
-}
+}
static void * APR_THREAD_FUNC producer(apr_thread_t *thd, void *data)
{
- int i=0;
long sleeprate;
- apr_queue_t *q = (apr_queue_t*)data;
apr_status_t rv;
- int *val;
- char current_thread_str[30];
- apr_os_thread_t current_thread = apr_os_thread_current();
-
- apr_snprintf(current_thread_str, sizeof current_thread_str,
- "%pT", ¤t_thread);
-
- sleeprate = 1000000/producer_activity;
- apr_sleep( (rand() % 4 ) * 1000000 ); /* sleep random seconds */
-
- while(1) {
- val = apr_palloc(context, sizeof(int));
- *val=i;
- if (verbose)
- fprintf(stderr, "%s\tpush %d\n", current_thread_str, *val);
+
+ sleeprate = 1000000/PRODUCER_ACTIVITY;
+ apr_sleep((rand() % 4) * 1000000); /* sleep random seconds */
+
+ while (1) {
do {
- rv = apr_queue_push(q, val);
- if (rv == APR_EINTR)
- fprintf(stderr, "%s\tproducer intr\n", current_thread_str);
+ rv = apr_queue_push(queue, NULL);
} while (rv == APR_EINTR);
- if (rv != APR_SUCCESS) {
- if (rv == APR_EOF) {
- fprintf(stderr, "%s\tproducer: queue terminated APR_EOF\n", current_thread_str);
- rv = APR_SUCCESS;
- }
- else
- fprintf(stderr, "%s\tproducer thread exit rv %d\n", current_thread_str, rv);
- apr_thread_exit(thd, rv);
- return NULL;
+ if (rv == APR_EOF) {
+ break;
}
- i++;
- apr_sleep( sleeprate ); /* sleep this long to acheive our rate */
+
+ apr_sleep(sleeprate); /* sleep this long to acheive our rate */
}
- /* not reached */
- return NULL;
-}
-static void usage(void)
-{
- fprintf(stderr,"usage: testqueue -p n -P n -c n -C n -q n -s n\n");
- fprintf(stderr,"-c # of consumer\n");
- fprintf(stderr,"-C amount they consumer before dying\n");
- fprintf(stderr,"-p # of producers\n");
- fprintf(stderr,"-P amount they produce before dying\n");
- fprintf(stderr,"-q queue size\n");
- fprintf(stderr,"-s amount of time to sleep before killing it\n");
- fprintf(stderr,"-v verbose\n");
+ return NULL;
}
-int main(int argc, const char* const argv[])
+static void test_queue_producer_consumer(abts_case *tc, void *data)
{
- apr_thread_t **t;
- apr_queue_t *queue;
- int i;
+ unsigned int i;
apr_status_t rv;
- apr_getopt_t *opt;
- const char *optarg;
- char c;
- int numconsumers=3;
- int numproducers=4;
- int queuesize=100;
- int sleeptime=30;
- char errorbuf[200];
+ apr_thread_pool_t *thrp;
- apr_initialize();
+ /* XXX: non-portable */
srand((unsigned int)apr_time_now());
- printf("APR Queue Test\n======================\n\n");
-
- printf("%-60s", "Initializing the context");
- if (apr_pool_create(&context, NULL) != APR_SUCCESS) {
- fflush(stdout);
- fprintf(stderr, "Failed.\nCould not initialize\n");
- exit(-1);
- }
- printf("OK\n");
-
- apr_getopt_init(&opt, context, argc, argv);
- while ((rv = apr_getopt(opt, "p:c:P:C:q:s:v", &c, &optarg))
- == APR_SUCCESS) {
- switch (c) {
- case 'c':
- numconsumers = atoi( optarg);
- break;
- case 'p':
- numproducers = atoi( optarg);
- break;
- case 'C':
- consumer_activity = atoi( optarg);
- break;
- case 'P':
- producer_activity = atoi( optarg);
- break;
- case 's':
- sleeptime= atoi(optarg);
- break;
- case 'q':
- queuesize = atoi(optarg);
- break;
- case 'v':
- verbose= 1;
- break;
- default:
- usage();
- exit(-1);
- }
- }
- /* bad cmdline option? then we die */
- if (rv != APR_EOF || opt->ind < opt->argc) {
- usage();
- exit(-1);
- }
-
+ rv = apr_queue_create(&queue, QUEUE_SIZE, p);
+ ABTS_INT_EQUAL(tc, rv, APR_SUCCESS);
- printf("test stats %d consumers (rate %d/sec) %d producers (rate %d/sec) queue size %d sleep %d\n",
- numconsumers,consumer_activity, numproducers, producer_activity, queuesize,sleeptime);
- printf("%-60s", "Initializing the queue");
- rv = apr_queue_create(&queue, queuesize, context);
-
- if (rv != APR_SUCCESS) {
- fflush(stdout);
- fprintf(stderr, "Failed\nCould not create queue %d\n",rv);
- apr_strerror(rv, errorbuf,200);
- fprintf(stderr,"%s\n",errorbuf);
- exit(-1);
- }
- printf("OK\n");
-
- t = apr_palloc( context, sizeof(apr_thread_t*) * (numconsumers+numproducers));
- printf("%-60s", "Starting consumers");
- for (i=0;i<numconsumers;i++) {
- rv = apr_thread_create(&t[i], NULL, consumer, queue, context);
- if (rv != APR_SUCCESS) {
- apr_strerror(rv, errorbuf,200);
- fprintf(stderr, "Failed\nError starting consumer thread (%d) rv=%d:%s\n",i, rv,errorbuf);
- exit(-1);
+ rv = apr_thread_pool_create(&thrp, 0, NUMBER_CONSUMERS + NUMBER_PRODUCERS, p);
+ ABTS_INT_EQUAL(tc, rv, APR_SUCCESS);
- }
+ for (i = 0; i < NUMBER_CONSUMERS; i++) {
+ rv = apr_thread_pool_push(thrp, consumer, tc, 0, NULL);
+ ABTS_INT_EQUAL(tc, rv, APR_SUCCESS);
}
- for (i=numconsumers;i<(numconsumers+numproducers);i++) {
- rv = apr_thread_create(&t[i], NULL, producer, queue, context);
- if (rv != APR_SUCCESS) {
- apr_strerror(rv, errorbuf,200);
- fprintf(stderr, "Failed\nError starting producer thread (%d) rv=%d:%s\n",i, rv,errorbuf);
- exit(-1);
- }
+ for (i = 0; i < NUMBER_PRODUCERS; i++) {
+ rv = apr_thread_pool_push(thrp, producer, tc, 0, NULL);
+ ABTS_INT_EQUAL(tc, rv, APR_SUCCESS);
}
- printf("OK\n");
- printf("%-60s", "Sleeping\n");
- apr_sleep( sleeptime * 1000000 ); /* sleep 10 seconds */
- printf("OK\n");
+ apr_sleep(SLEEP_TIME * 1000000); /* sleep 10 seconds */
- printf("%-60s", "Terminating queue");
rv = apr_queue_term(queue);
- if (rv != APR_SUCCESS) {
- apr_strerror(rv, errorbuf,200);
- fprintf( stderr, "apr_queue_term failed %d:%s\n",rv,errorbuf);
- }
- printf("OK\n");
+ ABTS_INT_EQUAL(tc, rv, APR_SUCCESS);
+ rv = apr_thread_pool_destroy(thrp);
+ ABTS_INT_EQUAL(tc, rv, APR_SUCCESS);
+}
- printf("%-60s", "Waiting for threads to exit\n");
- fflush(stdout);
- for (i=0;i<numconsumers+numproducers;i++) {
- apr_thread_join(&rv, t[i]);
- if (rv != 0 ) {
- apr_strerror(rv, errorbuf,200);
- if (i<numconsumers)
- fprintf( stderr, "consumer thread %d failed rv %d:%s\n",i,rv,errorbuf);
- else
- fprintf( stderr, "producer thread %d failed rv %d:%s\n",i,rv,errorbuf);
- }
- }
+#endif /* APR_HAS_THREADS */
- printf("OK\n");
+abts_suite *testqueue(abts_suite *suite)
+{
+ suite = ADD_SUITE(suite);
- apr_terminate();
+#if APR_HAS_THREADS
+ abts_run_test(suite, test_queue_producer_consumer, NULL);
+#endif /* APR_HAS_THREADS */
- return 0;
+ return suite;
}
-
-#endif /* !APR_HAS_THREADS */
Modified: apr/apr-util/trunk/test/testutil.h
URL: http://svn.apache.org/viewvc/apr/apr-util/trunk/test/testutil.h?view=diff&rev=562893&r1=562892&r2=562893
==============================================================================
--- apr/apr-util/trunk/test/testutil.h (original)
+++ apr/apr-util/trunk/test/testutil.h Sun Aug 5 08:36:02 2007
@@ -55,5 +55,6 @@
abts_suite *testdate(abts_suite *suite);
abts_suite *testmemcache(abts_suite *suite);
abts_suite *testreslist(abts_suite *suite);
+abts_suite *testqueue(abts_suite *suite);
#endif /* APR_TEST_INCLUDES */