Введение от себя
В прошлом посте было сделано небольшое введение по библиотеке VIX API, позволяющую писать автоскрипты для выполнения процессов на виртуальных машинах VMWare. В этой статье рассмотрим базовые концепции VIX API. Данная статья яляется переводом части официальной документации, оригинальная статья на английском доступна по ссылке www.vmware.com/support/developer/vix-api/vix112_referenceОбъекты и Хендлеры
Подсчет ссылок на хендлеры
Хендлеры содержат ссылки, поэтому пред их использованием
необходимо вызвать функцию «release».
Передовать в функцию Vix_ReleaseHandle() нужно валидный хендлер. Функция Vix_ReleaseHandle() освобождает любые типы хендлеров:
void Vix_ReleaseHandle(VixHandle handle);
Пример, показывающий как открывать и освобождать хендлер:
VixHandle handle1;
handle1 =
MyOpenVMWrapper(...various parameters...);
// handle1 is assigned a unique
integer value.
// Now you can perform various operations
on handle1.
Vix_ReleaseHandle(handle1);
handle1 = VIX_INVALID_HANDLE;
// handle1 has been released and should no longer be
used.
Независимость хендлеров
Как правило, в программе, используется несколько активных
хендлеров, каждый из которых может, представляет разные объекты. Хендлеры могут
создаваться и уничтожаться независимо. Пример:
VixHandle handle1;
VixHandle handle2;
handle1 = MyOpenVMWrapper(...
parameters for virtual machine 1...);
// handle1 is assigned a unique
value - for example, 11.
handle2 = MyOpenVMWrapper(...
parameters for virtual machine 2...);
// handle2 is assigned a unique
value - for example, 12.
// Now you can perform various
operations on handle1 or handle2.
Vix_ReleaseHandle(handle1);
handle1 = VIX_INVALID_HANDLE;
// handle1 has been released and
should no longer be used.
// You can still perform
operations on handle 2.
Vix_ReleaseHandle(handle2);
handle2 = VIX_INVALID_HANDLE;
// handle2 has been released and should no longer be
used.
Удаление хендлеров
Если данные, хранящиеся в хендлере больше не нужны, можно
спокойно освобождать хендлер. Например, при удалении виртуальной машины,
вызывается метод удаления с хендлером виртуальной машины, а следом вызывается
функция освобождения самого хендлера. Такая конструкция позволяет избежать
путаницы, когда функция отрабатывает и не освобождает хендлер.
Клиентское приложение ответственно за вызов функции
освобождения каждого хендлера. В случае освобождения хендлера после удаления виртуальной
машины, удаляющая функция обновляет внутренний статус хендлера, так что
большинству функций, за исключением функции освобождения, будет понятно, что
виртуальная машина удалена, и они вернут ошибку.
Открытие хендлеров
Если дважды открыть хендлер для некоторой виртуальной машины,
без освобождения первого хендлера, открывающая функция вернет тот же хендлер
оба раза. При этом счетчик ссылок
хендлера увеличивается два раза, поэтому нужно вызвать функцию освобождения
дважды.
VixHandle handle1;
VixHandle handle2;
handle1 = MyOpenVMWrapper(...various
parameters...);
// handle1 is assigned a unique
value.
// handle1 has reference count 1.
// Now you can perform various
operations on handle1.
handle2 = MyOpenVMWrapper(...the
SAME parameters identifying the SAME virtual machine...);
// handle2 has the same value as
handle1.
// handle1 has reference count 2.
ASSERT(handle1 == handle2);
Vix_ReleaseHandle(handle1);
// handle1 has reference count 1.
// The handle still can be safely
used here.
Vix_ReleaseHandle(handle1);
handle1 = handle2 =
VIX_INVALID_HANDLE;
// The handle has been released and should no longer
be used.
Каждая функция возвращающая хендлер, увеличивает счетчик ссылок
хендлера. Поэтому клиентское приложение должно освобождать хендлер каждый раз,
как он бал возвращен функцией Vix.
Внутренние ссылки хендлера
Некоторые хендлеры хранят ссылки на другие хендлеры.
Например, устройство хранит ссылки на виртуальную машину и виртуальная машина
хранит ссылки на все свои устройства. В результате внутренних ссылок некоторые
хендлеры могут быть не удалены. Эта ситуация не должна беспокоить, потому что механизм
внутренних ссылок всегда правильно поддерживается.
Итого
В конце перевода хотел бы добавить несколько строк от себя. Хендлеры - это один из базовых элементов в Vix, практически все функции VIX API завязаны на использованием хенлеров. По сути хендлеры - челочисленные индетификаторы, позволяющие получать доступ к выполняющимся асинхронным операциям или же ссылаться на свойства, используемые в методах.