blob: 94ef0759873b3da6644a8aaa95875b871ceedd91 [file] [edit]
/*===----------------------------------------------------------------------===*\
|* *|
|* Part of the LLVM Project, under the Apache License v2.0 with LLVM *|
|* Exceptions. *|
|* See https://llvm.org/LICENSE.txt for license information. *|
|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *|
|* *|
|*===----------------------------------------------------------------------===*|
|* *|
|* The functions for the LLVM CAS plugin API. Intended for assisting *|
|* implementations of the API. *|
|* The API is experimental and subject to change. *|
|* *|
\*===----------------------------------------------------------------------===*/
#ifndef LLVM_C_CAS_PLUGINAPI_FUNCTIONS_H
#define LLVM_C_CAS_PLUGINAPI_FUNCTIONS_H
#include "llvm-c/CAS/PluginAPI_types.h"
#include "llvm-c/ExternC.h"
#ifndef LLCAS_PUBLIC
#ifdef _WIN32
#define LLCAS_PUBLIC __declspec(dllexport)
#else
#define LLCAS_PUBLIC
#endif
#endif
LLVM_C_EXTERN_C_BEGIN
/**
* Returns the \c LLCAS_VERSION_MAJOR and \c LLCAS_VERSION_MINOR values that the
* plugin was compiled with.
* Intended for assisting compatibility with different versions.
*/
LLCAS_PUBLIC void llcas_get_plugin_version(unsigned *major, unsigned *minor);
/**
* Releases memory of C string pointers provided by other functions.
*/
LLCAS_PUBLIC void llcas_string_dispose(char *);
/**
* Cancels the asynchronous query associated with the \c llcas_cancellable_t.
*/
LLCAS_PUBLIC void llcas_cancellable_cancel(llcas_cancellable_t);
/**
* Releases memory associated with given \c llcas_cancellable_t.
*/
LLCAS_PUBLIC void llcas_cancellable_dispose(llcas_cancellable_t);
/**
* Options object to configure creation of \c llcas_cas_t. After passing to
* \c llcas_cas_create, its memory can be released via
* \c llcas_cas_options_dispose.
*/
LLCAS_PUBLIC llcas_cas_options_t llcas_cas_options_create(void);
LLCAS_PUBLIC void llcas_cas_options_dispose(llcas_cas_options_t);
/**
* Receives the \c LLCAS_VERSION_MAJOR and \c LLCAS_VERSION_MINOR values that
* the client was compiled with.
* Intended for assisting compatibility with different versions.
*/
LLCAS_PUBLIC void llcas_cas_options_set_client_version(llcas_cas_options_t,
unsigned major,
unsigned minor);
/**
* Receives a local file-system path that the plugin should use for any on-disk
* resources/caches.
*/
LLCAS_PUBLIC void llcas_cas_options_set_ondisk_path(llcas_cas_options_t,
const char *path);
/**
* Receives a name/value strings pair, for the plugin to set as a custom option
* it supports. These are usually passed through as invocation options and are
* opaque to the client.
*
* \param error optional pointer to receive an error message if an error
* occurred. If set, the memory it points to needs to be released via
* \c llcas_string_dispose.
* \returns true if there was an error, false otherwise.
*/
LLCAS_PUBLIC bool llcas_cas_options_set_option(llcas_cas_options_t,
const char *name,
const char *value, char **error);
/**
* Creates a new \c llcas_cas_t object. The objects returned from the other
* functions are only valid to use while the \c llcas_cas_t object that they
* came from is still valid.
*
* \param error optional pointer to receive an error message if an error
* occurred. If set, the memory it points to needs to be released via
* \c llcas_string_dispose.
* \returns \c NULL if there was an error.
*/
LLCAS_PUBLIC llcas_cas_t llcas_cas_create(llcas_cas_options_t, char **error);
/**
* Releases memory of \c llcas_cas_t. After calling this it is invalid to keep
* using objects that originated from this \c llcas_cas_t instance.
*/
LLCAS_PUBLIC void llcas_cas_dispose(llcas_cas_t);
/**
* Get the local storage size of the CAS/cache data in bytes.
*
* \param error optional pointer to receive an error message if an error
* occurred. If set, the memory it points to needs to be released via
* \c llcas_string_dispose.
* \returns the local storage size of the CAS/cache data, or -1 if the
* implementation does not support reporting such size, or -2 if an error
* occurred.
*/
LLCAS_PUBLIC int64_t llcas_cas_get_ondisk_size(llcas_cas_t, char **error);
/**
* Set the size for limiting disk storage growth.
*
* \param size_limit the maximum size limit in bytes. 0 means no limit. Negative
* values are invalid.
* \param error optional pointer to receive an error message if an error
* occurred. If set, the memory it points to needs to be released via
* \c llcas_string_dispose.
* \returns true if there was an error, false otherwise.
*/
LLCAS_PUBLIC bool
llcas_cas_set_ondisk_size_limit(llcas_cas_t, int64_t size_limit, char **error);
/**
* Prune local storage to reduce its size according to the desired size limit.
* Pruning can happen concurrently with other operations.
*
* \returns true if there was an error, false otherwise.
*/
LLCAS_PUBLIC bool llcas_cas_prune_ondisk_data(llcas_cas_t, char **error);
/**
* Validate the CAS contents.
*
* \param check_hash if true, the hash of each object is recomputed and compared
* against the one it is stored under.
* \param error optional pointer to receive an error message if an error
* occurred. If set, the memory it points to needs to be released via
* \c llcas_string_dispose.
* \returns true if there was an error, false otherwise.
*/
LLCAS_PUBLIC bool llcas_cas_validate(llcas_cas_t, bool check_hash,
char **error);
/**
* \returns the hash schema name that the plugin is using. The string memory it
* points to needs to be released via \c llcas_string_dispose.
*/
LLCAS_PUBLIC char *llcas_cas_get_hash_schema_name(llcas_cas_t);
/**
* Parses the printed digest and returns the digest hash bytes.
*
* \param printed_digest a C string that was previously provided by
* \c llcas_digest_print.
* \param bytes pointer to a buffer for writing the digest bytes. Can be \c NULL
* if \p bytes_size is 0.
* \param bytes_size the size of the buffer.
* \param error optional pointer to receive an error message if an error
* occurred. If set, the memory it points to needs to be released via
* \c llcas_string_dispose.
* \returns 0 if there was an error. If \p bytes_size is smaller than the
* required size to fit the digest bytes, returns the required buffer size
* without writing to \c bytes. Otherwise writes the digest bytes to \p bytes
* and returns the number of written bytes.
*/
LLCAS_PUBLIC unsigned llcas_digest_parse(llcas_cas_t,
const char *printed_digest,
uint8_t *bytes, size_t bytes_size,
char **error);
/**
* Returns a string for the given digest bytes that can be passed to
* \c llcas_digest_parse.
*
* \param printed_id pointer to receive the printed digest string. The memory it
* points to needs to be released via \c llcas_string_dispose.
* \param error optional pointer to receive an error message if an error
* occurred. If set, the memory it points to needs to be released via
* \c llcas_string_dispose.
* \returns true if there was an error, false otherwise.
*/
LLCAS_PUBLIC bool llcas_digest_print(llcas_cas_t, llcas_digest_t,
char **printed_id, char **error);
/**
* Provides the \c llcas_objectid_t value for the given \c llcas_digest_t.
*
* \param digest the digest bytes that the returned \c llcas_objectid_t
* represents.
* \param p_id pointer to store the returned \c llcas_objectid_t object.
* \param error optional pointer to receive an error message if an error
* occurred. If set, the memory it points to needs to be released via
* \c llcas_string_dispose.
* \returns true if there was an error, false otherwise.
*/
LLCAS_PUBLIC bool llcas_cas_get_objectid(llcas_cas_t, llcas_digest_t digest,
llcas_objectid_t *p_id, char **error);
/**
* \returns the \c llcas_digest_t value for the given \c llcas_objectid_t.
* The memory that the buffer points to is valid for the lifetime of the
* \c llcas_cas_t object.
*/
LLCAS_PUBLIC llcas_digest_t llcas_objectid_get_digest(llcas_cas_t,
llcas_objectid_t);
/**
* Checks whether a \c llcas_objectid_t points to an existing object.
*
* \param globally For CAS implementations that distinguish between local CAS
* and remote/distributed CAS, \p globally set to false indicates that the
* lookup will be restricted to the local CAS, returning "not found" even if the
* object might exist in the remote CAS.
* \param error optional pointer to receive an error message if an error
* occurred. If set, the memory it points to needs to be released via
* \c llcas_string_dispose.
* \returns one of \c llcas_lookup_result_t.
*/
LLCAS_PUBLIC llcas_lookup_result_t llcas_cas_contains_object(llcas_cas_t,
llcas_objectid_t,
bool globally,
char **error);
/**
* Loads the object that \c llcas_objectid_t points to.
*
* \param error optional pointer to receive an error message if an error
* occurred. If set, the memory it points to needs to be released via
* \c llcas_string_dispose.
* \returns one of \c llcas_lookup_result_t.
*/
LLCAS_PUBLIC llcas_lookup_result_t llcas_cas_load_object(
llcas_cas_t, llcas_objectid_t, llcas_loaded_object_t *, char **error);
/**
* Like \c llcas_cas_load_object but loading happens via a callback function.
* Whether the call is asynchronous or not depends on the implementation.
*
* \param ctx_cb pointer to pass to the callback function.
*
* \param[out] cancel_tok optional pointer to receive a \c llcas_cancellable_t.
*/
LLCAS_PUBLIC void llcas_cas_load_object_async(llcas_cas_t, llcas_objectid_t,
void *ctx_cb,
llcas_cas_load_object_cb,
llcas_cancellable_t *cancel_tok);
/**
* Stores the object with the provided data buffer and \c llcas_objectid_t
* references, and provides its associated \c llcas_objectid_t.
*
* \param refs pointer to array of \c llcas_objectid_t. Can be \c NULL if
* \p refs_count is 0.
* \param refs_count number of \c llcas_objectid_t objects in the array.
* \param p_id pointer to store the returned \c llcas_objectid_t object.
* \param error optional pointer to receive an error message if an error
* occurred. If set, the memory it points to needs to be released via
* \c llcas_string_dispose.
* \returns true if there was an error, false otherwise.
*/
LLCAS_PUBLIC bool llcas_cas_store_object(llcas_cas_t, llcas_data_t,
const llcas_objectid_t *refs,
size_t refs_count,
llcas_objectid_t *p_id, char **error);
/**
* Stores the data of a file and provides its associated \c llcas_objectid_t.
*
* An underlying implementation could perform optimizations that reduce I/O
* and disk space consumption.
*
* If there are any concurrent modifications to the file, the contents in the
* CAS may be corrupt.
*
* \param filepath path to the file.
* \param p_id pointer to store the returned \c llcas_objectid_t object.
* \param error optional pointer to receive an error message if an error
* occurred. If set, the memory it points to needs to be released via
* \c llcas_string_dispose.
* \returns true if there was an error, false otherwise.
*/
LLCAS_PUBLIC bool llcas_cas_store_from_filepath(llcas_cas_t,
const char *filepath,
llcas_objectid_t *p_id,
char **error);
/**
* \returns the data buffer of the provided \c llcas_loaded_object_t. The buffer
* pointer must be 8-byte aligned and \c NULL terminated. The memory that the
* buffer points to is valid for the lifetime of the \c llcas_cas_t object.
*/
LLCAS_PUBLIC llcas_data_t llcas_loaded_object_get_data(llcas_cas_t,
llcas_loaded_object_t);
/**
* \returns a data buffer for the provided \c llcas_loaded_object_t that stays
* valid after the \c llcas_cas_t is disposed of. The buffer pointer must be
* 8-byte aligned and \c NULL terminated. It must be released via
* \c llcas_standalone_data_dispose, which may outlive the \c llcas_cas_t.
*
* This is an optimization over copying the buffer returned by
* \c llcas_loaded_object_get_data: an implementation that can hand out storage
* outliving itself, e.g. a mapping of a file it does not keep open, avoids the
* copy. Implementing it is optional, and requires
* \c llcas_standalone_data_dispose to be implemented as well.
*/
LLCAS_PUBLIC llcas_data_t
llcas_loaded_object_get_standalone_data(llcas_cas_t, llcas_loaded_object_t);
/**
* Releases a buffer returned by \c llcas_loaded_object_get_standalone_data.
*
* This may be called after the \c llcas_cas_t that produced the buffer has
* been disposed of, so it must not depend on it.
*/
LLCAS_PUBLIC void llcas_standalone_data_dispose(llcas_data_t);
/**
* \returns the references of the provided \c llcas_loaded_object_t.
*/
LLCAS_PUBLIC llcas_object_refs_t
llcas_loaded_object_get_refs(llcas_cas_t, llcas_loaded_object_t);
/**
* \returns the number of references in the provided \c llcas_object_refs_t.
*/
LLCAS_PUBLIC size_t llcas_object_refs_get_count(llcas_cas_t,
llcas_object_refs_t);
/**
* \returns the \c llcas_objectid_t of the reference at \p index. It is invalid
* to pass an index that is out of the range of references.
*/
LLCAS_PUBLIC llcas_objectid_t llcas_object_refs_get_id(llcas_cas_t,
llcas_object_refs_t,
size_t index);
/**
* Exports the data of an object to a file path. It does not include any
* references of the object.
*
* An underlying implementation could perform optimizations that reduce I/O
* and disk space consumption.
*
* \param filepath the file path to write the data to.
* \param error optional pointer to receive an error message if an error
* occurred. If set, the memory it points to needs to be released via
* \c llcas_string_dispose.
* \returns true if there was an error, false otherwise.
*/
LLCAS_PUBLIC bool
llcas_loaded_object_export_data_to_filepath(llcas_cas_t, llcas_loaded_object_t,
const char *filepath, char **error);
/**
* Retrieves the \c llcas_objectid_t value associated with a \p key.
*
* \param p_value pointer to store the returned \c llcas_objectid_t object.
* \param globally if true it is a hint to the underlying implementation that
* the lookup is profitable to be done on a distributed caching level, not just
* locally. The implementation is free to ignore this flag.
* \param error optional pointer to receive an error message if an error
* occurred. If set, the memory it points to needs to be released via
* \c llcas_string_dispose.
* \returns one of \c llcas_lookup_result_t.
*/
LLCAS_PUBLIC llcas_lookup_result_t llcas_actioncache_get_for_digest(
llcas_cas_t, llcas_digest_t key, llcas_objectid_t *p_value, bool globally,
char **error);
/**
* Like \c llcas_actioncache_get_for_digest but result is provided to a callback
* function. Whether the call is asynchronous or not depends on the
* implementation.
*
* \param ctx_cb pointer to pass to the callback function.
*
* \param[out] cancel_tok optional pointer to receive a \c llcas_cancellable_t.
*/
LLCAS_PUBLIC void llcas_actioncache_get_for_digest_async(
llcas_cas_t, llcas_digest_t key, bool globally, void *ctx_cb,
llcas_actioncache_get_cb, llcas_cancellable_t *cancel_tok);
/**
* Associates a \c llcas_objectid_t \p value with a \p key. It is invalid to set
* a different \p value to the same \p key.
*
* \param globally if true it is a hint to the underlying implementation that
* the association is profitable to be done on a distributed caching level, not
* just locally. The implementation is free to ignore this flag.
* \param error optional pointer to receive an error message if an error
* occurred. If set, the memory it points to needs to be released via
* \c llcas_string_dispose.
* \returns true if there was an error, false otherwise.
*/
LLCAS_PUBLIC bool llcas_actioncache_put_for_digest(llcas_cas_t,
llcas_digest_t key,
llcas_objectid_t value,
bool globally, char **error);
/**
* Like \c llcas_actioncache_put_for_digest but result is provided to a callback
* function. Whether the call is asynchronous or not depends on the
* implementation.
*
* \param ctx_cb pointer to pass to the callback function.
*
* \param[out] cancel_tok optional pointer to receive a \c llcas_cancellable_t.
*/
LLCAS_PUBLIC void llcas_actioncache_put_for_digest_async(
llcas_cas_t, llcas_digest_t key, llcas_objectid_t value, bool globally,
void *ctx_cb, llcas_actioncache_put_cb, llcas_cancellable_t *cancel_tok);
/**
* Validate the action cache contents.
*
* \param error optional pointer to receive an error message if an error
* occurred. If set, the memory it points to needs to be released via
* \c llcas_string_dispose.
* \returns true if there was an error, false otherwise.
*/
LLCAS_PUBLIC bool llcas_actioncache_validate(llcas_cas_t, char **error);
LLVM_C_EXTERN_C_END
#endif /* LLVM_C_CAS_PLUGINAPI_FUNCTIONS_H */