Вот кстати, случайно попался пример, полезный тем, кто считает TLS ненужным в A2/ЯОС. Commands.GetContext вызывает Objects.CurrentContext, который, в свою очередь, вызывает CurrentProcess и в нём читает поле context. Что это было? А было это то, что для передачи контекстов команд понадобился TLS, и вместо общего решения сделали костыль, добавив именно тот объект, который нужно было хранить в TLS, в сам механизм процессов. Когда кому-то понадобится такой же, но с перламутровыми пуговицами, он окажется в безвыходном положении.
Теперь аргументы про то, что TLS не нужен, становятся совсем несостоятельными, ибо есть контрпример, когда он понадобился создателям A2 и они его воплотили. Впрочем, я эти аргументы и раньше игнорировал.
Здесь приятно то, что там хранится обычный динамическиТипизированныйУкль/ANY, хотя в целом неочевидно, что это будет всегда работать, поскольку там же хранится и контекст сборщика мусора. Всё остальное в объекте процесс - это адреса. Т.е., процессы выглядят магией того же уровня, что и сам сборщик мусора, и не факт, что там объекты, живущие в куче, будут всегда жить нормально. То, что оно там находится, может означать, что оно там может находиться, но может означать то, что просто ещё не наступили на грабли с объектами, живущими на куче и в то же время являющимися полями объекта процесс. Всё же контекст - это особое дело, он обычно есть на стеке, если в данный момент выполняется команда. Поэтому не может возникнуть ситуация, что он останется только в объекте "процесс" и на нём можно будет подорваться (скажем, сборщик мусора его не заметит). Поэтому я (пока) не буду переделывать свою реализацию TLS, которая живёт в мире обычных сущностей, а не в мире высокой магии.
Тем не менее, пример использования TLS в A2 я привёл.
|