Есть ли безопасный способ узнать количество задач, ожидающих завершения? - PullRequest
0 голосов
/ 15 октября 2010

У меня есть хорошее задание на программирование ядра, включающее новый метод блокировки ядра, и моя группа и я решили реализовать его как оболочку для завершения.Однако спецификация требует, чтобы мы возвращали количество процессов, уведомленных нашим методом, что включало в себя возвращение количества процессов, вызванных complete_all в нашей реализации.

Как мы можем получить этот номер?Казалось бы, достаточно заблокировать завершение с помощью внутренней спин-блокировки, сосчитать количество элементов, а затем разблокировать его.Этот метод безопасен с упреждением, потому что наши функции являются единственными, которые имеют доступ к конкретному рассматриваемому завершению.

Итак, вопрос в том, является ли завершение структуры непрозрачным?Если это так, будет ли приемлемо, чтобы ради домашней работы, выполненной к среднесрочному сезону, игнорировать эту непрозрачность?Или есть способ сделать это без хаков?

Ответы [ 2 ]

2 голосов
/ 17 октября 2010

Возможно, вы просто захотите изменить __wake_up_common, чтобы он возвращал количество заданий, которые были разбужены, а затем измените complete_all, чтобы получить тот же номер.вверх и вниз.

Кстати, непрозрачная структура будет иметь typedef struct whatever whatever_t, как atomic_t.Это непрозрачные.

Нико.

1 голос
/ 15 октября 2010

Строго говоря, это не непрозрачно, т.е.он определен в заголовке, но вы это знали.

Возможно, автору хотелось бы, чтобы он был непрозрачным, но обменяли его на публичное определение, чтобы позволить статическим встроенным операциям работать с ним.Это довольно часто встречается в коде ядра, потому что вас больше волнует скорость и размер кода, чем строгий API - в конце концов, все равно это код ядра.

Я вижу:

struct completion {
        unsigned int done;
        wait_queue_head_t wait;
};

Так что большинствоиз интересных битов на самом деле в wait_queue_head_t, который является typedef из struct __wait_queue_head.

Двойное подчеркивание может указывать на то, что автор считает его закрытым, или они просто думали, что было бы странно иметь struct wait_queue_headи wait_queue_head_t, т.е.двойные подчеркивания дают понять, что вы должны использовать typedef.

Я думаю, что вы смотрите на это неправильно.Вы сказали, что вам нужно знать количество процессов, вызванных complete_all().Этот код уже берет блокировку и просматривает список процессов, которые нужно разбудить, т.е.чтобы разбудить их, так почему бы не вернуть количество пробужденных процессов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...