Fix registry keys for VC runtime
[yaz-moved-to-github.git] / zoom / zoom-benchmark.c
index 3a22023..73d079e 100644 (file)
@@ -1,28 +1,28 @@
-/*
- * $Id: zoom-benchmark.c,v 1.11 2005-09-20 11:29:03 marc Exp $
- *
- * Asynchronous multi-target client doing search and piggyback retrieval
+/* This file is part of the YAZ toolkit.
+ * Copyright (C) Index Data
+ * See the file LICENSE for details.
  */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <ctype.h>
 #include <sys/time.h>
 
 #include <yaz/xmalloc.h>
 #include <yaz/options.h>
 #include <yaz/zoom.h>
 
-
 /* naming events */
-static char* zoom_events[10];
+static char* zoom_events[ZOOM_EVENT_MAX+1];
 
 /* re-sorting event numbers to progress numbers */
-static int zoom_progress[10];
+static int zoom_progress[ZOOM_EVENT_MAX+1];
 
 /* commando line parameters */
-static struct parameters_t { 
+static struct parameters_t {
     char host[1024];
     char query[1024];
     int progress[4096];
@@ -31,9 +31,10 @@ static struct parameters_t {
     int timeout;
     char proxy[1024];
     int piggypack;
+    int gnuplot;
 } parameters;
 
-struct  event_line_t 
+struct  event_line_t
 {
     int connection;
     long time_sec;
@@ -49,9 +50,9 @@ struct  event_line_t
 void print_event_line(struct event_line_t *pel)
 {
     printf ("%d\t%ld.%06ld\t%d\t%d\t%s\t%d\t%s\n",
-            pel->connection, pel->time_sec, pel->time_usec, 
+            pel->connection, pel->time_sec, pel->time_usec,
             pel->progress,
-            pel->event, pel->zoom_event, 
+            pel->event, pel->zoom_event,
             pel->error, pel->errmsg);
 }
 
@@ -74,14 +75,19 @@ void  update_events(int *elc, struct event_line_t *els,
     els[iels].time_usec = usec;
     els[iels].progress = prog;
     els[iels].event = event;
-    strcpy(els[iels].zoom_event, eventmsg);
+
+    if (eventmsg)
+        strcpy(els[iels].zoom_event, eventmsg);
+    else
+        strcpy(els[iels].zoom_event, "---");
+
     els[iels].error = error;
     strcpy(els[iels].errmsg, errmsg);
-    //print_event_line(&els[iels]);
+    /* print_event_line(&els[iels]); */
     elc[ielc] += 1;
 }
 
-void  print_events(int *elc,  struct event_line_t *els, 
+void  print_events(int *elc,  struct event_line_t *els,
                    int connections){
     int i;
     int j;
@@ -104,7 +110,7 @@ void  print_events(int *elc,  struct event_line_t *els,
 
 
 
-void init_statics()
+void init_statics(void)
 {
     int i;
     char nullstring[1] = "";
@@ -120,34 +126,37 @@ void init_statics()
     zoom_events[ZOOM_EVENT_RECV_APDU] = "ZOOM_EVENT_RECV_APDU";
     zoom_events[ZOOM_EVENT_RECV_RECORD] = "ZOOM_EVENT_RECV_RECORD";
     zoom_events[ZOOM_EVENT_RECV_SEARCH] = "ZOOM_EVENT_RECV_SEARCH";
+    zoom_events[ZOOM_EVENT_END] = "ZOOM_EVENT_END";
 
     /* re-sorting event numbers to progress numbers */
     zoom_progress[ZOOM_EVENT_NONE] = 0;
     zoom_progress[ZOOM_EVENT_CONNECT] = 1;
     zoom_progress[ZOOM_EVENT_SEND_DATA] = 3;
     zoom_progress[ZOOM_EVENT_RECV_DATA] = 4;
-    zoom_progress[ZOOM_EVENT_TIMEOUT] = 8;
-    zoom_progress[ZOOM_EVENT_UNKNOWN] = 9;
+    zoom_progress[ZOOM_EVENT_TIMEOUT] = 9;
+    zoom_progress[ZOOM_EVENT_UNKNOWN] = 10;
     zoom_progress[ZOOM_EVENT_SEND_APDU] = 2;
     zoom_progress[ZOOM_EVENT_RECV_APDU] = 5;
     zoom_progress[ZOOM_EVENT_RECV_RECORD] = 7;
     zoom_progress[ZOOM_EVENT_RECV_SEARCH] = 6;
+    zoom_progress[ZOOM_EVENT_END] = 8;
 
     /* parameters */
     parameters.concurrent = 1;
     parameters.timeout = 0;
     parameters.repeat = 1;
     strcpy(parameters.proxy, nullstring);
+    parameters.gnuplot = 0;
     parameters.piggypack = 0;
 
     /* progress initializing */
     for (i = 0; i < 4096; i++){
         parameters.progress[i] = 0;
     }
-    
+
 }
-struct time_type 
+
+struct time_type
 {
     struct timeval now;
     struct timeval then;
@@ -184,23 +193,24 @@ long time_usec(struct time_type *ptime)
     return ptime->usec;
 }
 
-void print_option_error()
+void print_option_error(void)
 {
     fprintf(stderr, "zoom-benchmark:  Call error\n");
     fprintf(stderr, "zoom-benchmark -h host:port -q pqf-query "
             "[-c no_concurrent (max 4096)] "
             "[-n no_repeat] "
             "[-b (piggypack)] "
+            "[-g (gnuplot outfile)] "
             "[-p proxy] \n");
-    //"[-t timeout] \n");
+    /* "[-t timeout] \n"); */
     exit(1);
 }
 
 
-void read_params(int argc, char **argv, struct parameters_t *p_parameters){    
+void read_params(int argc, char **argv, struct parameters_t *p_parameters){
     char *arg;
     int ret;
-    while ((ret = options("h:q:c:t:p:bn:", argv, argc, &arg)) != -2)
+    while ((ret = options("h:q:c:t:p:bgn:", argv, argc, &arg)) != -2)
     {
         switch (ret)
         {
@@ -216,12 +226,17 @@ void read_params(int argc, char **argv, struct parameters_t *p_parameters){
         case 'c':
             p_parameters->concurrent = atoi(arg);
             break;
-            //case 't':
-            //p_parameters->timeout = atoi(arg);
-            //        break;
+#if 0
+            case 't':
+            p_parameters->timeout = atoi(arg);
+            break;
+#endif
         case 'b':
             p_parameters->piggypack = 1;
                     break;
+        case 'g':
+            p_parameters->gnuplot = 1;
+                    break;
         case 'n':
             p_parameters->repeat = atoi(arg);
                     break;
@@ -232,16 +247,19 @@ void read_params(int argc, char **argv, struct parameters_t *p_parameters){
             print_option_error();
         }
     }
-    
+
     if(0){
         printf("zoom-benchmark\n");
         printf("   host:       %s \n", p_parameters->host);
         printf("   query:      %s \n", p_parameters->query);
         printf("   concurrent: %d \n", p_parameters->concurrent);
         printf("   repeat:     %d \n", p_parameters->repeat);
-        //printf("   timeout:    %d \n", p_parameters->timeout);
+#if 0
+        printf("   timeout:    %d \n", p_parameters->timeout);
+#endif
         printf("   proxy:      %s \n", p_parameters->proxy);
         printf("   piggypack:  %d \n\n", p_parameters->piggypack);
+        printf("   gnuplot:    %d \n\n", p_parameters->gnuplot);
     }
 
     if (! strlen(p_parameters->host))
@@ -258,8 +276,10 @@ void read_params(int argc, char **argv, struct parameters_t *p_parameters){
         print_option_error();
 }
 
-void print_table_header()
+void print_table_header(void)
 {
+    if (parameters.gnuplot)
+        printf("#");
     printf ("target\tsecond.usec\tprogress\tevent\teventname\t");
     printf("error\terrorname\n");
 }
@@ -280,11 +300,11 @@ int main(int argc, char **argv)
 
     read_params(argc, argv, &parameters);
 
-    z = xmalloc(sizeof(*z) * parameters.concurrent);
-    r = xmalloc(sizeof(*r) * parameters.concurrent);
-    elc = xmalloc(sizeof(*elc) * parameters.concurrent * parameters.repeat);
-    els = xmalloc(sizeof(*els) 
-                  * parameters.concurrent * parameters.repeat * 10);
+    z = (ZOOM_connection *) xmalloc(sizeof(*z) * parameters.concurrent);
+    r = (ZOOM_resultset *) xmalloc(sizeof(*r) * parameters.concurrent);
+    elc = (int *) xmalloc(sizeof(*elc) * parameters.concurrent * parameters.repeat);
+    els = (struct event_line_t *) xmalloc(
+        sizeof(*els) * parameters.concurrent * parameters.repeat * 10);
     o = ZOOM_options_create();
 
     /* async mode */
@@ -304,7 +324,7 @@ int main(int argc, char **argv)
         ZOOM_options_set (o, "preferredRecordSyntax", "usmarc");
         ZOOM_options_set (o, "elementSetName", "F");
     }
-    
+
     time_init(&time);
     /* repeat loop */
     for (k = 0; k < parameters.repeat; k++){
@@ -321,7 +341,7 @@ int main(int argc, char **argv)
 
             /* create connection - pass options (they are the same for all) */
             z[i] = ZOOM_connection_create(o);
-            
+
             /* connect and init */
             ZOOM_connection_connect(z[i], parameters.host, 0);
         }
@@ -330,13 +350,13 @@ int main(int argc, char **argv)
             r[i] = ZOOM_connection_search_pqf (z[i], parameters.query);
 
         /* network I/O. pass number of connections and array of connections */
-        while ((i = ZOOM_event (parameters.concurrent, z))){ 
+        while ((i = ZOOM_event (parameters.concurrent, z))){
             int event = ZOOM_connection_last_event(z[i-1]);
             const char *errmsg;
             const char *addinfo;
             int error = 0;
-            int progress = zoom_progress[event];
-            
+            //int progress = zoom_progress[event];
+
             if (event == ZOOM_EVENT_SEND_DATA || event == ZOOM_EVENT_RECV_DATA)
                 continue;
 
@@ -345,15 +365,19 @@ int main(int argc, char **argv)
             /* updating events and event list */
             error = ZOOM_connection_error(z[i-1] , &errmsg, &addinfo);
             if (error)
-                parameters.progress[i] = -progress;
+                parameters.progress[i] = zoom_progress[ZOOM_EVENT_UNKNOWN];
+            //parameters.progress[i] = zoom_progress[ZOOM_EVENT_NONE];
+            else if (event == ZOOM_EVENT_CONNECT)
+                parameters.progress[i] = zoom_progress[event];
             else
+                //parameters.progress[i] = zoom_progress[event];
                 parameters.progress[i] += 1;
-            
+
             update_events(elc, els,
-                          k, i-1, 
-                          time_sec(&time), time_usec(&time), 
+                          k, i-1,
+                          time_sec(&time), time_usec(&time),
                           parameters.progress[i],
-                          event, zoom_events[event], 
+                          event, zoom_events[event],
                           error, errmsg);
         }
 
@@ -366,12 +390,33 @@ int main(int argc, char **argv)
 
 
 
-    } // for (k = 0; k < parameters.repeat; k++) repeat loop
+    } /* for (k = 0; k < parameters.repeat; k++) repeat loop */
 
     /* output */
-    print_table_header();    
+
+    if (parameters.gnuplot){
+        printf("# gnuplot data and instruction file \n");
+        printf("# gnuplot thisfile \n");
+        printf("\n");
+        printf("set title \"Z39.50 connection plot\"\n");
+        printf("set xlabel \"Connection\"\n");
+        printf("set ylabel \"Time Seconds\"\n");
+        printf("set zlabel \"Progress\"\n");
+        printf("set ticslevel 0\n");
+        printf("set grid\n");
+        printf("set pm3d\n");
+        printf("splot '-' using ($1):($2):($3) t '' with points\n");
+        printf("\n");
+        printf("\n");
+    }
+
+    print_table_header();
     print_events(elc,  els, parameters.concurrent);
-    
+
+    if (parameters.gnuplot){
+        printf("end\n");
+        printf("pause -1 \"Hit ENTER to return\"\n");
+    }
 
     /* destroy data structures and exit */
     xfree(z);
@@ -384,6 +429,7 @@ int main(int argc, char **argv)
 /*
  * Local variables:
  * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
  * indent-tabs-mode: nil
  * End:
  * vim: shiftwidth=4 tabstop=8 expandtab