#include <io.h> /* _findfirst and _findnext set errno iff they return -1 */
#include <stdlib.h>
#include <string.h>
-
+#include "loader.h"
#ifdef __cplusplus
extern "C"
{
const char *all = /* search pattern must end with suitable wildcard */
strchr("/\\", name[base_length - 1]) ? "*" : "/*";
- if((dir = (DIR *) malloc(sizeof *dir)) != 0 &&
- (dir->name = (char *) malloc(base_length + strlen(all) + 1)) != 0)
+ if((dir = (DIR *) loader_tls_heap_alloc(sizeof *dir)) != 0 &&
+ (dir->name = (char *) loader_tls_heap_alloc(base_length + strlen(all) + 1)) != 0)
{
strcat(strcpy(dir->name, name), all);
}
else /* rollback */
{
- free(dir->name);
- free(dir);
+ loader_tls_heap_free(dir->name);
+ loader_tls_heap_free(dir);
dir = 0;
}
}
else /* rollback */
{
- free(dir);
+ loader_tls_heap_free(dir);
dir = 0;
errno = ENOMEM;
}
struct loader_layer_properties *layer_prop);
struct loader_struct loader = {0};
+// TLS for instance for alloc/free callbacks
+THREAD_LOCAL_DECL struct loader_instance *tls_instance;
static PFN_vkVoidFunction VKAPI loader_GetInstanceProcAddr(
VkInstance instance,
return realloc(pMem, size);
}
+void *loader_tls_heap_alloc(size_t size)
+{
+ return loader_heap_alloc(tls_instance, size, VK_SYSTEM_ALLOC_TYPE_INTERNAL);
+}
+
+void loader_tls_heap_free(void *pMem)
+{
+ return loader_heap_free(tls_instance, pMem);
+}
+
static void loader_log(VkFlags msg_type, int32_t msg_code,
const char *format, ...)
{
// initialize logging
loader_debug_init();
+
+ // initial cJSON to use alloc callbacks
+ cJSON_Hooks alloc_fns = {
+ .malloc_fn = loader_tls_heap_alloc,
+ .free_fn = loader_tls_heap_free,
+ };
+ cJSON_InitHooks(&alloc_fns);
}
struct loader_manifest_files {
filename, file_vers);
if (strcmp(file_vers, "\"0.9.0\"") != 0)
loader_log(VK_DBG_REPORT_WARN_BIT, 0, "Unexpected manifest file version (expected 0.9.0), may cause errors");
- free(file_vers);
+ loader_tls_heap_free(file_vers);
layer_node = cJSON_GetObjectItem(json, "layer");
if (layer_node == NULL) {
temp[strlen(temp) - 1] = '\0'; \
var = loader_stack_alloc(strlen(temp) + 1); \
strcpy(var, &temp[1]); \
- free(temp); \
+ loader_tls_heap_free(temp); \
}
GET_JSON_ITEM(layer_node, name)
GET_JSON_ITEM(layer_node, type)
temp[strlen(temp) - 1] = '\0'; \
var = loader_stack_alloc(strlen(temp) + 1); \
strcpy(var, &temp[1]); \
- free(temp); \
+ loader_tls_heap_free(temp); \
}
cJSON *instance_extensions, *device_extensions, *functions, *enable_environment;
file_str, file_vers);
if (strcmp(file_vers, "\"1.0.0\"") != 0)
loader_log(VK_DBG_REPORT_WARN_BIT, 0, "Unexpected manifest file version (expected 1.0.0), may cause errors");
- free(file_vers);
+ loader_tls_heap_free(file_vers);
item = cJSON_GetObjectItem(json, "ICD");
if (item != NULL) {
item = cJSON_GetObjectItem(item, "library_path");
char *temp= cJSON_Print(item);
if (!temp || strlen(temp) == 0) {
loader_log(VK_DBG_REPORT_WARN_BIT, 0, "Can't find \"library_path\" in ICD JSON file %s, skipping", file_str);
- free(temp);
+ loader_tls_heap_free(temp);
loader_heap_free(inst, file_str);
cJSON_Delete(json);
continue;
temp[strlen(temp) - 1] = '\0';
char *library_path = loader_stack_alloc(strlen(temp) + 1);
strcpy(library_path, &temp[1]);
- free(temp);
+ loader_tls_heap_free(temp);
if (!library_path || strlen(library_path) == 0) {
loader_log(VK_DBG_REPORT_WARN_BIT, 0, "Can't find \"library_path\" in ICD JSON file %s, skipping", file_str);
loader_heap_free(inst, file_str);
struct loader_icd_libs icd_libs;
uint32_t copy_size;
+ tls_instance = NULL;
if (pCount == NULL) {
return VK_ERROR_INVALID_POINTER;
}
{
struct loader_layer_list instance_layer_list;
+ tls_instance = NULL;
loader_platform_thread_once(&once_init, loader_initialize);