Исправить ваш отступ. when
не является аргументом действия set_fact
, а задачи:
- name: SHMALL value for MEM less than 16G
set_fact:
shmall: 3670016
when: ansible_memtotal_mb|int <= 16384
- name: SHMALL value for MEM is between 16G and 32G
set_fact:
shmall: 7340032
when: ansible_memtotal_mb|int > 16384 and ansible_memtotal_mb|int <= 32768
Ключ такой:
static int *pieces;
Вы сказали, что положили это в свой заголовок. Это не способ экспорта символа. Любой файл, который содержит заголовок, получит свою собственную статическую версию неинициализированного указателя под названием pieces
.
Вместо этого вы помещаете это в свой заголовок:
extern int *pieces;
extern int init_pieces();
И в исходный файл, вы делаете это:
static const size_t num_pieces = 128;
int *pieces = 0;
int init_pieces()
{
pieces = malloc( num_pieces * sizeof(int) );
return pieces != NULL;
}
Теперь, когда вы включаете заголовок, ваш исходный файл будет знать, чтобы получить pieces
откуда-то еще, и будет ожидать, когда компоновщик будет работать там где. Я также предложил функцию init для массива. Однако я не добавил функцию 'release'.
Обратите внимание, что это все C, а не C ++. Если вы используете C ++, вы действительно должны использовать new
или еще лучше, используйте vector
.
Кроме того, при использовании статики в C ++ помните об этом: Статический порядок инициализации C ++
Для высокопроизводительного кода на разных архитектурах вам может понадобиться выделение malloc-y, а не родовое новое. Это связано с тем, что вы могли бы обернуть его чем-то вроде mymalloc (), а затем использовать функции, зависящие от архитектуры, такие как те, которые реализуют правильное выравнивание, чтобы избежать промахов в кеше и выполнять другие отличные вещи, предоставленные производителем оборудования, например IBM (Bluegene) или Intel (MIC). Все эти оптимизированные процедуры распределения имеют структуру типа malloc.