BorrowedBuf: ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½Π°Ρ Π½ΠΎΡΠ½Π°Ρ ΡΠΈΡΠ° Rust Π΄Π»Ρ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ Ρ Π±ΡΡΠ΅ΡΠ°ΠΌΠΈ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°. ΠΠ½Π° ΠΏΠΎΠ΄Π²Π΅ΡΠ³Π»Π°ΡΡ ΠΊΡΠΈΡΠΈΠΊΠ΅ Π·Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ ΠΈ ΡΠ·ΠΊΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠΎΡΡΡ.

BorrowedBuf β ΡΡΠΎ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½Π°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Rust, Π·Π°Π΄ΡΠΌΠ°Π½Π½Π°Ρ Π΄Π»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ ΡΠ°Π±ΠΎΡΡ Ρ Π±ΡΡΠ΅ΡΠ°ΠΌΠΈ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°.
ΠΠ½Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΡΡ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ ΡΠ»Π΅Π΄ΠΈΡ Π·Π° ΡΠ΅ΠΌ, ΠΊΠ°ΠΊΠ°Ρ Π΅Ρ ΡΠ°ΡΡΡ ΡΠΆΠ΅ Π·Π°Π½ΡΡΠ°.
ΠΠ°Π΄Π°ΡΠ° ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΠΈ Π»ΠΈΡΠ½Π΅ΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΊΠ°ΠΊ ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ, Π³Π΄Π΅ Π±ΡΡΠ΅Ρ Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π½ΡΠ»ΡΠΌΠΈ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ, Ρ ΠΎΡΡ ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅:
fn slow_copy( mut rd: impl std::io::Read, mut wr: impl std::io::Write, ) -> std::io::Result { loop { let mut buf = [0; 4096]; let read = rd.read(&mut buf)?; if read == 0 { break Ok(()); } wr.write_all(&buf[..read])?; } }
ΠΡΠΎΠ±Π»Π΅ΠΌΡ BorrowedBuf
Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ BorrowedBuf Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ Π²ΠΎΠ·ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ. ΠΠΈΠΆΠ΅ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Ρ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΠΈΠ· Π½ΠΈΡ :
- Π‘ΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ Ρ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ: BorrowedBuf ΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ
API, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ
read_buf. ΠΡΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΈΠΈ ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Rust Π±ΡΠ΄Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π·Π°ΠΏΠΎΠ»Π½ΡΡΡ Π±ΡΡΠ΅Ρ Π½ΡΠ»ΡΠΌΠΈ, ΡΡΠΎ ΠΎΠ±Π½ΡΠ»ΡΠ΅Ρ Π²ΡΡ Π²ΡΠ³ΠΎΠ΄Ρ. ΠΡΠΎ ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ»ΠΈΡΡ ΠΈΠ»ΠΈ ΡΠΆΠ΅ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅ΡhexΠΈΠ»ΠΈbase64. - ΠΡΡΡΡΡΡΠ²ΠΈΠ΅ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΡΡΠΈ: ΡΡΠ½ΠΊΡΠΈΡ Π² ΠΈΠ΄Π΅Π°Π»Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΡΠΈΠΏΠΎΠΌ
u8, ΡΡΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅Ρ Π΅Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² ΠΏΠ°ΠΊΠ΅ΡΠ°Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ±ΠΎΡΡΠΈΠΊΠΈ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΡ Π΄Π°Π½Π½ΡΡ ). - Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ: BorrowedBuf ΡΡΠ΅Π±ΡΠ΅Ρ Π³Π»ΡΠ±ΠΎΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΉ Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΎΠΊ. ΠΠ΅Π²Π΅ΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ Π±ΡΡΠ΅Ρ Π²ΡΡ ΡΠ°Π²Π½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ Π·Π°Π½ΠΎΠ²ΠΎ, Π½ΠΈΠ²Π΅Π»ΠΈΡΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ.
- ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΏΡΡΠ°Π½ΠΈΡΠ°: ΠΌΠΎΠ΄Π΅Π»Ρ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅Ρ ΠΏΠ°ΠΌΡΡΡ Π½Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΈ Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ°ΡΡΠΈ, ΡΡΠΎ ΡΡΠ»ΠΎΠΆΠ½ΡΠ΅Ρ Π²ΠΎΡΠΏΡΠΈΡΡΠΈΠ΅. ΠΡΠ»ΠΎ Π±Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ Ρ Vec ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌΠΈ ΡΡΡΡΠΊΡΡΡΠ°ΠΌΠΈ Π΄Π»Ρ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ API.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Ρ
ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΠΉ Π·Π°ΠΌΠ΅Π½Ρ BorrowedBuf Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ. ΠΠ΄Π½ΠΎ ΠΈΠ· ΠΎΠ±ΡΡΠΆΠ΄Π°Π΅ΠΌΡΡ
Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΉ β ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΠ°Ρ Β«Π·Π°ΠΌΠΎΡΠΎΠ·ΠΊΠ°Β» Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ (freeze), ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»Π° Π±Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π½Π΅ΠΉ ΠΊΠ°ΠΊ Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ΄Π΅ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°Π»Π° Π±Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΡΠ·ΡΠΊΠ΅ Rust, Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ Π² Π°ΡΠΏΠ΅ΠΊΡΠ°Ρ
ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΡΡ ΠΈ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΌΠΈ ΡΡΡΠ°Π½ΠΈΡΠ°ΠΌΠΈ ΠΏΠ°ΠΌΡΡΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΎΠ² Π²ΡΠΎΠ΄Π΅ MADV_FREE).

