mirror of
https://github.com/nomic-ai/gpt4all.git
synced 2025-07-06 12:06:54 +00:00
llmodel: add model wrapper destructor, fix mem leak in golang bindings (#862)
Signed-off-by: Juuso Alasuutari <juuso.alasuutari@gmail.com>
This commit is contained in:
parent
ae4a275bcd
commit
5cfb1bda89
@ -9,6 +9,7 @@
|
|||||||
struct LLModelWrapper {
|
struct LLModelWrapper {
|
||||||
LLModel *llModel = nullptr;
|
LLModel *llModel = nullptr;
|
||||||
LLModel::PromptContext promptContext;
|
LLModel::PromptContext promptContext;
|
||||||
|
~LLModelWrapper() { delete llModel; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -25,33 +26,33 @@ llmodel_model llmodel_model_create(const char *model_path) {
|
|||||||
|
|
||||||
llmodel_model llmodel_model_create2(const char *model_path, const char *build_variant, llmodel_error *error) {
|
llmodel_model llmodel_model_create2(const char *model_path, const char *build_variant, llmodel_error *error) {
|
||||||
auto wrapper = new LLModelWrapper;
|
auto wrapper = new LLModelWrapper;
|
||||||
llmodel_error new_error{};
|
int error_code = 0;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
wrapper->llModel = LLModel::construct(model_path, build_variant);
|
wrapper->llModel = LLModel::construct(model_path, build_variant);
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
new_error.code = EINVAL;
|
error_code = EINVAL;
|
||||||
last_error_message = e.what();
|
last_error_message = e.what();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!wrapper->llModel) {
|
if (!wrapper->llModel) {
|
||||||
delete std::exchange(wrapper, nullptr);
|
delete std::exchange(wrapper, nullptr);
|
||||||
// Get errno and error message if none
|
// Get errno and error message if none
|
||||||
if (new_error.code == 0) {
|
if (error_code == 0) {
|
||||||
new_error.code = errno;
|
error_code = errno;
|
||||||
last_error_message = strerror(errno);
|
last_error_message = std::strerror(error_code);
|
||||||
}
|
}
|
||||||
// Set message pointer
|
|
||||||
new_error.message = last_error_message.c_str();
|
|
||||||
// Set error argument
|
// Set error argument
|
||||||
if (error) *error = new_error;
|
if (error) {
|
||||||
|
error->message = last_error_message.c_str();
|
||||||
|
error->code = error_code;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return reinterpret_cast<llmodel_model*>(wrapper);
|
return reinterpret_cast<llmodel_model*>(wrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
void llmodel_model_destroy(llmodel_model model) {
|
void llmodel_model_destroy(llmodel_model model) {
|
||||||
LLModelWrapper *wrapper = reinterpret_cast<LLModelWrapper*>(model);
|
delete reinterpret_cast<LLModelWrapper*>(model);
|
||||||
delete wrapper->llModel;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool llmodel_loadModel(llmodel_model model, const char *model_path)
|
bool llmodel_loadModel(llmodel_model model, const char *model_path)
|
||||||
|
@ -25,6 +25,7 @@ void* load_model(const char *fname, int n_threads) {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
if (!llmodel_loadModel(model, fname)) {
|
if (!llmodel_loadModel(model, fname)) {
|
||||||
|
llmodel_model_destroy(model);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user