From 7f837fb2fa75786e87ad04ada9a6787bd6436a6a Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 4 Feb 2019 12:39:17 +0100 Subject: [PATCH] Avoid duplicate tree lookup in GetCollatorFromSortHandle --- .../System.Globalization.Native/pal_collation.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/corefx/System.Globalization.Native/pal_collation.c b/src/corefx/System.Globalization.Native/pal_collation.c index a0ce96d1fd4b..a8c94cfb71fa 100644 --- a/src/corefx/System.Globalization.Native/pal_collation.c +++ b/src/corefx/System.Globalization.Native/pal_collation.c @@ -42,9 +42,8 @@ typedef struct { int32_t key; UCollator* UCollator; } TCollatorMap; struct SortHandle { UCollator* regular; - TCollatorMap* collatorsPerOption; pthread_mutex_t collatorsLockObject; - void* pRoot; + void* collatorsPerOptionRoot; }; typedef struct { UChar* items; size_t capacity; size_t size; } UCharList; @@ -372,7 +371,7 @@ void CreateSortHandle(SortHandle** ppSortHandle) return; } - (*ppSortHandle)->pRoot = NULL; + (*ppSortHandle)->collatorsPerOptionRoot = NULL; int result = pthread_mutex_init(&(*ppSortHandle)->collatorsLockObject, NULL); if (result != 0) @@ -410,10 +409,10 @@ void GlobalizationNative_CloseSortHandle(SortHandle* pSortHandle) ucol_close(pSortHandle->regular); pSortHandle->regular = NULL; - while (pSortHandle->pRoot != NULL) + while (pSortHandle->collatorsPerOptionRoot != NULL) { - TCollatorMap* data = *(TCollatorMap **)pSortHandle->pRoot; - tdelete(data, &pSortHandle->pRoot, TreeComparer); + TCollatorMap* data = *(TCollatorMap **)pSortHandle->collatorsPerOptionRoot; + tdelete(data, &pSortHandle->collatorsPerOptionRoot, TreeComparer); ucol_close(data->UCollator); free(data); } @@ -440,12 +439,11 @@ const UCollator* GetCollatorFromSortHandle(SortHandle* pSortHandle, int32_t opti TCollatorMap* map = (TCollatorMap*)malloc(sizeof(TCollatorMap)); map->key = options; - void* entry = tfind(map, &pSortHandle->pRoot, TreeComparer); - if (entry == NULL) + void* entry = tsearch(map, &pSortHandle->collatorsPerOptionRoot, TreeComparer); + if ((*(TCollatorMap**)entry) == map) { pCollator = CloneCollatorWithOptions(pSortHandle->regular, options, pErr); map->UCollator = pCollator; - tsearch(map, &pSortHandle->pRoot, TreeComparer); } else {