Hi, I saw that 2 loops are almost identical, and I think diff tidy up these 2 loops in 1 function.
I found these 2 lines were not in original code. > + shutdown(SSL_get_fd(scon), SHUT_RDWR); > + close(SSL_get_fd(scon)); Is this part needed ? Kinichiro Inoguchi On Thu, Aug 09, 2018 at 06:00:23PM -0500, Scott Cheloha wrote: > Hi, > > s_time -- everyone's perennial pick for favorite openssl app -- has a > lot of copy & paste. Here's a first shot at refactoring that away. > > We can merge the two benchmark loops, the timing stuff, and the report > printing, as all of it is nearly identical. > > I modified as little as possible when moving and merging things so it's > obvious to the reader that the behavior is completely unchanged. There's > cleanup and minor bugfixing I'd like to do, but that belongs in a separate > diff to keep this review easy. > > Thoughts & feedback? ok? > > -- > Scott Cheloha > > Index: usr.bin/openssl/s_time.c > =================================================================== > RCS file: /cvs/src/usr.bin/openssl/s_time.c,v > retrieving revision 1.24 > diff -u -p -r1.24 s_time.c > --- usr.bin/openssl/s_time.c 13 Jul 2018 18:36:56 -0000 1.24 > +++ usr.bin/openssl/s_time.c 9 Aug 2018 22:45:20 -0000 > @@ -91,6 +91,7 @@ extern int verify_depth; > > static void s_time_usage(void); > static SSL *doConnection(SSL * scon); > +static int benchmark(int); > > static SSL_CTX *tm_ctx = NULL; > static const SSL_METHOD *s_time_meth = NULL; > @@ -244,13 +245,7 @@ tm_Time_F(int op) > int > s_time_main(int argc, char **argv) > { > - double totalTime = 0.0; > - int nConn = 0; > - SSL *scon = NULL; > - time_t finishtime; > int ret = 1; > - char buf[1024 * 8]; > - int ver; > > if (single_execution) { > if (pledge("stdio rpath inet dns", NULL) == -1) { > @@ -328,60 +323,8 @@ s_time_main(int argc, char **argv) > > /* Loop and time how long it takes to make connections */ > > - bytes_read = 0; > - finishtime = time(NULL) + s_time_config.maxtime; > - tm_Time_F(START); > - for (;;) { > - if (finishtime < time(NULL)) > - break; > - if ((scon = doConnection(NULL)) == NULL) > - goto end; > - > - if (s_time_config.www_path != NULL) { > - int i, retval = snprintf(buf, sizeof buf, > - "GET %s HTTP/1.0\r\n\r\n", s_time_config.www_path); > - if ((size_t)retval >= sizeof buf) { > - fprintf(stderr, "URL too long\n"); > - goto end; > - } > - SSL_write(scon, buf, strlen(buf)); > - while ((i = SSL_read(scon, buf, sizeof(buf))) > 0) > - bytes_read += i; > - } > - if (s_time_config.no_shutdown) > - SSL_set_shutdown(scon, SSL_SENT_SHUTDOWN | > - SSL_RECEIVED_SHUTDOWN); > - else > - SSL_shutdown(scon); > - > - nConn += 1; > - if (SSL_session_reused(scon)) > - ver = 'r'; > - else { > - ver = SSL_version(scon); > - if (ver == TLS1_VERSION) > - ver = 't'; > - else if (ver == SSL3_VERSION) > - ver = '3'; > - else if (ver == SSL2_VERSION) > - ver = '2'; > - else > - ver = '*'; > - } > - fputc(ver, stdout); > - fflush(stdout); > - > - SSL_free(scon); > - scon = NULL; > - } > - totalTime += tm_Time_F(STOP); /* Add the time for this iteration */ > - > - printf("\n\n%d connections in %.2fs; %.2f connections/user sec, bytes > read %ld\n", > - nConn, totalTime, ((double) nConn / totalTime), bytes_read); > - printf("%d connections in %lld real seconds, %ld bytes read per > connection\n", > - nConn, > - (long long)(time(NULL) - finishtime + s_time_config.maxtime), > - bytes_read / nConn); > + if (benchmark(0)) > + goto end; > > /* > * Now loop and time connections using the same session id over and > @@ -393,88 +336,11 @@ s_time_main(int argc, char **argv) > goto end; > printf("\n\nNow timing with session id reuse.\n"); > > - /* Get an SSL object so we can reuse the session id */ > - if ((scon = doConnection(NULL)) == NULL) { > - fprintf(stderr, "Unable to get connection\n"); > + if (benchmark(1)) > goto end; > - } > - if (s_time_config.www_path != NULL) { > - int retval = snprintf(buf, sizeof buf, > - "GET %s HTTP/1.0\r\n\r\n", s_time_config.www_path); > - if ((size_t)retval >= sizeof buf) { > - fprintf(stderr, "URL too long\n"); > - goto end; > - } > - SSL_write(scon, buf, strlen(buf)); > - while (SSL_read(scon, buf, sizeof(buf)) > 0); > - } > - if (s_time_config.no_shutdown) > - SSL_set_shutdown(scon, SSL_SENT_SHUTDOWN | > - SSL_RECEIVED_SHUTDOWN); > - else > - SSL_shutdown(scon); > - > - nConn = 0; > - totalTime = 0.0; > - > - finishtime = time(NULL) + s_time_config.maxtime; > - > - printf("starting\n"); > - bytes_read = 0; > - tm_Time_F(START); > - > - for (;;) { > - if (finishtime < time(NULL)) > - break; > - if ((doConnection(scon)) == NULL) > - goto end; > - > - if (s_time_config.www_path) { > - int i, retval = snprintf(buf, sizeof buf, > - "GET %s HTTP/1.0\r\n\r\n", s_time_config.www_path); > - if ((size_t)retval >= sizeof buf) { > - fprintf(stderr, "URL too long\n"); > - goto end; > - } > - SSL_write(scon, buf, strlen(buf)); > - while ((i = SSL_read(scon, buf, sizeof(buf))) > 0) > - bytes_read += i; > - } > - if (s_time_config.no_shutdown) > - SSL_set_shutdown(scon, SSL_SENT_SHUTDOWN | > - SSL_RECEIVED_SHUTDOWN); > - else > - SSL_shutdown(scon); > - > - nConn += 1; > - if (SSL_session_reused(scon)) > - ver = 'r'; > - else { > - ver = SSL_version(scon); > - if (ver == TLS1_VERSION) > - ver = 't'; > - else if (ver == SSL3_VERSION) > - ver = '3'; > - else if (ver == SSL2_VERSION) > - ver = '2'; > - else > - ver = '*'; > - } > - fputc(ver, stdout); > - fflush(stdout); > - } > - totalTime += tm_Time_F(STOP); /* Add the time for this iteration */ > - > - printf("\n\n%d connections in %.2fs; %.2f connections/user sec, bytes > read %ld\n", nConn, totalTime, ((double) nConn / totalTime), bytes_read); > - printf("%d connections in %lld real seconds, %ld bytes read per > connection\n", > - nConn, > - (long long)(time(NULL) - finishtime + s_time_config.maxtime), > - bytes_read / nConn); > > ret = 0; > end: > - SSL_free(scon); > - > if (tm_ctx != NULL) { > SSL_CTX_free(tm_ctx); > tm_ctx = NULL; > @@ -541,4 +407,111 @@ doConnection(SSL * scon) > return NULL; > } > return serverCon; > +} > + > +static int > +benchmark(int reuse_session) > +{ > + double totalTime = 0.0; > + int nConn = 0; > + SSL *scon = NULL; > + time_t finishtime; > + int ret = 1; > + char buf[1024 * 8]; > + int ver; > + > + if (reuse_session) { > + /* Get an SSL object so we can reuse the session id */ > + if ((scon = doConnection(NULL)) == NULL) { > + fprintf(stderr, "Unable to get connection\n"); > + goto end; > + } > + if (s_time_config.www_path != NULL) { > + int retval = snprintf(buf, sizeof buf, > + "GET %s HTTP/1.0\r\n\r\n", s_time_config.www_path); > + if ((size_t)retval >= sizeof buf) { > + fprintf(stderr, "URL too long\n"); > + goto end; > + } > + SSL_write(scon, buf, strlen(buf)); > + while (SSL_read(scon, buf, sizeof(buf)) > 0); > + } > + if (s_time_config.no_shutdown) > + SSL_set_shutdown(scon, SSL_SENT_SHUTDOWN | > + SSL_RECEIVED_SHUTDOWN); > + else > + SSL_shutdown(scon); > + shutdown(SSL_get_fd(scon), SHUT_RDWR); > + close(SSL_get_fd(scon)); > + printf("starting\n"); > + } > + > + nConn = 0; > + totalTime = 0.0; > + > + finishtime = time(NULL) + s_time_config.maxtime; > + > + bytes_read = 0; > + tm_Time_F(START); > + > + for (;;) { > + if (finishtime < time(NULL)) > + break; > + if ((scon = doConnection(reuse_session ? scon : NULL)) == NULL) > + goto end; > + > + if (s_time_config.www_path) { > + int i, retval = snprintf(buf, sizeof buf, > + "GET %s HTTP/1.0\r\n\r\n", s_time_config.www_path); > + if ((size_t)retval >= sizeof buf) { > + fprintf(stderr, "URL too long\n"); > + goto end; > + } > + SSL_write(scon, buf, strlen(buf)); > + while ((i = SSL_read(scon, buf, sizeof(buf))) > 0) > + bytes_read += i; > + } > + if (s_time_config.no_shutdown) > + SSL_set_shutdown(scon, SSL_SENT_SHUTDOWN | > + SSL_RECEIVED_SHUTDOWN); > + else > + SSL_shutdown(scon); > + shutdown(SSL_get_fd(scon), SHUT_RDWR); > + close(SSL_get_fd(scon)); > + > + nConn += 1; > + if (SSL_session_reused(scon)) > + ver = 'r'; > + else { > + ver = SSL_version(scon); > + if (ver == TLS1_VERSION) > + ver = 't'; > + else if (ver == SSL3_VERSION) > + ver = '3'; > + else if (ver == SSL2_VERSION) > + ver = '2'; > + else > + ver = '*'; > + } > + fputc(ver, stdout); > + fflush(stdout); > + > + if (!reuse_session) { > + SSL_free(scon); > + scon = NULL; > + } > + } > + totalTime += tm_Time_F(STOP); /* Add the time for this iteration */ > + > + printf("\n\n%d connections in %.2fs; %.2f connections/user sec, bytes > read %ld\n", > + nConn, totalTime, ((double) nConn / totalTime), bytes_read); > + printf("%d connections in %lld real seconds, %ld bytes read per > connection\n", > + nConn, > + (long long)(time(NULL) - finishtime + s_time_config.maxtime), > + bytes_read / nConn); > + > + ret = 0; > +end: > + SSL_free(scon); > + return ret; > } >