Opened 10 years ago

Closed 10 years ago

#60 closed баг (готово)

Зависание swd при сохранении конфигурации

Reported by: alx Owned by: alx
Priority: высокий Milestone: 1 очередь
Component: swd Keywords:
Cc:

Description

Баг воспроизводится так:

  1. Устанавливаем в кассету плату FO-08.
  2. В конфигурации платы FO-08 блокируем все порты. Записываем конфигурацию в плату.
  3. Передергиваем питание платы FO-08. В результате бага в прошивке платы FO-08 она будет все время пропадать и снова появляться в мониторинге (вероятно, статус платы всегда 255).
  4. Пока плата FO-08 появляется/пропадает, нажимаем "дискетку" для сохранения конфигурации.

В результате swd зависает (с вероятностью близкой к 1) с низким потреблением CPU (1%) до срабатывания watchdog. Предположительно возникает deadlock.

Change History (1)

comment:1 by alx, 10 years ago

Resolution: fixed
Status: newclosed

In 1112/sw:

Устранен deadlock.
Он возникал если в процессе сохранения конфигурации в файл по команде saveall
(нажатие дискеты в браузере) пропадала плата. При пропадании платы выполняется
деструктор, в котором, как правило, вызывается метод saveConfig() платы, который
ждет освобождения семафора конфигурации (XmlRoot). При этом он держит семафор boardsMutex.
В то же время семафор конфигурации держит поток, выполняющий cmd_saveall(), который,
в свою очередь ожидает освобождения семафора boardsMutex.

Теперь cmd_saveall() освобождает семафор конфигурации до того, как пытается захватить семафор
boardsMutex. Также в функции Transport::board_lost() семафор boardsMutex захватывается только
на время уничтожения объекта платы и освобождается до вызова checkRequired(), которая
захватывает семафор конфигурации. Fixes #60.

Note: See TracTickets for help on using tickets.