From 107cb48d2f646aaff5f3bd535c532dcc80729dac Mon Sep 17 00:00:00 2001 From: Ryan Curtin Date: Tue, 8 Dec 2020 19:55:27 -0500 Subject: [PATCH] Add finalizers to mlpack objects. --- CMake/julia/AppendType.cmake | 11 ++++++++++- CMake/julia/ConfigureJuliaHCPP.cmake | 9 +++++++++ src/mlpack/bindings/julia/print_param_defn.hpp | 18 ++++++++++++++++-- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/CMake/julia/AppendType.cmake b/CMake/julia/AppendType.cmake index 299be1c6a4..a3b5d2aea6 100644 --- a/CMake/julia/AppendType.cmake +++ b/CMake/julia/AppendType.cmake @@ -32,8 +32,17 @@ function(append_type TYPES_FILE PROGRAM_NAME PROGRAM_MAIN_FILE) # function. file(APPEND "${TYPES_FILE}" - "struct ${MODEL_SAFE_TYPE}\n" + "mutable struct ${MODEL_SAFE_TYPE}\n" " ptr::Ptr{Nothing}\n" + "\n" + " # Construct object and set finalizer to free memory.\n" + " function ${MODEL_SAFE_TYPE}(ptr::Ptr{Nothing})::${MODEL_SAFE_TYPE}\n" + " result = new(ptr)\n" + " finalizer(\n" + " x -> _Internal.${PROGRAM_NAME}_internal.Delete${MODEL_SAFE_TYPE}(x.ptr),\n" + " result)\n" + " return result\n" + " end\n" "end\n" "\n") endif () diff --git a/CMake/julia/ConfigureJuliaHCPP.cmake b/CMake/julia/ConfigureJuliaHCPP.cmake index 1fb9a4b4be..38c7be5cbf 100644 --- a/CMake/julia/ConfigureJuliaHCPP.cmake +++ b/CMake/julia/ConfigureJuliaHCPP.cmake @@ -29,6 +29,8 @@ if (${NUM_MODEL_TYPES} GREATER 0) void* IO_GetParam${MODEL_SAFE_TYPE}Ptr(const char* paramName); // Set the pointer to a ${MODEL_TYPE} parameter. void IO_SetParam${MODEL_SAFE_TYPE}Ptr(const char* paramName, void* ptr); +// Delete a ${MODEL_TYPE} pointer. +void Delete${MODEL_SAFE_TYPE}Ptr(void* ptr); // Serialize a ${MODEL_TYPE} pointer. char* Serialize${MODEL_SAFE_TYPE}Ptr(void* ptr, size_t* length); // Deserialize a ${MODEL_TYPE} pointer. @@ -50,6 +52,13 @@ void IO_SetParam${MODEL_SAFE_TYPE}Ptr(const char* paramName, void* ptr) IO::SetPassed(paramName); } +// Delete a ${MODEL_TYPE} pointer. +void Delete${MODEL_SAFE_TYPE}Ptr(void* ptr) +{ + ${MODEL_TYPE}* modelPtr = (${MODEL_TYPE}*) ptr; + delete modelPtr; +} + // Serialize a ${MODEL_TYPE} pointer. char* Serialize${MODEL_SAFE_TYPE}Ptr(void* ptr, size_t* length) { diff --git a/src/mlpack/bindings/julia/print_param_defn.hpp b/src/mlpack/bindings/julia/print_param_defn.hpp index 450b614d5b..51a47d39fd 100644 --- a/src/mlpack/bindings/julia/print_param_defn.hpp +++ b/src/mlpack/bindings/julia/print_param_defn.hpp @@ -59,15 +59,20 @@ void PrintParamDefn( // import ... // // function IOGetParam(paramName::String) - // (ccall((:IOGetParamPtr, Library), + // (ccall((:IO_GetParamPtr, Library), // Ptr{Nothing}, (Cstring,), paramName)) // end // // function IOSetParam(paramName::String, model::) - // ccall((:IOSetParamPtr, Library), Nothing, + // ccall((:IO_SetParamPtr, Library), Nothing, // (Cstring, Ptr{Nothing}), paramName, model.ptr) // end // + // function Delete(ptr::Ptr{Nothing}) + // ccall((:DeletePtr, Library), Nothing, + // (Ptr{Nothing},), ptr) + // end + // // function serialize(stream::IO, model::) // buf_len = UInt[0] // buffer = ccall((:SerializePtr, Library), @@ -111,6 +116,15 @@ void PrintParamDefn( std::cout << "end" << std::endl; std::cout << std::endl; + // Next, Delete(). + std::cout << "# Delete an instantiated model pointer." << std::endl; + std::cout << "function Delete" << type << "(ptr::Ptr{Nothing})" + << std::endl; + std::cout << " ccall((:Delete" << type << "Ptr, " << programName + << "Library), Nothing, (Ptr{Nothing},), ptr)" << std::endl; + std::cout << "end" << std::endl; + std::cout << std::endl; + // Now the serialization functionality. std::cout << "# Serialize a model to the given stream." << std::endl; std::cout << "function serialize" << type << "(stream::IO, model::" << type