Closed travis1829 closed 2 years ago
참고로, 이 PR이 끝나면, List
관련해서 다음 작업을 할 예정입니다.
List
를 이전에 만들었던 List
로 대체 (https://github.com/kaist-cp/rv6/pull/495)
List
의 경우, 시간이 부족하여 미처 rv6의 MruArena
에는 반영하지 못했었습니다. 이를 하겠다는 뜻입니다.StrongPinMut
제거 (https://github.com/kaist-cp/rv6/issues/527#issuecomment-1039176867)ListEntry
가 *mut Self
대신 Cell<*const Self>
를 갖도록 수정했는데, 이번 PR에서는 다시 Cell<*const Self>
대신 *mut Self
를 사용하도록 바꾼 것으로 보입니다. 오랜만에 보다 보니 제가 기억이 잘 나지 않는데, 혹시 예전에 Cell
이 필요했던 이유와 다시 Cell
이 필요하지 않게 된 이유를 정리해 주실 수 있나요?결론만 말씀드리자면, Cell
을 추가했던 건 예전에 제가 Cell
에 대한 이해가 부족해서 그랬던 것 같습니다.
Cell
을 추가한 건 tock의 list와 비슷한 list를 만들려고 했던 흔적입니다. 이때는 단순히 Cell
을 사용하면 &
type만을 가지고도 ListEntry
를 mutate할 수 있어 Pin
때문에 API가 복잡해지는걸 피할 수 있다는 점만 주목했고, Cell
이 일종의 last resort같은 개념이라는 건 잘 몰랐습니다.Cell
을 사용하지 않더라도 해결할 수 있고, Cell
을 사용하더라도 unsafe가 줄어들지는 않으며, 오히려 사용자가 Pin<&mut T>
을 사용하도록 하는 게 Rust에도 더 맞고 더 안전한 것 같아 변경했습니다.Cell
을 없애게 되면서 compiler optimization때문에 UB가 일어나는 곳이 있을지도 모르겠습니다. 좀 더 확인해보겠습니다.추가적으로, 아직 고민 중입니다만, 나중에 rv6가 intrusive_list.rs의 List
대신 https://github.com/kaist-cp/rv6/pull/495 의 List
를 사용하도록 전부 변경할 생각이 있습니다. 현재 rv6에서 list를 사용하는 곳 (MruArena
, Runs
)를 보면, 항상 Pin<&mut List>
를 갖고 있는 (또는 가질 수 있는) 상태에서만 List
/ListEntry
를 mutate하는 것 같습니다.
답변 고맙습니다. 제가 이해한 바로는 이 PR에서 interior mutability를 제거하면서 리스트 API 사용자 입장에서는 "원래 Pin<&Self>
가 필요하던 곳에 Pin<&mut Self>
가 필요하게 된 것"이니 전보다 사용할 때 더 제약이 많은 intrusive list가 되었지만, rv6에서는 intrusive list를 제한적인 용도로만 사용하기에 이렇게 제약 사항이 늘어난 것이 문제가 되지 않는 것 같은데, 이게 맞나요?
답변 고맙습니다. 제가 이해한 바로는 이 PR에서 interior mutability를 제거하면서 리스트 API 사용자 입장에서는 "원래
Pin<&Self>
가 필요하던 곳에Pin<&mut Self>
가 필요하게 된 것"이니 전보다 사용할 때 더 제약이 많은 intrusive list가 되었지만, rv6에서는 intrusive list를 제한적인 용도로만 사용하기에 이렇게 제약 사항이 늘어난 것이 문제가 되지 않는 것 같은데, 이게 맞나요?
bors r+
Build succeeded:
Closes #596
fn iter_shared_mut
->unsafe fn iter_strong_pin_mut_unchecked
ListEntry
List
는RefCell
이나 tock의 list등과 달리, interior mutability를 꼭 사용해야하는 이유가 없는 것 같아 이를 제거했습니다.