реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> TNKernel и удаление объектов синхронизации
kosyak©
сообщение Feb 27 2012, 15:21
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Копаюсь в недрах TNKernel 2.6. В функциях удаления объектов синхронизации (семафор, мютекс) есть такой код (например функция удаления семафора):

Код
....

   while(!is_queue_empty(&(sem->wait_queue)))
   {
//!!!!!!!!!!!!!!!!!!!!!!!!!!!
      tn_disable_interrupt();

     //--- delete from the sem wait queue

      que = queue_remove_head(&(sem->wait_queue));
      task = get_task_by_tsk_queue(que);
      if(task_wait_complete(task))
      {
         task->task_wait_rc = TERR_DLT;
         tn_enable_interrupt();
         tn_switch_context();
      }
   }

....


Вопрос такой - а что если переключение контекста произойдет в момент отмеченный восклицательными знаками?
Т.е. очередь sem->wait_queue на момент проверки содержала один элемент, попали в цикл, произошло переключение контекста и из нее удалили единственный элемент. Дальше в коде нигде проверок чт из очереди что-то достали я не нашел.

Или я где-то не правильно рассуждаю?
Go to the top of the page
 
+Quote Post
yuri_t
сообщение Feb 28 2012, 08:47
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



Цитата(kosyak© @ Feb 27 2012, 18:21) *
Или я где-то не правильно рассуждаю?


Рассуждаете Вы совершенно правильно.

Если queue пустая, то ф-ция queue_remove_head() возвращает 0.

В версиях до 2.6, ф-ции get_task_by_tsk_queue() и task_wait_complete() в этом случае
также вернут 0 и ничего нештатного не случится.

А вот в версии 2.6 ф-ция get_task_by_tsk_queue() была заменена на макрос без проверки
входных параметров(для увеличения скорости работы) и здесь могут появиться проблемы.
В версии 2.7 код этого макроса будет заменен на более надежный.


Go to the top of the page
 
+Quote Post
kosyak©
сообщение Feb 28 2012, 08:59
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Сейчас я сделал так.

Код
...
   tn_disable_interrupt();
   while(!is_queue_empty(&(sem->wait_queue)))
   {      

     //--- delete from the sem wait queue

      que = queue_remove_head(&(sem->wait_queue));
      task = get_task_by_tsk_queue(que);
      if(task_wait_complete(task))
      {
         task->task_wait_rc = TERR_DLT;
         tn_enable_interrupt();
         tn_switch_context();
         //->
                            tn_disable_interrupt();
      }
   }
.....


Ну и пользуясь случаем sm.gif...

Нельзя ли добавить в новую версию объект синхронизации типа POSIX-овского rwlock ?

Go to the top of the page
 
+Quote Post
yuri_t
сообщение Feb 28 2012, 09:27
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



IMHO, здесь будет достаточно что-то типа ( файл tn.h)

Код
#define get_task_by_tsk_queue(que)                  \
       que ? CONTAINING_RECORD(que, TN_TCB, task_queue) : 0


Цитата
Нельзя ли добавить в новую версию объект синхронизации типа POSIX-овского rwlock ?


POSIX rwlock() будет слишком "тяжелым" для систем типа TNKernel
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Feb 28 2012, 09:42
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Цитата(yuri_t @ Feb 28 2012, 13:27) *
IMHO, здесь будет достаточно что-то типа ( файл tn.h)

Код
#define get_task_by_tsk_queue(que)                  \
       que ? CONTAINING_RECORD(que, TN_TCB, task_queue) : 0


В этом варианте возвращается лишняя проверка sm.gif

Цитата(yuri_t @ Feb 28 2012, 13:27) *
POSIX rwlock() будет слишком "тяжелым" для систем типа TNKernel

Ну может быть какой-нибудь его "облегченный" вариант можно реализовать...
Сейчас у меня, например, есть список у которого куча "читателей" и один "писатель", довольно редко вызываемый. Сейчас все реализовал на мютексах - но получается что читатели "мешают" друг другу.

Решил попробовать сделать свой вариант rwlock'a для TNKernel... но что-то опыта пока не хватает sad.gif

Go to the top of the page
 
+Quote Post
yuri_t
сообщение Feb 29 2012, 00:26
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



Цитата(kosyak© @ Feb 28 2012, 13:42) *
Решил попробовать сделать свой вариант rwlock'a для TNKernel... но что-то опыта пока не хватает sad.gif


http://www.rfc1149.net/blog/2011/01/07/the...riters-problem/
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Feb 29 2012, 04:40
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Цитата(yuri_t @ Feb 29 2012, 04:26) *


Спасибо за ссылку. Так я делал...только хотелось бы иметь этот объект с приоритетом "писателя". Т.е. если появился жалающий "писать" все последующие "читатели" ставятся в ожидание.
А как такое реализовать на существующих объектах синхронизации (и без сильного ущерба производительности)?
Go to the top of the page
 
+Quote Post
yuri_t
сообщение Feb 29 2012, 06:24
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



Цитата(kosyak© @ Feb 29 2012, 07:40) *
А как такое реализовать на существующих объектах синхронизации (и без сильного ущерба производительности)?


Данный пример кода рабочий но не оптимизирован
Прикрепленные файлы
Прикрепленный файл  rw_with_writer_priority.txt ( 3.79 килобайт ) Кол-во скачиваний: 105
 
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 19:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01436 секунд с 7
ELECTRONIX ©2004-2016