Add a function to detect if we have async or not
Add the ASYNC_is_capable() function and use it in speed. Reviewed-by: Richard Levitte <levitte@openssl.org> Reviewed-by: Rich Salz <rsalz@openssl.org>
This commit is contained in:
42
apps/speed.c
42
apps/speed.c
@@ -99,24 +99,6 @@
|
|||||||
# include <windows.h>
|
# include <windows.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(OPENSSL_SYS_UNIX) && defined(OPENSSL_THREADS)
|
|
||||||
# include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(OPENSSL_NO_ASYNC)
|
|
||||||
# if defined(OPENSSL_SYS_UNIX) && defined(OPENSSL_THREADS)
|
|
||||||
# if _POSIX_VERSION >= 200112L
|
|
||||||
# define ASYNC_POSIX
|
|
||||||
# endif
|
|
||||||
# elif defined(_WIN32) || defined(__CYGWIN__)
|
|
||||||
# define ASYNC_WIN
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(ASYNC_POSIX) && !defined(ASYNC_WIN)
|
|
||||||
# define ASYNC_NULL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <openssl/bn.h>
|
#include <openssl/bn.h>
|
||||||
#ifndef OPENSSL_NO_DES
|
#ifndef OPENSSL_NO_DES
|
||||||
# include <openssl/des.h>
|
# include <openssl/des.h>
|
||||||
@@ -458,7 +440,7 @@ OPTIONS speed_options[] = {
|
|||||||
#ifndef NO_FORK
|
#ifndef NO_FORK
|
||||||
{"multi", OPT_MULTI, 'p', "Run benchmarks in parallel"},
|
{"multi", OPT_MULTI, 'p', "Run benchmarks in parallel"},
|
||||||
#endif
|
#endif
|
||||||
#ifndef ASYNC_NULL
|
#ifndef OPENSSL_NO_ASYNC
|
||||||
{"async_jobs", OPT_ASYNCJOBS, 'p', "Enable async mode and start pnum jobs"},
|
{"async_jobs", OPT_ASYNCJOBS, 'p', "Enable async mode and start pnum jobs"},
|
||||||
#endif
|
#endif
|
||||||
#ifndef OPENSSL_NO_ENGINE
|
#ifndef OPENSSL_NO_ENGINE
|
||||||
@@ -1136,7 +1118,7 @@ static int run_benchmark(int async_jobs, int (*loop_function)(void *), loopargs_
|
|||||||
int i = 0;
|
int i = 0;
|
||||||
OSSL_ASYNC_FD job_fd = 0;
|
OSSL_ASYNC_FD job_fd = 0;
|
||||||
size_t num_job_fds = 0;
|
size_t num_job_fds = 0;
|
||||||
#if defined(ASYNC_POSIX)
|
#if defined(OPENSSL_SYS_UNIX)
|
||||||
fd_set waitfdset;
|
fd_set waitfdset;
|
||||||
OSSL_ASYNC_FD max_fd = 0;
|
OSSL_ASYNC_FD max_fd = 0;
|
||||||
#endif
|
#endif
|
||||||
@@ -1171,7 +1153,7 @@ static int run_benchmark(int async_jobs, int (*loop_function)(void *), loopargs_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(ASYNC_POSIX)
|
#if defined(OPENSSL_SYS_UNIX)
|
||||||
FD_ZERO(&waitfdset);
|
FD_ZERO(&waitfdset);
|
||||||
|
|
||||||
/* Add to the wait set all the fds that are already in the WAIT_CTX
|
/* Add to the wait set all the fds that are already in the WAIT_CTX
|
||||||
@@ -1197,7 +1179,7 @@ static int run_benchmark(int async_jobs, int (*loop_function)(void *), loopargs_
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
while (num_inprogress > 0) {
|
while (num_inprogress > 0) {
|
||||||
#if defined(ASYNC_POSIX)
|
#if defined(OPENSSL_SYS_UNIX)
|
||||||
int select_result = 0;
|
int select_result = 0;
|
||||||
struct timeval select_timeout;
|
struct timeval select_timeout;
|
||||||
select_timeout.tv_sec = 0;
|
select_timeout.tv_sec = 0;
|
||||||
@@ -1252,7 +1234,7 @@ static int run_benchmark(int async_jobs, int (*loop_function)(void *), loopargs_
|
|||||||
if (select_result == 0)
|
if (select_result == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
#elif defined(ASYNC_WIN)
|
#elif defined(OPENSSL_SYS_WINDOWS)
|
||||||
DWORD avail = 0;
|
DWORD avail = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1269,10 +1251,10 @@ static int run_benchmark(int async_jobs, int (*loop_function)(void *), loopargs_
|
|||||||
}
|
}
|
||||||
ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd, &num_job_fds);
|
ASYNC_WAIT_CTX_get_all_fds(loopargs[i].wait_ctx, &job_fd, &num_job_fds);
|
||||||
|
|
||||||
#if defined(ASYNC_POSIX)
|
#if defined(OPENSSL_SYS_UNIX)
|
||||||
if (num_job_fds == 1 && !FD_ISSET(job_fd, &waitfdset))
|
if (num_job_fds == 1 && !FD_ISSET(job_fd, &waitfdset))
|
||||||
continue;
|
continue;
|
||||||
#elif defined(ASYNC_WIN)
|
#elif defined(OPENSSL_SYS_WINDOWS)
|
||||||
if (num_job_fds == 1 &&
|
if (num_job_fds == 1 &&
|
||||||
!PeekNamedPipe(job_fd, NULL, 0, NULL, &avail, NULL) && avail > 0)
|
!PeekNamedPipe(job_fd, NULL, 0, NULL, &avail, NULL) && avail > 0)
|
||||||
continue;
|
continue;
|
||||||
@@ -1290,7 +1272,7 @@ static int run_benchmark(int async_jobs, int (*loop_function)(void *), loopargs_
|
|||||||
total_op_count += job_op_count;
|
total_op_count += job_op_count;
|
||||||
}
|
}
|
||||||
--num_inprogress;
|
--num_inprogress;
|
||||||
#if defined(ASYNC_POSIX)
|
#if defined(OPENSSL_SYS_UNIX)
|
||||||
FD_CLR(job_fd, &waitfdset);
|
FD_CLR(job_fd, &waitfdset);
|
||||||
#endif
|
#endif
|
||||||
loopargs[i].inprogress_job = NULL;
|
loopargs[i].inprogress_job = NULL;
|
||||||
@@ -1520,8 +1502,14 @@ int speed_main(int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case OPT_ASYNCJOBS:
|
case OPT_ASYNCJOBS:
|
||||||
#ifndef ASYNC_NULL
|
#ifndef OPENSSL_NO_ASYNC
|
||||||
async_jobs = atoi(opt_arg());
|
async_jobs = atoi(opt_arg());
|
||||||
|
if (!ASYNC_is_capable()) {
|
||||||
|
BIO_printf(bio_err,
|
||||||
|
"%s: async_jobs specified but async not supported\n",
|
||||||
|
prog);
|
||||||
|
goto opterr;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case OPT_MISALIGN:
|
case OPT_MISALIGN:
|
||||||
|
|||||||
@@ -55,6 +55,11 @@
|
|||||||
|
|
||||||
#ifdef ASYNC_NULL
|
#ifdef ASYNC_NULL
|
||||||
|
|
||||||
|
int ASYNC_is_capable(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void async_local_cleanup(void)
|
void async_local_cleanup(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,11 +60,15 @@
|
|||||||
|
|
||||||
#define STACKSIZE 32768
|
#define STACKSIZE 32768
|
||||||
|
|
||||||
|
int ASYNC_is_capable(void)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
void async_local_cleanup(void)
|
void async_local_cleanup(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int async_fibre_makecontext(async_fibre *fibre)
|
int async_fibre_makecontext(async_fibre *fibre)
|
||||||
{
|
{
|
||||||
fibre->env_init = 0;
|
fibre->env_init = 0;
|
||||||
|
|||||||
@@ -58,6 +58,11 @@
|
|||||||
# include <windows.h>
|
# include <windows.h>
|
||||||
# include "internal/cryptlib.h"
|
# include "internal/cryptlib.h"
|
||||||
|
|
||||||
|
int ASYNC_is_capable(void)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
void async_local_cleanup(void)
|
void async_local_cleanup(void)
|
||||||
{
|
{
|
||||||
async_ctx *ctx = async_get_ctx();
|
async_ctx *ctx = async_get_ctx();
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
ASYNC_init_thread, ASYNC_cleanup_thread, ASYNC_start_job, ASYNC_pause_job,
|
ASYNC_init_thread, ASYNC_cleanup_thread, ASYNC_start_job, ASYNC_pause_job,
|
||||||
ASYNC_in_job, ASYNC_get_wait_fd, ASYNC_set_wait_fd, ASYNC_clear_wait_fd,
|
ASYNC_in_job, ASYNC_get_wait_fd, ASYNC_set_wait_fd, ASYNC_clear_wait_fd,
|
||||||
ASYNC_get_current_job, ASYNC_block_pause, ASYNC_unblock_pause - asynchronous job
|
ASYNC_get_current_job, ASYNC_block_pause, ASYNC_unblock_pause, ASYNC_is_capable
|
||||||
management functions
|
- asynchronous job management functions
|
||||||
|
|
||||||
=head1 SYNOPSIS
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
@@ -23,6 +23,8 @@ management functions
|
|||||||
void ASYNC_block_pause(void);
|
void ASYNC_block_pause(void);
|
||||||
void ASYNC_unblock_pause(void);
|
void ASYNC_unblock_pause(void);
|
||||||
|
|
||||||
|
int ASYNC_is_capable(void);
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
OpenSSL implements asynchronous capabilities through an ASYNC_JOB. This
|
OpenSSL implements asynchronous capabilities through an ASYNC_JOB. This
|
||||||
@@ -137,6 +139,9 @@ ASYNC_block_pause() immediately after aquiring the lock and
|
|||||||
ASYNC_unblock_pause() immediately before releasing it then this situation cannot
|
ASYNC_unblock_pause() immediately before releasing it then this situation cannot
|
||||||
occur.
|
occur.
|
||||||
|
|
||||||
|
Some platforms cannot support async operations. The ASYNC_is_capable() function
|
||||||
|
can be used to detect whether the current platform is async capable or not.
|
||||||
|
|
||||||
=head1 RETURN VALUES
|
=head1 RETURN VALUES
|
||||||
|
|
||||||
ASYNC_init_thread returns 1 on success or 0 otherwise.
|
ASYNC_init_thread returns 1 on success or 0 otherwise.
|
||||||
@@ -153,6 +158,9 @@ NULL if not within the context of a job.
|
|||||||
|
|
||||||
ASYNC_get_wait_ctx() returns a pointer to the ASYNC_WAIT_CTX for the job.
|
ASYNC_get_wait_ctx() returns a pointer to the ASYNC_WAIT_CTX for the job.
|
||||||
|
|
||||||
|
ASYNC_is_capable() returns 1 if the current platform is async capable or 0
|
||||||
|
otherwise.
|
||||||
|
|
||||||
=head1 EXAMPLE
|
=head1 EXAMPLE
|
||||||
|
|
||||||
The following example demonstrates how to use most of the core async APIs:
|
The following example demonstrates how to use most of the core async APIs:
|
||||||
@@ -295,8 +303,9 @@ L<crypto(3)>, L<ERR_print_errors(3)>
|
|||||||
|
|
||||||
=head1 HISTORY
|
=head1 HISTORY
|
||||||
|
|
||||||
ASYNC_init, ASYNC_init_thread, ASYNC_cleanup, ASYNC_cleanup_thread,
|
ASYNC_init_thread, ASYNC_cleanup_thread,
|
||||||
ASYNC_start_job, ASYNC_pause_job, ASYNC_get_wait_fd, ASYNC_get_current_job,
|
ASYNC_start_job, ASYNC_pause_job, ASYNC_get_current_job, ASYNC_get_wait_ctx(),
|
||||||
ASYNC_wake, ASYNC_clear_wake were first added to OpenSSL 1.1.0.
|
ASYNC_block_pause(), ASYNC_unblock_pause() and ASYNC_is_capable() were first
|
||||||
|
added to OpenSSL 1.1.0.
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|||||||
@@ -96,6 +96,8 @@ int ASYNC_WAIT_CTX_get_changed_fds(ASYNC_WAIT_CTX *ctx, OSSL_ASYNC_FD *addfd,
|
|||||||
size_t *numdelfds);
|
size_t *numdelfds);
|
||||||
int ASYNC_WAIT_CTX_clear_fd(ASYNC_WAIT_CTX *ctx, const void *key);
|
int ASYNC_WAIT_CTX_clear_fd(ASYNC_WAIT_CTX *ctx, const void *key);
|
||||||
|
|
||||||
|
int ASYNC_is_capable(void);
|
||||||
|
|
||||||
int ASYNC_start_job(ASYNC_JOB **job, ASYNC_WAIT_CTX *ctx, int *ret,
|
int ASYNC_start_job(ASYNC_JOB **job, ASYNC_WAIT_CTX *ctx, int *ret,
|
||||||
int (*func)(void *), void *args, size_t size);
|
int (*func)(void *), void *args, size_t size);
|
||||||
int ASYNC_pause_job(void);
|
int ASYNC_pause_job(void);
|
||||||
|
|||||||
Reference in New Issue
Block a user