This source file includes following definitions.
- my_halide_malloc
 
- my_halide_free
 
- my_halide_error
 
- halide_device_free
 
- halide_device_malloc
 
- main
 
#include "HalideRuntime.h"
#include "HalideBuffer.h"
#define WEAK
#include "device_interface.h"
#include <stdio.h>
#include <stdlib.h>
#include "cleanup_on_error.h"
using namespace Halide::Runtime;
const int size = 64;
int successful_mallocs = 0, failed_mallocs = 0, frees = 0, errors = 0, device_mallocs = 0, device_frees = 0;
void *my_halide_malloc(void *user_context, size_t x) {
    
    if (successful_mallocs) {
        failed_mallocs++;
        return nullptr;
    }
    successful_mallocs++;
    void *orig = malloc(x+40);
    
    void *ptr = (void *)((((size_t)orig + 32) >> 5) << 5);
    ((void **)ptr)[-1] = orig;
    return ptr;
}
void my_halide_free(void *user_context, void *ptr) {
    frees++;
    free(((void**)ptr)[-1]);
}
void my_halide_error(void *user_context, const char *msg) {
    errors++;
}
#ifndef _WIN32
extern "C" int halide_device_free(void *user_context, struct halide_buffer_t *buf) {
    device_frees++;
    return buf->device_interface->device_free(user_context, buf);
}
extern "C" int halide_device_malloc(void *user_context, struct halide_buffer_t *buf,
                                    const halide_device_interface_t *interface) {
    if (!buf->device) {
        device_mallocs++;
    }
    return interface->device_malloc(user_context, buf);
}
#endif
int main(int argc, char **argv) {
    halide_set_custom_malloc(&my_halide_malloc);
    halide_set_custom_free(&my_halide_free);
    halide_set_error_handler(&my_halide_error);
    Buffer<int32_t> output(size);
    int result = cleanup_on_error(output);
    if (result != halide_error_code_out_of_memory &&
        result != halide_error_code_device_malloc_failed) {
        printf("The exit status was %d instead of %d or %d\n",
               result,
               halide_error_code_out_of_memory,
               halide_error_code_device_malloc_failed);
        return -1;
    }
    if (failed_mallocs != 1) {
        printf("One of the mallocs was supposed to fail\n");
        return -1;
    }
    if (successful_mallocs != 1) {
        printf("One of the mallocs was supposed to succeed\n");
        return -1;
    }
    if (frees != 1) {
        printf("The successful malloc should have been freed\n");
        return -1;
    }
    if (errors != 1) {
        printf("%d errors. There was supposed to be one error\n", errors);
        return -1;
    }
    if (device_mallocs != device_frees) {
        printf("There were a different number of device mallocs (%d) and frees (%d)\n", device_mallocs, device_frees);
        return -1;
    }
    printf("Success!\n");
    return 0;
}