Строго говоря, это не непрозрачно, т.е.он определен в заголовке, но вы это знали.
Возможно, автору хотелось бы, чтобы он был непрозрачным, но обменяли его на публичное определение, чтобы позволить статическим встроенным операциям работать с ним.Это довольно часто встречается в коде ядра, потому что вас больше волнует скорость и размер кода, чем строгий 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()
.Этот код уже берет блокировку и просматривает список процессов, которые нужно разбудить, т.е.чтобы разбудить их, так почему бы не вернуть количество пробужденных процессов?