ASYNC_start_job(3) - wariua/manpages-ko GitHub Wiki
ASYNC_get_wait_ctx, ASYNC_init_thread, ASYNC_cleanup_thread, ASYNC_start_job, ASYNC_pause_job, ASYNC_get_current_job, ASYNC_block_pause, ASYNC_unblock_pause, ASYNC_is_capable - λΉλκΈ° μμ κ΄λ¦¬ ν¨μλ€
#include <openssl/async.h>
int ASYNC_init_thread(size_t max_size, size_t init_size);
void ASYNC_cleanup_thread(void);
int ASYNC_start_job(ASYNC_JOB **job, ASYNC_WAIT_CTX *ctx, int *ret,
int (*func)(void *), void *args, size_t size);
int ASYNC_pause_job(void);
ASYNC_JOB *ASYNC_get_current_job(void);
ASYNC_WAIT_CTX *ASYNC_get_wait_ctx(ASYNC_JOB *job);
void ASYNC_block_pause(void);
void ASYNC_unblock_pause(void);
int ASYNC_is_capable(void);
OpenSSLμμλ ASYNC_JOBμ ν΅ν΄ λΉλκΈ° κΈ°λ₯μ ꡬννλ€. ASYNC_JOBμ μ€νμ μμν μ μλ μ½λλ₯Ό λνλ΄λ©° μ΄λ€ μ΄λ²€νΈκ° λ°μν λκΉμ§ μ€νλλ€. κ·Έ μμ μμ μ½λλ₯Ό λ©μΆ μ μμΌλ©°, κ·Έλ¬λ©΄ μ΄λ€ νμ μ΄λ²€νΈμ λ°λΌ μμ μ μ¬κ°ν μ μκ² λκΈ° μ κΉμ§λ μ μ΄κ° μ¬μ©μ μ½λλ‘ λμκ°λ€.
ASYNC_JOB μμ±μ κ½€ λΉμ©μ΄ ν° λμμ΄λ€. λ°λΌμ ν¨μ¨μ±μ μν΄ μμ
λ€μ 미리 λ§λ€μ΄ λκ³ μ¬λ¬ λ² μ¬μ¬μ©ν μ μλ€. νμ μ μ§νλ€κ° νμν΄μ§ λ νμμ κΊΌλ΄μ μ¬μ©νκ³ , μμ
μ΄ λλλ©΄ νλ‘ λλ €μ€λ€. μ¬μ©μ μμ©μ΄ λ€μ€ μ€λ λ λ°©μμ΄λΌλ©΄ μ€λ λλ§λ€ ASYNC_init_thread()
λ₯Ό νΈμΆν΄μ λΉλκΈ° μμ
λ€μ μ΄κΈ°ν ν μ μλ€. μ¬μ©μ μ½λκ° λλκΈ° μ μ μ€λ λλ³ μμμ μ 리ν νμκ° μλ€. 보ν΅μ μλμΌλ‘ μ΄λ€μ§μ§λ§ (OPENSSL_init_crypto(3)
μ°Έκ³ ) ASYNC_cleanup_thread()
λ₯Ό μ¨μ λͺ
μμ μΌλ‘ κ°μν μλ μλ€. ASYNC_cleanup_thread()
νΈμΆ λ κ·Έ μ€λ λμ λ―Έμλ£μΈ λΉλκΈ° μμ
μ΄ μμ΄μ μ λλ€. νΉμλΌλ μμΌλ©΄ λ©λͺ¨λ¦¬ λμλ₯Ό μ λ°νκ² λλ€.
max_size
μΈμλ νμ μ μ§ν ASYNC_JOBμ μλ₯Ό μ ννλ€. max_size
λ₯Ό 0μΌλ‘ μ€μ νλ©΄ μνμ λμ§ μλλ€. ASYNC_JOBμ΄ νμνλ° ν μμ λ¨μ μλ κ² μλ κ²½μ° κ·Έ νμμ κ΄λ¦¬νλ ASYNC_JOB μ΄κ°μκ° max_size
λ₯Ό μ΄κ³Όνμ§ μλ νμμ μ νλͺ©μ μλμΌλ‘ μμ±νκ² λλ€. κ·Έλ¦¬κ³ νμ μ²μ μ΄κΈ°ν ν λ ASYNC_JOB init_size
κ°λ₯Ό μ¦μ μμ±νλ€. νμ μ²μ μ°κΈ° μ μ ASYNC_init_thread()
λ₯Ό νΈμΆνμ§ μμΌλ©΄ max_size
λ₯Ό 0(μν μμ)μΌλ‘ νκ³ init_size
λ₯Ό 0(미리 λ§λλ ASYNC_JOB μμ)μΌλ‘ ν΄μ μλμΌλ‘ νΈμΆνλ€.
ASYNC_start_job()
ν¨μλ₯Ό νΈμΆν΄μ λΉλκΈ° μμ
μ μμνλ€. μ²μμλ *job
μ΄ NULLμ΄μ΄μΌ νλ€. ctx
λ ASYNC_WAIT_CTX_new(3) ν¨μλ₯Ό ν΅ν΄ λ§λ ASYNC_WAIT_CTX κ°μ²΄λ₯Ό κ°λ¦¬μΌμΌ νλ€. ret
λ μμ
μλ£ μ λΉλκΈ° ν¨μμ λ°ν κ°μ μ μ₯ν μμΉλ₯Ό κ°λ¦¬μΌμΌ νλ€. func
λ λΉλκΈ°μ μΌλ‘ μμν ν¨μλ₯Ό λνλΈλ€. μμ
μμ μ args
κ° κ°λ¦¬ν€λ ν¬κΈ° size
μΈ λ°μ΄ν°λ₯Ό 볡μ¬ν΄μ func
μΈμλ‘ μ λ¬νλ€. ASYNC_start_job()
μ λ€μ κ°λ€ μ€ νλλ₯Ό λ°ννλ€.
ASYNC_ERR
- μμ
μμ μλ μ€ μ€λ₯κ° λ°μνλ€. μμΈν λ΄μ©μ OpenSSL μ€λ₯ ν(κ°λ Ή
ERR_print_errors(3)
)λ₯Ό νμΈνλΌ. ASYNC_NO_JOBS
- νμ νμ¬ μ¬μ© κ°λ₯ν μμ μ΄ μλ€. μ΄ νΈμΆμ μ΄νμ λ€μ μλν μ μλ€.
ASYNC_PAUSE
- μμ
μ΄ μ±κ³΅μ μΌλ‘ μμλμ§λ§ μλ£λκΈ° μ μ "μ μ§"λμλ€. (μλ
ASYNC_pause_job()
μ°Έκ³ .) μμ μ λν νΈλ€μ΄*job
μ λ€μ΄κ°λ€. (μνλ€λ©΄) λ€λ₯Έ μμ μ μννκ³ μ΄νμ μμ μ μ¬μμν μ μλ€. μμ μ μ¬μμνλ €λ©΄*job
μ μμ νΈλ€μ μ€μ λ€μASYNC_start_job()
μ νΈμΆνλ©΄ λλ€. μμ μ μ¬μμν λfunc
,args
,size
λ§€κ°λ³μλ 무μλλ€. μμ μ μ¬μμν λλ λ°λμ κ·Έ μμ μ μ²μ μμνλ μ€λ λμμASYNC_start_job()
μ νΈμΆν΄μΌ νλ€. ASYNC_FINISH
- μμ
μ΄ λλ¬λ€.
*job
μ΄ NULLμ΄ λκ³func
μ λ°ν κ°μ΄*ret
μ λ€μ΄κ°λ€.
μ΄λ μμ μ΄λ μ€λ λλ³λ‘ μ΅λ 1κ° μμ
μ΄ νλμ μΌλ‘ μ€ν μ€μΌ μ μλ€. (κ·Έλ¦¬κ³ μ¬λ¬ μμ
μ΄ μ€μ§λΌ μμ μ μλ€.) ASYNC_get_current_job()
μ μ΄μ©ν΄ νμ¬ μ€ν μ€μΈ ASYNC_JOBμ λν ν¬μΈν°λ₯Ό μ»μ μ μλ€. νμ¬ μ€ν μ€μΈ μμ
μ΄ μμΌλ©΄ NULLμ λ°ννλ€.
μμ
λ¬Έλ§₯ λ΄μμ ASYNC_pause_job()
μ μ€ννλ©΄ (μ¦ ASYNC_start_job()
μΈμλ‘ μ€ ν¨μ func
μμ μ§κ°μ μ μΌλ‘ νΈμΆνλ©΄) ASYNC_start_job()
μ νΈμΆν μμ©μΌλ‘ μ¦μ μ μ΄κ° λλμκ°μ ASYNC_start_job()
νΈμΆμ΄ ASYNC_PAUSE
λ₯Ό λ°ννλ€. μ΄νμ *job
λ§€κ°λ³μμ μλ ν΄λΉ ASYNC_JOBμ μ€μ ASYNC_start_job()
μ νΈμΆνλ©΄ ASYNC_pause_job()
νΈμΆ μ§μ μμ μ€νμ΄ μ¬κ°λλ€. μμ
λ¬Έλ§₯ λ΄μ μμ§ μμ μνμμ ASYNC_pause_job()
μ νΈμΆνλ©΄ μ무 λμλ μ΄λ€μ§μ§ μμΌλ©° ASYNC_pause_job()
μ΄ μ¦μ λ°ννλ€.
ASYNC_get_wait_ctx()
λ₯Ό μ΄μ©ν΄ job
μ ASYNC_WAIT_CTXμ λν ν¬μΈν°λ₯Ό μ»μ μ μλ€. ASYNC_WAIT_CTXμλ "λκΈ°" νμΌ λμ€ν¬λ¦½ν°λ₯Ό μ°κ³ν μ μλ€. μμ©μμ selectλ poll κ°μ μμ€ν
ν¨μ νΈμΆμ μ΄μ©ν΄ νμΌ λμ€ν¬λ¦½ν°κ° "μ½κΈ°" μ€λΉκ° λκΈ°λ₯Ό κΈ°λ€λ¦΄ μ μλ€. ("μ½κΈ°" μ€λΉκ° λλ κ²μ μμ
μ μ¬κ°ν΄μΌ νλ€λ νμμ΄λ€.) μ 곡λ°λ νμΌ λμ€ν¬λ¦½ν°κ° μλ€λ©΄ μμ©μμ μ£ΌκΈ°μ μΌλ‘ μμ
μ μ¬μμνλ λ°©μμΌλ‘ μμ
μ΄ μ€νμ μ΄μ΄κ° μ€λΉκ° λμ΄ μλμ§ νμΈν΄ λ΄μΌ ν κ²μ΄λ€.
μΌλ°μ μΈ μ¬μ©λ‘λ‘λ λΉλκΈ° μ§μ μμ§μ΄ μμ μ μλ€. μΌλ¨ μ¬μ©μ μ½λμμ μνΈ μ°μ°μ κ°μνλ€. μμ§μ΄ κ·Έ μ°μ°μ λΉλκΈ°μ μΌλ‘ κ°μνκ³ μ ASYNC_WAIT_CTX_set_wait_fd(3)μ μ΄μ΄ ASYNC_pause_job()
μ νΈμΆν΄μ μ¬μ©μ μ½λλ‘ μ μ΄λ₯Ό λλ €μ€λ€. κ·Έλ¬λ©΄ μ¬μ©μ μ½λμμλ λ€λ₯Έ μμ
μ μννκ±°λ κ·Έ λκΈ° νμΌ λμ€ν¬λ¦½ν°μ "select" λ΄μ§ κΈ°ν μ μ¬ ν¨μλ₯Ό νΈμΆν΄μ μμ
μ΄ μ€λΉ μνκ° λκΈ°λ₯Ό κΈ°λ€λ¦΄ μ μλ€. κ·Έλ¦¬κ³ μμ§μμλ λκΈ° νμΌ λμ€ν¬λ¦½ν°λ₯Ό "μ½κΈ° κ°λ₯"μΌλ‘ λ§λ€μ΄ μμ
μ μ¬κ°ν΄μΌ νλ€λ μ νΈλ₯Ό μ€ μ μλ€. μ€νμ΄ μ¬κ°λλ©΄ μμ§μμλ λκΈ° νμΌ λμ€ν¬λ¦½ν°μμ κΉ¨μ°λ μ νΈλ₯Ό μμ μΌ νλ€.
ASYNC_block_pause()
ν¨μλ νμ¬ νμ± μμ
μ΄ μ€μ§λλ κ²μ λ§λλ€. μ΄ν ASYNC_unblock_pause()
λ₯Ό νΈμΆν λκΉμ§ μ°¨λ¨μ΄ μ μ§λλ€. μ΄ ν¨μλ€μ μ€λ³΅ νΈμΆμ΄ κ°λ₯νλ€. κ°λ Ή ASYNC_block_pause()
λ₯Ό λ λ² νΈμΆνμΌλ©΄ ASYNC_unblock_pause()
λ₯Ό λ λ² νΈμΆν΄μΌ μ€μ§κ° μ¬νμ±νλλ€. νμ¬ νμ± μμ
μ΄ μλ μνμμ μ΄ ν¨μλ€μ νΈμΆνλ 건 μ무 ν¨κ³Όκ° μλ€. μ΄ κΈ°λ₯μ κ΅μ°© μλ리μ€λ₯Ό νΌνλ λ° λμμ΄ λ μ μλ€. μλ₯Ό λ€μ΄ μ΄λ€ ASYNC_JOB μ€ν μ€μ μμ©μμ λ½μ νλνλ€κ³ νμ. κ·Έλ¬κ³ μ μ΄λ€ μνΈ ν¨μλ₯Ό νΈμΆνκ³ κ±°κΈ°μ ASYNC_pause_job()
μ λΆλ₯Έλ€. μ΄λ κ² νλ©΄ ASYNC_JOBμ μμ±νλ μ½λλ‘ μ μ΄κ° λλμκ°λ€. κ·Έλ° λ€μ κ·Έ μ½λμμ μλ μμ
μ μ¬κ°νκΈ° μ μ κ·Έ λμΌ λ½μ νλνλ €κ³ νλ©΄ κ΅μ°©μ΄ λ°μν μ μλ€. λ½μ μ‘μλ§μ ASYNC_block_pause()
λ₯Ό νΈμΆνκ³ λ½μ λκΈ° λ°λ‘ μ μ ASYNC_unblock_pause()
λ₯Ό νΈμΆνλ©΄ μ΄λ° κ²½μ°κ° μκΈΈ μ μλ€.
μΌλΆ νλ«νΌμ λΉλκΈ° λμμ μ§μνμ§ λͺ»νλ€. ASYNC_is_capable()
ν¨μλ₯Ό μ΄μ©ν΄ νμ¬ νλ«νΌμ΄ λΉλκΈ° λμμ μ§μνλμ§ μ¬λΆλ₯Ό νμ§ν μ μλ€.
ASYNC_init_thread()
λ μ±κ³΅ μ 1μ λ°ννκ³ μλλ©΄ 0μ λ°ννλ€.
ASYNC_start_job()
μ μμ μ€λͺ
ν λλ‘ ASYNC_ERR
, ASYNC_NO_JOBS
, ASYNC_PAUSE
, ASYNC_FINISH
μ€ νλλ₯Ό λ°ννλ€.
ASYNC_pause_job()
μ μ€λ₯ μ 0μ λ°ννκ³ μ±κ³΅ μ 1μ λ°ννλ€. ASYNC_JOB λ¬Έλ§₯ μμ΄ μλ λ νΈμΆνλ©΄ μ±κ³΅μΌλ‘ μ³μ 1μ λ°ννλ€.
ASYNC_get_current_job()
μ νμ¬ μ€ν μ€μΈ ASYNC_JOBμ λν ν¬μΈν°λ₯Ό λ°ννκ³ μμ
λ¬Έλ§₯ μμ΄ μλλ©΄ NULLμ λ°ννλ€.
ASYNC_get_wait_ctx()
λ μμ
μ ASYNC_WAIT_CTXμ λν ν¬μΈν°λ₯Ό λ°ννλ€.
ASYNC_is_capable()
μ νμ¬ νλ«νΌμ΄ λΉλκΈ°λ₯Ό μ§μνλ©΄ 1μ λ°ννκ³ μλλ©΄ 0μ λ°ννλ€.
μλμ° νλ«νΌμμλ openssl/async.h
ν€λμ νμν λͺ κ°μ§ νμ
λ€μ΄ λ³΄ν΅ windows.h
λ₯Ό ν¬ν¨μμΌμΌ μ¬μ© κ°λ₯ν΄μ§λ€. κ·Έλ°λ° κ°μ₯ λ¨Όμ ν¬ν¨μν€λ ν€λλ€ μ€ νλμΈ windows.h
λ₯Ό μΈμ ν¬ν¨μν¬μ§λ₯Ό μμ© κ°λ°μκ° ν΅μ ν μ μμ΄μΌ νλ κ²½μ°κ° λ§λ€. λ°λΌμ async.h
μ μμ windows.h
λ₯Ό ν¬ν¨μν€λ κ²μ μμ© κ°λ°μμ μ±
μμΌλ‘ κ·μ νλ€.
λ€μ μλ ν΅μ¬ λΉλκΈ° API λλΆλΆμ μ¬μ© λ°©μμ λ³΄μ¬ μ€λ€.
#ifdef _WIN32
# include <windows.h>
#endif
#include <stdio.h>
#include <unistd.h>
#include <openssl/async.h>
#include <openssl/crypto.h>
int unique = 0;
void cleanup(ASYNC_WAIT_CTX *ctx, const void *key, OSSL_ASYNC_FD r, void *vw)
{
OSSL_ASYNC_FD *w = (OSSL_ASYNC_FD *)vw;
close(r);
close(*w);
OPENSSL_free(w);
}
int jobfunc(void *arg)
{
ASYNC_JOB *currjob;
unsigned char *msg;
int pipefds[2] = {0, 0};
OSSL_ASYNC_FD *wptr;
char buf = 'X';
currjob = ASYNC_get_current_job();
if (currjob != NULL) {
printf("Executing within a job\n");
} else {
printf("Not executing within a job - should not happen\n");
return 0;
}
msg = (unsigned char *)arg;
printf("Passed in message is: %s\n", msg);
if (pipe(pipefds) != 0) {
printf("Failed to create pipe\n");
return 0;
}
wptr = OPENSSL_malloc(sizeof(OSSL_ASYNC_FD));
if (wptr == NULL) {
printf("Failed to malloc\n");
return 0;
}
*wptr = pipefds[1];
ASYNC_WAIT_CTX_set_wait_fd(ASYNC_get_wait_ctx(currjob), &unique,
pipefds[0], wptr, cleanup);
/*
* 보ν΅μ μΌλ§ ν μ΄λ€ μΈλΆ μ΄λ²€νΈμ μν΄ μ΄λ κ² λλ©°
* μ΄κ±΄ μμ°μ©μ΄λ€. ASYNC_pause_job()μ ν΅ν΄ λ©μΈμΌλ‘
* λ°νν νμ λ°λ‘ κΉ¨μ΄λ μ€λΉκ° λλ€λ μ νΈκ° κ°λ€.
*/
write(pipefds[1], &buf, 1);
/* μ μ΄λ₯Ό λ©μΈμΌλ‘ λ°ν */
ASYNC_pause_job();
/* κΈ°μ μ νΈ λΉμ°κΈ° */
read(pipefds[0], &buf, 1);
printf ("Resumed the job after a pause\n");
return 1;
}
int main(void)
{
ASYNC_JOB *job = NULL;
ASYNC_WAIT_CTX *ctx = NULL;
int ret;
OSSL_ASYNC_FD waitfd;
fd_set waitfdset;
size_t numfds;
unsigned char msg[13] = "Hello world!";
printf("Starting...\n");
ctx = ASYNC_WAIT_CTX_new();
if (ctx == NULL) {
printf("Failed to create ASYNC_WAIT_CTX\n");
abort();
}
for (;;) {
switch (ASYNC_start_job(&job, ctx, &ret, jobfunc, msg, sizeof(msg))) {
case ASYNC_ERR:
case ASYNC_NO_JOBS:
printf("An error occurred\n");
goto end;
case ASYNC_PAUSE:
printf("Job was paused\n");
break;
case ASYNC_FINISH:
printf("Job finished with return value %d\n", ret);
goto end;
}
/* μμ
μ΄ κΉ¨μ΄λκΈ°λ₯Ό κΈ°λ€λ¦¬κΈ° */
printf("Waiting for the job to be woken up\n");
if (!ASYNC_WAIT_CTX_get_all_fds(ctx, NULL, &numfds)
|| numfds > 1) {
printf("Unexpected number of fds\n");
abort();
}
ASYNC_WAIT_CTX_get_all_fds(ctx, &waitfd, &numfds);
FD_ZERO(&waitfdset);
FD_SET(waitfd, &waitfdset);
select(waitfd + 1, &waitfdset, NULL, NULL, NULL);
}
end:
ASYNC_WAIT_CTX_free(ctx);
printf("Finishing\n");
return 0;
}
μ μμ νλ‘κ·Έλ¨ μ€ν μμ μμ μΆλ ₯μ λ€μκ³Ό κ°λ€.
Starting...
Executing within a job
Passed in message is: Hello world!
Job was paused
Waiting for the job to be woken up
Resumed the job after a pause
Job finished with return value 1
Finishing
crypto(7)
, ERR_print_errors(3)
OpenSSL 1.1.0μμ ASYNC_init_thread()
, ASYNC_cleanup_thread()
, ASYNC_start_job()
, ASYNC_pause_job()
, ASYNC_get_current_job()
, ASYNC_get_wait_ctx()
, ASYNC_block_pause()
, ASYNC_unblock_pause()
, ASYNC_is_capable()
μ΄ μ²μ μΆκ°λμλ€.
Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved.
Licensed under the OpenSSL license (the "License"). You may not use this file except in compliance with the License. You can obtain a copy in the file LICENSE in the source distribution or at https://www.openssl.org/source/license.html.
2017-12-31