10
10
extern crate alloc;
11
11
12
12
use core:: mem;
13
- use core:: pin:: Pin ;
14
13
15
14
use alloc:: collections:: vec_deque:: VecDeque ;
16
15
use alloc:: vec;
17
16
use executor:: AsyncTests ;
18
17
use static_cell:: StaticCell ;
19
18
use zephyr:: define_work_queue;
20
19
use zephyr:: raw:: k_yield;
21
- use zephyr:: sync:: { PinWeak , SpinMutex } ;
20
+ use zephyr:: sync:: { SpinMutex , Weak } ;
22
21
use zephyr:: time:: NoWait ;
23
- use zephyr:: work:: { SimpleAction , Work } ;
22
+ use zephyr:: work:: { ArcWork , SimpleAction , Work } ;
24
23
use zephyr:: {
25
24
kconfig:: CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC ,
26
25
printkln,
@@ -583,22 +582,22 @@ impl Simple {
583
582
584
583
fn run ( & self , workers : usize , iterations : usize ) {
585
584
// printkln!("Running Simple");
586
- let main: Pin < Arc < Work < _ > > > = Work :: new ( SimpleMain :: new ( workers * iterations, self . workq ) ) ;
585
+ let main = Work :: new_arc ( SimpleMain :: new ( workers * iterations, self . workq ) ) ;
587
586
588
587
let children: VecDeque < _ > = ( 0 ..workers)
589
- . map ( |n| Work :: new ( SimpleWorker :: new ( main. clone ( ) , self . workq , n) ) )
588
+ . map ( |n| Work :: new_arc ( SimpleWorker :: new ( main. 0 . clone ( ) , self . workq , n) ) . 0 )
590
589
. collect ( ) ;
591
590
592
- let mut locked = main. action ( ) . locked . lock ( ) . unwrap ( ) ;
591
+ let mut locked = main. 0 . action ( ) . locked . lock ( ) . unwrap ( ) ;
593
592
let _ = mem:: replace ( & mut locked. works , children) ;
594
593
drop ( locked) ;
595
594
596
595
let start = now ( ) ;
597
596
// Fire off main, which will run everything.
598
- Work :: submit_to_queue ( main. clone ( ) , self . workq ) . unwrap ( ) ;
597
+ main. clone ( ) . submit_to_queue ( self . workq ) . unwrap ( ) ;
599
598
600
599
// And wait for the completion semaphore.
601
- main. action ( ) . done . take ( Forever ) . unwrap ( ) ;
600
+ main. 0 . action ( ) . done . take ( Forever ) . unwrap ( ) ;
602
601
603
602
let stop = now ( ) ;
604
603
let time = ( stop - start) as f64 / ( CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC as f64 ) * 1000.0 ;
@@ -619,41 +618,39 @@ impl Simple {
619
618
) ;
620
619
621
620
// Before we go away, make sure that there aren't any leaked workers.
622
- let mut locked = main. action ( ) . locked . lock ( ) . unwrap ( ) ;
621
+ let mut locked = main. 0 . action ( ) . locked . lock ( ) . unwrap ( ) ;
623
622
while let Some ( other) = locked. works . pop_front ( ) {
624
- let other = Pin :: into_inner ( other) ;
625
623
assert_eq ! ( Arc :: strong_count( & other) , 1 ) ;
626
624
}
627
625
drop ( locked) ;
628
626
629
627
// And nothing has leaked main, either.
630
- let main = Pin :: into_inner ( main) ;
631
- assert_eq ! ( Arc :: strong_count( & main) , 1 ) ;
628
+ assert_eq ! ( Arc :: strong_count( & main. 0 ) , 1 ) ;
632
629
}
633
630
}
634
631
635
632
/// A simple worker. When run, it submits the main worker to do the next work.
636
633
struct SimpleWorker {
637
- main : PinWeak < Work < SimpleMain > > ,
634
+ main : Weak < Work < SimpleMain > > ,
638
635
workq : & ' static WorkQueue ,
639
636
_id : usize ,
640
637
}
641
638
642
639
impl SimpleWorker {
643
- fn new ( main : Pin < Arc < Work < SimpleMain > > > , workq : & ' static WorkQueue , id : usize ) -> Self {
640
+ fn new ( main : Arc < Work < SimpleMain > > , workq : & ' static WorkQueue , id : usize ) -> Self {
644
641
Self {
645
- main : PinWeak :: downgrade ( main) ,
642
+ main : Arc :: downgrade ( & main) ,
646
643
workq,
647
644
_id : id,
648
645
}
649
646
}
650
647
}
651
648
652
649
impl SimpleAction for SimpleWorker {
653
- fn act ( self : Pin < & Self > ) {
650
+ fn act ( self : & Self ) {
654
651
// Each time we are run, fire the main worker back up.
655
- let main = self . main . upgrade ( ) . unwrap ( ) ;
656
- Work :: submit_to_queue ( main. clone ( ) , self . workq ) . unwrap ( ) ;
652
+ let main = ArcWork ( self . main . upgrade ( ) . unwrap ( ) ) ;
653
+ main. clone ( ) . submit_to_queue ( self . workq ) . unwrap ( ) ;
657
654
}
658
655
}
659
656
@@ -668,7 +665,7 @@ struct SimpleMain {
668
665
}
669
666
670
667
impl SimpleAction for SimpleMain {
671
- fn act ( self : Pin < & Self > ) {
668
+ fn act ( self : & Self ) {
672
669
// Each time, take a worker from the queue, and submit it.
673
670
let mut lock = self . locked . lock ( ) . unwrap ( ) ;
674
671
@@ -683,7 +680,7 @@ impl SimpleAction for SimpleMain {
683
680
lock. count -= 1 ;
684
681
drop ( lock) ;
685
682
686
- Work :: submit_to_queue ( worker. clone ( ) , self . workq ) . unwrap ( ) ;
683
+ ArcWork ( worker. clone ( ) ) . submit_to_queue ( self . workq ) . unwrap ( ) ;
687
684
}
688
685
}
689
686
@@ -698,7 +695,7 @@ impl SimpleMain {
698
695
}
699
696
700
697
struct Locked {
701
- works : VecDeque < Pin < Arc < Work < SimpleWorker > > > > ,
698
+ works : VecDeque < Arc < Work < SimpleWorker > > > ,
702
699
count : usize ,
703
700
}
704
701
0 commit comments