kaist-cp / rv6

Other
125 stars 13 forks source link

Should `RcCell` and `Ref` be connected via lifetime? #551

Closed Medowhill closed 3 years ago

Medowhill commented 3 years ago

현재 RcCellRcCell에서 만들어진 Ref는 lifetime으로 연결되어 있지 않습니다. 이는 세 가지 문제를 일으킵니다.

  1. Ref가 살아 있는데 RcCell이 move될 수 있음.
  2. Ref가 살아 있는데 RcCell에 대한 mutable reference가 만들어져 Ref가 가지고 있는 raw pointer가 무효화될 수 있음.
  3. Ref가 살아 있는데 RcCell이 드롭될 수 있음.

1은 Pin을 통해 해결할 수 있습니다. 2는 &mut을 만드는 것을 허용하지 않는 타입인 Pin2(가칭)를 만들어 해결하자는 제안이 있었습니다. 3은 RcCell이 드롭될 때 rc가 0이 아니면 패닉하는 방식을 현재 사용 중이며 #550 에서 설명한 것처럼 이는 올바른 해결책이 아닐 수 있습니다.

RcCellRef를 lifetime으로 연결하려면 Ref에 lifetime parameter가 추가된다는 문제가 있습니다. Ref는 syscall 하나를 처리하는 동안만 살아 있는 경우도 있지만, 커널 안에 저장되어 여러 syscall에 걸쳐 살아 있는 경우도 있습니다. 그러므로 Ref에 lifetime parameter가 추가되는 경우 다음 방안 중 하나를 선택해야 합니다.

  1. 'static 사용.
  2. Kernel을 포함한, Ref를 저장하는 모든 타입에 lifetime parameter 추가

1은 RcCell이 스택에 배치되어 드롭될 수 있는 경우에는 사용 불가능한 방법입니다. 2는 코드를 복잡하게 만들며 가능한 방법인지 확실하지 않습니다. 또한 Ref의 lifetime은 정적으로 scope에 따라 정해지는 것이 아니라 동적으로 결정되므로 lifetime parameter가 없는 것이 맞다는 주장도 가능합니다.