attribut force_allocate
L’attribut ACF [force_allocate] force l’allocation d’un paramètre pointeur à l’aide de midl_user_allocate au lieu d’optimiser l’allocation.
[ [function-attribute-list <>] ] type-specifier <> [pointer- <>declarator <>] function-name <>( [ force_allocate [ , parameter-attribute-list <> ] ] type-specifier <> [declarator <>] , ...);
Paramètres
Cet attribut n’a pas de paramètres.
Notes
RPC tente de réduire les allocations de mémoire sur le serveur en fournissant des pointeurs vers des mémoires tampons internes. Cette approche peut entraîner des problèmes pour les applications qui tentent d’appeler directement midl_user_free sur des pointeurs fournis par RPC, car un pointeur qui a été optimisé ne peut pas être libéré. Le marquage d’un paramètre avec [force_allocate] empêche cette optimisation pour tous les pointeurs qui le dérivent.
Une autre utilisation courante de [force_allocate] consiste à garantir l’alignement de la mémoire pointée vers si une application nécessite un alignement supérieur à celui de la mémoire vers laquelle elle pointe. Par exemple, les applications passent souvent des données dans un tableau générique d’octets plutôt qu’en utilisant le type réel, mais un octet n’est garanti qu’à 1, ce qui peut entraîner des problèmes pour les applications qui supposent un alignement plus important. En marquant le paramètre avec [force_allocate], l’application peut garantir que toute la mémoire pointée aura un alignement égal à celui garanti par midl_user_allocate.
Exemples
/* IDL file */
void Func1([in, out, string] char **ppstr);
void Func2([in] long s, [in, size_is(s)] byte *pData);
/* ACF file */
/* e.g. The application wishes to call midl_user_free on *ppstr and supply a new pointer */
Func1([force_allocate] pstr);
/* e.g. pData really points to a structure that needs an alignment greater than 1 */
Func2([force_allocate] pData);
Voir aussi