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", &current_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", &current_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 */