Skip to content

Commit

Permalink
Improvement/fix leaks (#138)
Browse files Browse the repository at this point in the history
* Fix memory leaks when getting host pointer from Arrayfire.
* Fix Heap Corruption (0xC0000374) on Windows.
* Move privete headers to internal folder
* Lowercase cmake commands
* Improve exception safety using smart pointers
* Improve const correctnes of Array class.
* Remove copy/move operations from array class.
  • Loading branch information
raulbocanegra committed Feb 18, 2020
1 parent ff5a27d commit 77acf50
Show file tree
Hide file tree
Showing 58 changed files with 704 additions and 717 deletions.
7 changes: 4 additions & 3 deletions .CI/travis/build_linux.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

mkdir -p build && cd build
conan profile update settings.compiler.libcxx=libstdc++11 default
conan install .. --build missing
if [[ -z "${TRAVIS_TAG}" ]]; then
../cmakebin/bin/cmake .. -DKHIVA_ENABLE_COVERAGE=ON -DKHIVA_BUILD_DOCUMENTATION=OFF -DKHIVA_BUILD_EXAMPLES=OFF -DKHIVA_BUILD_BENCHMARKS=OFF
cmake --build . -- -j8
ctest

else
../cmakebin/bin/cmake ..
cmake --build . -- -j8
fi
cmake --build . -- -j8
ctest --output-on-failure
5 changes: 1 addition & 4 deletions .CI/travis/install_linux.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,9 @@ sudo apt-get update -y
sudo apt-get install -y lcov python3 python3-pip rpm python3-setuptools

# Installing conan
sudo pip3 install conan==1.5.2
sudo pip3 install conan==1.22.2

if ! [[ -z "${TRAVIS_TAG}" ]]; then
sudo apt-get install -y doxygen graphviz
sudo pip3 install sphinx==1.7.5 breathe==4.9.1 sphinx_rtd_theme==0.4.0
fi

# Installing library dependencies with conan
conan remote add -f conan-mpusz https://api.bintray.com/conan/mpusz/conan-mpusz
2 changes: 1 addition & 1 deletion .CI/travis/install_osx.sh
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ brew install --force freeimage fontconfig glfw glbinding

# Installing conan
pip${PYTHON_VERSION} install --upgrade pip
pip${PYTHON_VERSION} install conan==1.5.2
pip${PYTHON_VERSION} install conan==1.22.2

if ! [[ -z "${TRAVIS_TAG}" ]]; then
brew install doxygen graphviz
Expand Down
147 changes: 73 additions & 74 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,62 +4,61 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

CMAKE_MINIMUM_REQUIRED(VERSION 3.9.6)
PROJECT(Khiva
LANGUAGES C CXX)
SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON)
cmake_minimum_required(VERSION 3.9.6)
project(Khiva LANGUAGES C CXX)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)

# Using C++ 11
SET(CMAKE_CXX_STANDARD 11)
SET(CMAKE_CXX_STANDARD_REQUIRED ON) # Required
SET(CMAKE_CXX_EXTENSIONS ON) # with compiler extensions like gnu++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON) # Required
set(CMAKE_CXX_EXTENSIONS ON) # with compiler extensions like gnu++11

# Add compile definition to avoid external users of the library to include internal headers
ADD_DEFINITIONS(-DBUILDING_KHIVA)
add_definitions(-DBUILDING_KHIVA)

# Avoid conflicts with min and max functions
IF(WIN32)
ADD_DEFINITIONS(-DNOMINMAX)
ENDIF()
if(WIN32)
add_definitions(-DNOMINMAX)
endif()
# Load from environment variables
LIST(APPEND CMAKE_MODULE_PATH $ENV{CMAKE_MODULE_PATH})
LIST(APPEND CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH})
LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
list(APPEND CMAKE_MODULE_PATH $ENV{CMAKE_MODULE_PATH})
list(APPEND CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH})
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)

# Set the build type
IF(NOT CMAKE_BUILD_TYPE)
SET(CMAKE_BUILD_TYPE "Release"
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release"
CACHE STRING "Build configuration 'Release' or 'Debug'."
FORCE)
ENDIF()
endif()

# Compile-time options
OPTION(KHIVA_BUILD_TESTS "Build tests of the Khiva library" ON)
OPTION(KHIVA_BUILD_BENCHMARKS "Build benchmarks of the Khiva library" ON)
OPTION(KHIVA_BUILD_EXAMPLES "Build examples of the Khiva library" ON)
OPTION(KHIVA_BUILD_DOCUMENTATION "Create and install the HTML based API documentation (requires Doxygen, GraphViz and Sphinx)" ON)
OPTION(KHIVA_USE_CONAN "Use the conan package manager to download the dependencies of the Khiva library" ON)
OPTION(KHIVA_ENABLE_COVERAGE "This flag anables Code Coverage of the code" OFF)
OPTION(KHIVA_BUILD_C_BINDINGS "Build C bindings" ON)
OPTION(KHIVA_BUILD_JNI_BINDINGS "Build JNI bindings" ON)

