Как связать параметр с задержкой?

Обычно указатели C API переводятся либо в arrays или же out параметры в привязках:

// C
void get_user_name (char *buffer, int buffer_length);
void get_user_count (int *count_ptr);
// Vala
public static void get_user_name (uint8[] buffer);
public static void get_user_count (out int count);

Я сейчас сталкивался со случаем, когда указатель используется как отложенный out параметр.

// C
void bind_buffer (void *buffer, int buffer_length, int *length);
int fetch (void);

Каждый раз fetch () называется, данные передаются в buffer а также length,

Каков наилучший способ связать такой API в Vala?

// Vala
public static void bind_buffer (uint8[] buffer, int *length);
public static int fetch ();

Я не думаю, что я могу использовать out int length Вот?

Также я должен убедиться, что связанные данные доступны все время, пока они связаны. Как мне этого добиться?

1 ответ

Решение

Вы в основном правы с последним примером. Аннотации CCode немного отключены (по умолчанию значение array_length равно true, вам не нужно его включать, и array_pos не существует. Существует array_length_pos, но, опять же, это на самом деле не нужно, поскольку значение по умолчанию будет работать нормально). Указатель - действительно единственный путь в этой ситуации для длины.

Что касается обеспечения доступности данных, то не похоже, что C API дает вам способ сделать это. Обычно это достигается передачей прав собственности, но для этого требуется, чтобы C API предоставил способ автоматического уничтожения / восстановления данных, когда они больше не нужны. Единственное, что вы можете сделать, - это убедиться, что потребитель VAPI осведомлен о требовании поддерживать данные в течение всего необходимого времени.

Vala имеет тенденцию очень хорошо работать с хорошо разработанными C API, но при работе с плохо разработанными C API, не всегда возможно создать хороший Vala API. Ваши единственные реальные варианты - либо улучшить библиотеку C, либо написать библиотеку-обертку (либо в C, либо в Vala), которая передает вызовы к API C, обеспечивая при этом более разумный API.

Другие вопросы по тегам