@@ -7,6 +7,7 @@ use std::fmt;
7
7
use std:: io:: { self , ErrorKind as IOErrorKind , Read } ;
8
8
use std:: mem;
9
9
use std:: path:: { Path , PathBuf } ;
10
+ use std:: sync:: Arc ;
10
11
11
12
use anyhow:: { Context , Result , anyhow, bail} ;
12
13
use tar:: EntryType ;
@@ -27,13 +28,13 @@ pub(crate) const VERSION_FILE: &str = "rust-installer-version";
27
28
28
29
pub trait Package : fmt:: Debug {
29
30
fn contains ( & self , component : & str , short_name : Option < & str > ) -> bool ;
30
- fn install < ' a > (
31
+ fn install (
31
32
& self ,
32
33
target : & Components ,
33
34
component : & str ,
34
35
short_name : Option < & str > ,
35
- tx : Transaction < ' a > ,
36
- ) -> Result < Transaction < ' a > > ;
36
+ tx : Transaction ,
37
+ ) -> Result < Transaction > ;
37
38
fn components ( & self ) -> Vec < String > ;
38
39
}
39
40
@@ -80,13 +81,13 @@ impl Package for DirectoryPackage {
80
81
false
81
82
}
82
83
}
83
- fn install < ' a > (
84
+ fn install (
84
85
& self ,
85
86
target : & Components ,
86
87
name : & str ,
87
88
short_name : Option < & str > ,
88
- tx : Transaction < ' a > ,
89
- ) -> Result < Transaction < ' a > > {
89
+ tx : Transaction ,
90
+ ) -> Result < Transaction > {
90
91
let actual_name = if self . components . contains ( name) {
91
92
name
92
93
} else if let Some ( n) = short_name {
@@ -138,11 +139,12 @@ impl Package for DirectoryPackage {
138
139
139
140
#[ derive( Debug ) ]
140
141
#[ allow( dead_code) ] // temp::Dir is held for drop.
141
- pub ( crate ) struct TarPackage < ' a > ( DirectoryPackage , temp:: Dir < ' a > ) ;
142
+ pub ( crate ) struct TarPackage ( DirectoryPackage , temp:: Dir ) ;
142
143
143
- impl < ' a > TarPackage < ' a > {
144
- pub ( crate ) fn new < R : Read > ( stream : R , cx : & PackageContext < ' a > ) -> Result < Self > {
145
- let temp_dir = cx. tmp_cx . new_directory ( ) ?;
144
+ impl TarPackage {
145
+ pub ( crate ) fn new < R : Read > ( stream : R , cx : & PackageContext ) -> Result < Self > {
146
+ let ctx = cx. tmp_cx . clone ( ) ;
147
+ let temp_dir = ctx. new_directory ( ) ?;
146
148
let mut archive = tar:: Archive :: new ( stream) ;
147
149
// The rust-installer packages unpack to a directory called
148
150
// $pkgname-$version-$target. Skip that directory when
@@ -161,7 +163,7 @@ impl<'a> TarPackage<'a> {
161
163
fn unpack_ram (
162
164
io_chunk_size : usize ,
163
165
effective_max_ram : Option < usize > ,
164
- cx : & PackageContext < ' _ > ,
166
+ cx : & PackageContext ,
165
167
) -> usize {
166
168
const RAM_ALLOWANCE_FOR_RUSTUP_AND_BUFFERS : usize = 200 * 1024 * 1024 ;
167
169
let minimum_ram = io_chunk_size * 2 ;
@@ -199,7 +201,7 @@ fn unpack_ram(
199
201
}
200
202
}
201
203
None => {
202
- if let Some ( h) = cx. notify_handler {
204
+ if let Some ( h) = & cx. notify_handler {
203
205
h ( Notification :: SetDefaultBufferSize ( default_max_unpack_ram) )
204
206
}
205
207
default_max_unpack_ram
@@ -285,21 +287,22 @@ enum DirStatus {
285
287
fn unpack_without_first_dir < R : Read > (
286
288
archive : & mut tar:: Archive < R > ,
287
289
path : & Path ,
288
- cx : & PackageContext < ' _ > ,
290
+ cx : & PackageContext ,
289
291
) -> Result < ( ) > {
290
292
let entries = archive. entries ( ) ?;
291
293
let effective_max_ram = match effective_limits:: memory_limit ( ) {
292
294
Ok ( ram) => Some ( ram as usize ) ,
293
295
Err ( e) => {
294
- if let Some ( h) = cx. notify_handler {
296
+ if let Some ( h) = & cx. notify_handler {
295
297
h ( Notification :: Error ( e. to_string ( ) ) )
296
298
}
297
299
None
298
300
}
299
301
} ;
300
302
let unpack_ram = unpack_ram ( IO_CHUNK_SIZE , effective_max_ram, cx) ;
303
+ let handler_ref = cx. notify_handler . as_ref ( ) . map ( |h| h. as_ref ( ) ) ;
301
304
let mut io_executor: Box < dyn Executor > =
302
- get_executor ( cx . notify_handler , unpack_ram, cx. process ) ?;
305
+ get_executor ( handler_ref , unpack_ram, & cx. process ) ?;
303
306
304
307
let mut directories: HashMap < PathBuf , DirStatus > = HashMap :: new ( ) ;
305
308
// Path is presumed to exist. Call it a precondition.
@@ -528,17 +531,17 @@ fn unpack_without_first_dir<R: Read>(
528
531
Ok ( ( ) )
529
532
}
530
533
531
- impl Package for TarPackage < ' _ > {
534
+ impl Package for TarPackage {
532
535
fn contains ( & self , component : & str , short_name : Option < & str > ) -> bool {
533
536
self . 0 . contains ( component, short_name)
534
537
}
535
- fn install < ' b > (
538
+ fn install (
536
539
& self ,
537
540
target : & Components ,
538
541
component : & str ,
539
542
short_name : Option < & str > ,
540
- tx : Transaction < ' b > ,
541
- ) -> Result < Transaction < ' b > > {
543
+ tx : Transaction ,
544
+ ) -> Result < Transaction > {
542
545
self . 0 . install ( target, component, short_name, tx)
543
546
}
544
547
fn components ( & self ) -> Vec < String > {
@@ -547,26 +550,26 @@ impl Package for TarPackage<'_> {
547
550
}
548
551
549
552
#[ derive( Debug ) ]
550
- pub ( crate ) struct TarGzPackage < ' a > ( TarPackage < ' a > ) ;
553
+ pub ( crate ) struct TarGzPackage ( TarPackage ) ;
551
554
552
- impl < ' a > TarGzPackage < ' a > {
553
- pub ( crate ) fn new < R : Read > ( stream : R , cx : & PackageContext < ' a > ) -> Result < Self > {
555
+ impl TarGzPackage {
556
+ pub ( crate ) fn new < R : Read > ( stream : R , cx : & PackageContext ) -> Result < Self > {
554
557
let stream = flate2:: read:: GzDecoder :: new ( stream) ;
555
558
Ok ( TarGzPackage ( TarPackage :: new ( stream, cx) ?) )
556
559
}
557
560
}
558
561
559
- impl Package for TarGzPackage < ' _ > {
562
+ impl Package for TarGzPackage {
560
563
fn contains ( & self , component : & str , short_name : Option < & str > ) -> bool {
561
564
self . 0 . contains ( component, short_name)
562
565
}
563
- fn install < ' b > (
566
+ fn install (
564
567
& self ,
565
568
target : & Components ,
566
569
component : & str ,
567
570
short_name : Option < & str > ,
568
- tx : Transaction < ' b > ,
569
- ) -> Result < Transaction < ' b > > {
571
+ tx : Transaction ,
572
+ ) -> Result < Transaction > {
570
573
self . 0 . install ( target, component, short_name, tx)
571
574
}
572
575
fn components ( & self ) -> Vec < String > {
@@ -575,26 +578,26 @@ impl Package for TarGzPackage<'_> {
575
578
}
576
579
577
580
#[ derive( Debug ) ]
578
- pub ( crate ) struct TarXzPackage < ' a > ( TarPackage < ' a > ) ;
581
+ pub ( crate ) struct TarXzPackage ( TarPackage ) ;
579
582
580
- impl < ' a > TarXzPackage < ' a > {
581
- pub ( crate ) fn new < R : Read > ( stream : R , cx : & PackageContext < ' a > ) -> Result < Self > {
583
+ impl TarXzPackage {
584
+ pub ( crate ) fn new < R : Read > ( stream : R , cx : & PackageContext ) -> Result < Self > {
582
585
let stream = xz2:: read:: XzDecoder :: new ( stream) ;
583
586
Ok ( TarXzPackage ( TarPackage :: new ( stream, cx) ?) )
584
587
}
585
588
}
586
589
587
- impl Package for TarXzPackage < ' _ > {
590
+ impl Package for TarXzPackage {
588
591
fn contains ( & self , component : & str , short_name : Option < & str > ) -> bool {
589
592
self . 0 . contains ( component, short_name)
590
593
}
591
- fn install < ' b > (
594
+ fn install (
592
595
& self ,
593
596
target : & Components ,
594
597
component : & str ,
595
598
short_name : Option < & str > ,
596
- tx : Transaction < ' b > ,
597
- ) -> Result < Transaction < ' b > > {
599
+ tx : Transaction ,
600
+ ) -> Result < Transaction > {
598
601
self . 0 . install ( target, component, short_name, tx)
599
602
}
600
603
fn components ( & self ) -> Vec < String > {
@@ -603,35 +606,35 @@ impl Package for TarXzPackage<'_> {
603
606
}
604
607
605
608
#[ derive( Debug ) ]
606
- pub ( crate ) struct TarZStdPackage < ' a > ( TarPackage < ' a > ) ;
609
+ pub ( crate ) struct TarZStdPackage ( TarPackage ) ;
607
610
608
- impl < ' a > TarZStdPackage < ' a > {
609
- pub ( crate ) fn new < R : Read > ( stream : R , cx : & PackageContext < ' a > ) -> Result < Self > {
611
+ impl TarZStdPackage {
612
+ pub ( crate ) fn new < R : Read > ( stream : R , cx : & PackageContext ) -> Result < Self > {
610
613
let stream = zstd:: stream:: read:: Decoder :: new ( stream) ?;
611
614
Ok ( TarZStdPackage ( TarPackage :: new ( stream, cx) ?) )
612
615
}
613
616
}
614
617
615
- impl Package for TarZStdPackage < ' _ > {
618
+ impl Package for TarZStdPackage {
616
619
fn contains ( & self , component : & str , short_name : Option < & str > ) -> bool {
617
620
self . 0 . contains ( component, short_name)
618
621
}
619
- fn install < ' b > (
622
+ fn install (
620
623
& self ,
621
624
target : & Components ,
622
625
component : & str ,
623
626
short_name : Option < & str > ,
624
- tx : Transaction < ' b > ,
625
- ) -> Result < Transaction < ' b > > {
627
+ tx : Transaction ,
628
+ ) -> Result < Transaction > {
626
629
self . 0 . install ( target, component, short_name, tx)
627
630
}
628
631
fn components ( & self ) -> Vec < String > {
629
632
self . 0 . components ( )
630
633
}
631
634
}
632
635
633
- pub ( crate ) struct PackageContext < ' a > {
634
- pub ( crate ) tmp_cx : & ' a temp:: Context ,
635
- pub ( crate ) notify_handler : Option < & ' a dyn Fn ( Notification < ' _ > ) > ,
636
- pub ( crate ) process : & ' a Process ,
636
+ pub ( crate ) struct PackageContext {
637
+ pub ( crate ) tmp_cx : Arc < temp:: Context > ,
638
+ pub ( crate ) notify_handler : Option < Arc < dyn Fn ( Notification < ' _ > ) > > ,
639
+ pub ( crate ) process : Arc < Process > ,
637
640
}
0 commit comments