IF(KHIVA_ENABLE_COVERAGE AND NOT WIN32)
option(KHIVA_BUILD_TESTS "Build tests of the Khiva library" ON)
option(KHIVA_BUILD_BENCHMARKS "Build benchmarks of the Khiva library" ON)
option(KHIVA_BUILD_EXAMPLES "Build examples of the Khiva library" ON)
option(KHIVA_BUILD_DOCUMENTATION "Create and install the HTML based API documentation (requires Doxygen, GraphViz and Sphinx)" ON)
option(KHIVA_USE_CONAN "Use the conan package manager to download the dependencies of the Khiva library" ON)
option(KHIVA_ENABLE_COVERAGE "This flag anables Code Coverage of the code" OFF)
option(KHIVA_BUILD_C_BINDINGS "Build C bindings" ON)
option(KHIVA_BUILD_JNI_BINDINGS "Build JNI bindings" ON)

if(KHIVA_ENABLE_COVERAGE AND NOT WIN32)
# Setting compiler flags for code coverage
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage")
ENDIF()
endif()

IF(KHIVA_USE_CONAN)
if(KHIVA_USE_CONAN)
# Bring conan generated dependencies
IF(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/conanbuildinfo.cmake)
INCLUDE(${CMAKE_CURRENT_BINARY_DIR}/conanbuildinfo.cmake)
ELSE()
MESSAGE(WARNING "The file conanbuildinfo.cmake does not exist, you have to run conan install first.\n"
if(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/conanbuildinfo.cmake)
include(${CMAKE_CURRENT_BINARY_DIR}/conanbuildinfo.cmake)
else()
message(WARNING "The file conanbuildinfo.cmake does not exist, you have to run conan install first.\n"
"Check the following instructions to run conan installation:\n"
"https://github.com/shapelets/khiva/blob/master/doc/markdown/INSTALLATION.md#build-from-source-code-1")
ENDIF()
endif()
CONAN_BASIC_SETUP(KEEP_RPATHS)
ELSE()
else()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
Expand All @@ -77,78 +76,78 @@ ELSE()
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
ENDIF()
endif()

# Set the base directory to parent so src and include become equaly visible
SET(KHIVALIB_BASE_DIR ${PROJECT_SOURCE_DIR})
set(KHIVALIB_BASE_DIR ${PROJECT_SOURCE_DIR})
# Define source directory
SET(KHIVALIB_SRC "${KHIVALIB_BASE_DIR}/src")
set(KHIVALIB_SRC "${KHIVALIB_BASE_DIR}/src")
# Define include directory
SET(KHIVALIB_INC "${KHIVALIB_BASE_DIR}/include")
set(KHIVALIB_INC "${KHIVALIB_BASE_DIR}/include")
# Library Name
SET(KHIVALIB "khiva")
set(KHIVALIB "khiva")

# Bring KHIVA version and installation directories
INCLUDE(KhivaVersion)
INCLUDE(KhivaInstallDirs)
include(KhivaVersion)
include(KhivaInstallDirs)

SET(PROJECT_VERSION ${VERSION_SHORT})
set(PROJECT_VERSION ${VERSION_SHORT})

# These config files will be installed so we need to set the install_destination
# path relative to the install path
INCLUDE(CMakePackageConfigHelpers)
WRITE_BASIC_PACKAGE_VERSION_FILE(
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
cmake/install/KhivaConfigVersion.cmake
COMPATIBILITY SameMajorVersion)

SET(INCLUDE_DIRS include)
SET(CMAKE_DIR ${KHIVA_INSTALL_CMAKE_DIR})
CONFIGURE_PACKAGE_CONFIG_FILE(
set(INCLUDE_DIRS include)
set(CMAKE_DIR ${KHIVA_INSTALL_CMAKE_DIR})
configure_package_config_file(
${KHIVALIB_BASE_DIR}/cmake/KhivaConfig.cmake.in
cmake/install/KhivaConfig.cmake
INSTALL_DESTINATION "${KHIVA_INSTALL_CMAKE_DIR}"
PATH_VARS INCLUDE_DIRS CMAKE_DIR)

IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
# Turn compiler warnings up to 11
STRING(REGEX REPLACE "[-/]W[1-4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
ELSEIF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wall -Wextra -pedantic -Wno-gnu-zero-variadic-macro-arguments -Wint-conversion -Wshorten-64-to-32")
ELSEIF(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wall -Wextra -pedantic")
ENDIF()
string(REGEX REPLACE "[-/]W[1-4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wall -Wextra -pedantic -Wno-gnu-zero-variadic-macro-arguments -Wint-conversion -Wshorten-64-to-32")
elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W -Wall -Wextra -pedantic")
endif()

# build items in subdirectories
ADD_SUBDIRECTORY(src)
add_subdirectory(src)

# build examples
IF(KHIVA_BUILD_EXAMPLES)
ADD_SUBDIRECTORY(examples)
ENDIF()
if(KHIVA_BUILD_EXAMPLES)
add_subdirectory(examples)
endif()

# build tests
IF(KHIVA_BUILD_TESTS)
ENABLE_TESTING()
ADD_SUBDIRECTORY(test)
ENDIF()
if(KHIVA_BUILD_TESTS)
enable_testing()
add_subdirectory(test)
endif()

# build benchmarks
IF(KHIVA_BUILD_BENCHMARKS)
ADD_SUBDIRECTORY(benchmarks)
ENDIF()
if(KHIVA_BUILD_BENCHMARKS)
add_subdirectory(benchmarks)
endif()

# build bindings for c and jni
ADD_SUBDIRECTORY(bindings)
add_subdirectory(bindings)

# build items in subdirectories
IF(KHIVA_BUILD_DOCUMENTATION)
ADD_SUBDIRECTORY(doc)
ENDIF()
if(KHIVA_BUILD_DOCUMENTATION)
add_subdirectory(doc)
endif()

INSTALL(DIRECTORY licenses/
install(DIRECTORY licenses/
DESTINATION ${KHIVA_INSTALL_LICENSES_DIR}
COMPONENT licenses)

INCLUDE(CPackConfig)
include(CPackConfig)
55 changes: 55 additions & 0 deletions CMakeSettings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
{
"environments": [
{
"VCToolsVersion": "14.24"
}
],
"configurations": [
{
"name": "x64-Debug",
"generator": "Ninja",
"configurationType": "Debug",
"inheritEnvironments": [ "msvc_x64_x64" ],
"buildRoot": "${projectDir}\\out\\build\\${name}",
"installRoot": "${projectDir}\\out\\install\\${name}",
"cmakeCommandArgs": "",
"buildCommandArgs": "-v",
"ctestCommandArgs": "",
"variables": [
{
"name": "CMAKE_TOOLCHAIN_FILE",
"value": "${env.VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
"type": "STRING"
},
{
"name": "KHIVA_USE_CONAN",
"value": "OFF",
"type": "STRING"
}
]
},
{
"name": "x64-Release",
"generator": "Ninja",
"configurationType": "Release",
"buildRoot": "${projectDir}\\out\\build\\${name}",
"installRoot": "${projectDir}\\out\\install\\${name}",
"cmakeCommandArgs": "",
"buildCommandArgs": "-v",
"ctestCommandArgs": "",
"inheritEnvironments": [ "msvc_x64_x64" ],
"variables": [
{
"name": "CMAKE_TOOLCHAIN_FILE",
"value": "${env.VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
"type": "STRING"
},
{
"name": "KHIVA_USE_CONAN",
"value": "OFF",
"type": "STRING"
}
]
}
]
}
18 changes: 9 additions & 9 deletions benchmarks/matrixBench.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,12 @@
// file, You can obtain one at http://mozilla.org/MPL/2.0/.

#include <benchmark/benchmark.h>
#include <khiva/internal/matrixInternal.h>
#include <khiva/matrix.h>
#include <math.h>
#include "khiva/matrixInternal.h"

#include <algorithm>
#include <cmath>

#include "khivaBenchmark.h"

template <af::Backend BE, int D>
Expand Down Expand Up @@ -289,25 +292,22 @@ void StompDataCPU(benchmark::State &state) {
auto m = state.range(1);

std::srand(0);
double *t_host = (double *)malloc(n * sizeof(double));
for (long i = 0; i < n; i++) {
t_host[i] = std::rand();
}
std::vector<double> t_host;
t_host.reserve(n);
std::generate_n(std::back_inserter(t_host), n, std::rand);

af::array profile;
af::array index;

af::sync();
while (state.KeepRunning()) {
khiva::matrix::stomp(af::array(n, t_host), af::array(n, t_host), m, profile, index);
khiva::matrix::stomp(af::array(n, t_host.data()), af::array(n, t_host.data()), m, profile, index);
profile.eval();
index.eval();
af::sync();
}

addMemoryCounters(state);

free(t_host);
}

template <af::Backend BE, int D>
Expand Down
18 changes: 9 additions & 9 deletions bindings/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

CMAKE_MINIMUM_REQUIRED(VERSION 3.9.6)
SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON)
cmake_minimum_required(VERSION 3.9.6)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)

SET(KHIVALIB_INC "${KHIVALIB_BASE_DIR}/include")
set(KHIVALIB_INC "${KHIVALIB_BASE_DIR}/include")

# build bindings for c and jni

IF (KHIVA_BUILD_C_BINDINGS)
ADD_SUBDIRECTORY(c)
ENDIF ()
if (KHIVA_BUILD_C_BINDINGS)
add_subdirectory(c)
endif ()

IF (KHIVA_BUILD_JNI_BINDINGS)
ADD_SUBDIRECTORY(jni)
ENDIF ()
if (KHIVA_BUILD_JNI_BINDINGS)
add_subdirectory(jni)
endif ()

0 comments on commit 77acf50

Please sign in to comment.