Освобождающий (vfree-ing) указатель на изменчивые данные - PullRequest
1 голос
/ 18 октября 2011

volatile кажется бесконечным вопросом каждого. Я думал, что знаю все об этом, но потом я столкнулся с этим:

Итак, у меня есть раздел памяти между потоками, и я определил его так:

volatile type *name;

Если это заставляет вас чувствовать себя лучше, вы можете представить, что type это просто int.

Это означает, что у меня есть указатель (который не является изменчивым) на некоторые данные, которые являются изменчивыми. Так, например, когда речь идет об оптимизации, компилятор может кэшировать значение name, но не name[0]. Я прав?

Итак, теперь я vfree использую этот указатель (он находится в модуле ядра Linux), и он говорит мне, что vfree ожидает const void *, пока я передаю его volatile type *.

Я понимаю, как опасно передавать volatile type * как type *, потому что в этой функции значения name[i] могут кэшироваться (в результате оптимизации), что нежелательно.

Я не понимаю, почему, однако, vfree ожидает, что я обязательно отправлю ему указатель на энергонезависимые данные. Есть ли что-то, чего мне там не хватает? Или это просто парни, которые написали vfree, не думая об этой ситуации?

Полагаю, простое приведение указателя на void * не повредит, верно?

Ответы [ 2 ]

2 голосов
/ 18 октября 2011

Функция vfree (и каждая функция вменяемого освобождения в целом) не заботится о ваших реальных данных (будь то volatile или нет).Он просто ожидает (действительный) указатель (представьте: передача указателя в виде значения long в регистр ЦП).

На основе этого значения функция будет:

  1. вызовите SLAB / SLUB для освобождения памяти
  2. удалите отображение памяти

Так что да, приведение к void * не вызовет никакого вреда во время выполнения.

0 голосов
/ 21 октября 2011

Я пришел к выводу, что просто приведение указателя на void * не вызовет проблемы, и тот факт, что free и vfree не принимают напрямую указатели на volatile данные, это просто то, что было упущено.

...