Чтение документации API: ошибки и право собственности

Понимание единиц аргументов, структур результатов, частичного успеха и времени жизни ресурсов.

Wave Foundation

Прочтите декларацию

Следующее обозначение описывает объявление функции и не представляет собой весь исполняемый файл.

io_read(fd: i64, buf: ptr<u8>, len: i64) -> i64

fd — открытый дескриптор, buf — объем памяти, предоставляемый вызывающей стороной, и len — количество байтов, доступных для записи. i64 не означает, что допустимы отрицательные длины. Возвращаемое значение — это фактическое количество прочитанных байтов, а не длина запроса, поэтому используется только возвращаемый диапазон.

Выражение отказа варьируется от функции к функции

путь да Метод проверки
Указатель или null mem_alloc null Доступ к памяти после проверки
количество байтов или отрицательное число io_read Отрицательная ошибка, 0 EOF, положительные данные
код состояния buffer_push Константа ошибки сравнения с BUFFER_OK
Успех и ценность NetResult<T> После изучения ok используйте value.
Частичный прогресс включен RandomFillResult Проверьте ok, written, error вместе.

Он смотрит только на количество ошибок и не сравнивает их с константами в других модулях. Например, номера ошибок env и OS errno не относятся к одной и той же системе. Исходную ошибку в WASI не следует интерпретировать как Linux errno.

владение и аренда

  • Owned: Когда получена выделенная память, открытый файл или открытый сокет, он отвечает за вызов соответствующего освобождения/закрытия.
  • Borrow: Байт view или буфер, передаваемый функции, относится к существующей памяти. Если функция не указывает, что она получает право собственности, вызывающая сторона сохраняет контроль.
  • Выходной аргумент: передает допустимое пространство памяти, где результат может быть записан в функцию, которая его получает, например out_value: ptr<T>. Убедитесь, что в контракте указано, что результат действителен только в случае успеха.

Копирование структуры Buffer может привести к тому, что обе копии будут указывать на одно и то же распределение. Не освобождайте каждую копию отдельно. Заимствованный указатель становится недействительным после освобождения или перераспределения выделения. Строковые литералы не являются записываемыми буферами.

Неудача не означает возврат к предыдущему состоянию.

io_write_all может выйти из строя после записи нескольких байтов. Байты, уже записанные извне, не будут возвращены. С другой стороны, чтение checked cursor из bytes сохраняет положение и выходное значение в случае сбоя. Эти различия указаны в API.

Если вы также хотите попрактиковаться в устранении сбоев, перейдите к Программа чтения файлов и Двоичное сообщение.