ASYNC_start_job(3) - wariua/manpages-ko GitHub Wiki

NAME

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 - 비동기 μž‘μ—… 관리 ν•¨μˆ˜λ“€

SYNOPSIS

#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);

DESCRIPTION

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() ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ ν˜„μž¬ ν”Œλž«νΌμ΄ 비동기 λ™μž‘μ„ μ§€μ›ν•˜λŠ”μ§€ μ—¬λΆ€λ₯Ό 탐지할 수 μžˆλ‹€.

RETURN VALUES

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을 λ°˜ν™˜ν•œλ‹€.

NOTES

μœˆλ„μš° ν”Œλž«νΌμ—μ„œλŠ” openssl/async.h 헀더에 ν•„μš”ν•œ λͺ‡ κ°€μ§€ νƒ€μž…λ“€μ΄ 보톡 windows.hλ₯Ό ν¬ν•¨μ‹œμΌœμ•Ό μ‚¬μš© κ°€λŠ₯ν•΄μ§„λ‹€. 그런데 κ°€μž₯ λ¨Όμ € ν¬ν•¨μ‹œν‚€λŠ” 헀더듀 쀑 ν•˜λ‚˜μΈ windows.hλ₯Ό μ–Έμ œ ν¬ν•¨μ‹œν‚¬μ§€λ₯Ό μ‘μš© κ°œλ°œμžκ°€ ν†΅μ œν•  수 μžˆμ–΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ λ§Žλ‹€. λ”°λΌμ„œ async.h에 μ•žμ„œ windows.hλ₯Ό ν¬ν•¨μ‹œν‚€λŠ” 것을 μ‘μš© 개발자의 μ±…μž„μœΌλ‘œ κ·œμ •ν•œλ‹€.

EXAMPLE

λ‹€μŒ μ˜ˆλŠ” 핡심 비동기 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

SEE ALSO

crypto(7), ERR_print_errors(3)

HISTORY

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

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

⚠️ **GitHub.com Fallback** ⚠️