mirror of
https://github.com/wiiu-env/WiiUPluginSystem.git
synced 2024-12-24 00:51:59 +01:00
Revert "Avoid reallocations of the parent data for WUPS_STORAGE_TYPE_ITEM items."
This commit is contained in:
parent
90d1e51922
commit
7f76e31e70
@ -27,7 +27,6 @@ typedef enum {
|
|||||||
WUPS_STORAGE_ERROR_B64_DECODE_FAILED = -9,
|
WUPS_STORAGE_ERROR_B64_DECODE_FAILED = -9,
|
||||||
WUPS_STORAGE_ERROR_BUFFER_TOO_SMALL = -10,
|
WUPS_STORAGE_ERROR_BUFFER_TOO_SMALL = -10,
|
||||||
WUPS_STORAGE_ERROR_MALLOC_FAILED = -11,
|
WUPS_STORAGE_ERROR_MALLOC_FAILED = -11,
|
||||||
WUPS_STORAGE_ERROR_SUB_ITEM_REALLOC = -12,
|
|
||||||
} WUPSStorageError;
|
} WUPSStorageError;
|
||||||
|
|
||||||
typedef struct wups_storage_item_t_ {
|
typedef struct wups_storage_item_t_ {
|
||||||
|
@ -55,8 +55,6 @@ const char *WUPS_GetStorageStatusStr(WUPSStorageError status) {
|
|||||||
return "WUPS_STORAGE_ERROR_BUFFER_TOO_SMALL";
|
return "WUPS_STORAGE_ERROR_BUFFER_TOO_SMALL";
|
||||||
case WUPS_STORAGE_ERROR_MALLOC_FAILED:
|
case WUPS_STORAGE_ERROR_MALLOC_FAILED:
|
||||||
return "WUPS_STORAGE_ERROR_MALLOC_FAILED";
|
return "WUPS_STORAGE_ERROR_MALLOC_FAILED";
|
||||||
case WUPS_STORAGE_ERROR_SUB_ITEM_REALLOC:
|
|
||||||
return "WUPS_STORAGE_ERROR_SUB_ITEM_REALLOC";
|
|
||||||
}
|
}
|
||||||
return "WUPS_STORAGE_ERROR_UNKNOWN";
|
return "WUPS_STORAGE_ERROR_UNKNOWN";
|
||||||
}
|
}
|
||||||
@ -223,36 +221,21 @@ static wups_storage_item_t *addItem(wups_storage_item_t *parent, const char *key
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!foundItem) {
|
if (!foundItem) {
|
||||||
// Only allow allocation for WUPS_STORAGE_TYPE_ITEM if it's the first item.
|
auto *newPtr = (wups_storage_item_t *) realloc(parent->data, (parent->data_size + 1) * sizeof(wups_storage_item_t));
|
||||||
// The realloc would cause the outPtr of previous WUPS_CreateSubItem call to be invalid.
|
|
||||||
if (parent->data_size > 0 && type == WUPS_STORAGE_TYPE_ITEM) {
|
|
||||||
*error = WUPS_STORAGE_ERROR_SUB_ITEM_REALLOC;
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Increase in step of 8 to avoid realloc calls (at the costs of some memory).
|
|
||||||
constexpr uint32_t INCREASE_SIZE_BY = 8;
|
|
||||||
|
|
||||||
auto *newPtr = (wups_storage_item_t *) realloc(parent->data, (parent->data_size + INCREASE_SIZE_BY) * sizeof(wups_storage_item_t));
|
|
||||||
if (newPtr == nullptr) {
|
if (newPtr == nullptr) {
|
||||||
*error = WUPS_STORAGE_ERROR_MALLOC_FAILED;
|
*error = WUPS_STORAGE_ERROR_MALLOC_FAILED;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
parent->data = newPtr;
|
parent->data = newPtr;
|
||||||
|
|
||||||
for (uint32_t j = parent->data_size; j < INCREASE_SIZE_BY; j++) {
|
|
||||||
auto curItem = &((wups_storage_item_t *) parent->data)[j];
|
|
||||||
memset(curItem, 0, sizeof(wups_storage_item_t));
|
|
||||||
curItem->deleted = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
foundItem = &((wups_storage_item_t *) parent->data)[parent->data_size];
|
foundItem = &((wups_storage_item_t *) parent->data)[parent->data_size];
|
||||||
|
memset(foundItem, 0, sizeof(wups_storage_item_t));
|
||||||
|
foundItem->deleted = true;
|
||||||
|
|
||||||
parent->data_size += INCREASE_SIZE_BY;
|
parent->data_size += 1;
|
||||||
|
|
||||||
foundItem->key = strdup(key);
|
foundItem->key = strdup(key);
|
||||||
if (foundItem->key == nullptr) {
|
if (foundItem->key == nullptr) {
|
||||||
foundItem->deleted = true;
|
|
||||||
*error = WUPS_STORAGE_ERROR_MALLOC_FAILED;
|
*error = WUPS_STORAGE_ERROR_MALLOC_FAILED;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user