LINUX.ORG.RU

История изменений

Исправление khrundel, (текущая версия) :

Затык на 220 строке. Код: https://github.com/sinitcin/poll_engine

Если я правильно понял, то нужно:

        let parent = self.parent();
        let mut parent_borrowed = parent.borrow_mut();
        parent_borrowed.read();
Ну и тип парента сменить на Arc<RefCell<ILinkChannel>>.

По другому никак: описав у функции read self как мутабл, вы потребовали, чтоб раст гарантировал, что рид вызовется только в эксклюзивном режиме. Арк - это многопоточная хрень, никаких гарантий от состояния гонки нет. Соответственно, нужно запаковать в рефцелл и проверять правила займа динамически. Ну и да, читайте доку к refcell'у, этот код может запаниковать. Возможно, стоит поменять на мутекс какой.

Исходная версия khrundel, :

Затык на 220 строке. Код: https://github.com/sinitcin/poll_engine

Если я правильно понял, то нужно:

        let parent = self.parent();
        let mut parent_borrowed = parent.borrow_mut();
        parent_borrowed.read();
Ну и тип парента сменить на Arc<RefCell<ILinkChannel>>.

По другому никак: описав у функции read self как мутабл, вы потребовали, чтоб раст гарантировал, что рид вызовется только в эксклюзивном режиме. Арк - это многопоточная хрень, никаких гарантий от состояния гонки нет. Соответственно, нужно запаковать в рефцелл и занимать изнутри.