diff options
Diffstat (limited to 'drivers/gpu/pvr/hash.c')
-rw-r--r-- | drivers/gpu/pvr/hash.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/drivers/gpu/pvr/hash.c b/drivers/gpu/pvr/hash.c index 32b0779d456..488bf1b20e6 100644 --- a/drivers/gpu/pvr/hash.c +++ b/drivers/gpu/pvr/hash.c | |||
@@ -80,7 +80,7 @@ IMG_UINT32 | |||
80 | HASH_Func_Default (IMG_SIZE_T uKeySize, IMG_VOID *pKey, IMG_UINT32 uHashTabLen) | 80 | HASH_Func_Default (IMG_SIZE_T uKeySize, IMG_VOID *pKey, IMG_UINT32 uHashTabLen) |
81 | { | 81 | { |
82 | IMG_UINTPTR_T *p = (IMG_UINTPTR_T *)pKey; | 82 | IMG_UINTPTR_T *p = (IMG_UINTPTR_T *)pKey; |
83 | IMG_UINT32 uKeyLen = uKeySize / sizeof(IMG_UINTPTR_T); | 83 | IMG_UINT32 uKeyLen = (IMG_UINT32)(uKeySize / sizeof(IMG_UINTPTR_T)); |
84 | IMG_UINT32 ui; | 84 | IMG_UINT32 ui; |
85 | IMG_UINT32 uHashKey = 0; | 85 | IMG_UINT32 uHashKey = 0; |
86 | 86 | ||
@@ -112,7 +112,7 @@ HASH_Key_Comp_Default (IMG_SIZE_T uKeySize, IMG_VOID *pKey1, IMG_VOID *pKey2) | |||
112 | { | 112 | { |
113 | IMG_UINTPTR_T *p1 = (IMG_UINTPTR_T *)pKey1; | 113 | IMG_UINTPTR_T *p1 = (IMG_UINTPTR_T *)pKey1; |
114 | IMG_UINTPTR_T *p2 = (IMG_UINTPTR_T *)pKey2; | 114 | IMG_UINTPTR_T *p2 = (IMG_UINTPTR_T *)pKey2; |
115 | IMG_UINT32 uKeyLen = uKeySize / sizeof(IMG_UINTPTR_T); | 115 | IMG_UINT32 uKeyLen = (IMG_UINT32)(uKeySize / sizeof(IMG_UINTPTR_T)); |
116 | IMG_UINT32 ui; | 116 | IMG_UINT32 ui; |
117 | 117 | ||
118 | PVR_ASSERT((uKeySize % sizeof(IMG_UINTPTR_T)) == 0); | 118 | PVR_ASSERT((uKeySize % sizeof(IMG_UINTPTR_T)) == 0); |
@@ -228,7 +228,7 @@ HASH_TABLE * HASH_Create_Extended (IMG_UINT32 uInitialLen, IMG_SIZE_T uKeySize, | |||
228 | pHash->uCount = 0; | 228 | pHash->uCount = 0; |
229 | pHash->uSize = uInitialLen; | 229 | pHash->uSize = uInitialLen; |
230 | pHash->uMinimumSize = uInitialLen; | 230 | pHash->uMinimumSize = uInitialLen; |
231 | pHash->uKeySize = uKeySize; | 231 | pHash->uKeySize = (IMG_UINT32)uKeySize; |
232 | pHash->pfnHashFunc = pfnHashFunc; | 232 | pHash->pfnHashFunc = pfnHashFunc; |
233 | pHash->pfnKeyComp = pfnKeyComp; | 233 | pHash->pfnKeyComp = pfnKeyComp; |
234 | 234 | ||
@@ -305,6 +305,9 @@ HASH_Insert_Extended (HASH_TABLE *pHash, IMG_VOID *pKey, IMG_UINTPTR_T v) | |||
305 | OSMemCopy(pBucket->k, pKey, pHash->uKeySize); | 305 | OSMemCopy(pBucket->k, pKey, pHash->uKeySize); |
306 | if (_ChainInsert (pHash, pBucket, pHash->ppBucketTable, pHash->uSize) != PVRSRV_OK) | 306 | if (_ChainInsert (pHash, pBucket, pHash->ppBucketTable, pHash->uSize) != PVRSRV_OK) |
307 | { | 307 | { |
308 | OSFreeMem(PVRSRV_PAGEABLE_SELECT, | ||
309 | sizeof(BUCKET) + pHash->uKeySize, | ||
310 | pBucket, IMG_NULL); | ||
308 | return IMG_FALSE; | 311 | return IMG_FALSE; |
309 | } | 312 | } |
310 | 313 | ||
@@ -444,6 +447,31 @@ HASH_Retrieve (HASH_TABLE *pHash, IMG_UINTPTR_T k) | |||
444 | return HASH_Retrieve_Extended(pHash, &k); | 447 | return HASH_Retrieve_Extended(pHash, &k); |
445 | } | 448 | } |
446 | 449 | ||
450 | PVRSRV_ERROR | ||
451 | HASH_Iterate(HASH_TABLE *pHash, HASH_pfnCallback pfnCallback) | ||
452 | { | ||
453 | IMG_UINT32 uIndex; | ||
454 | for (uIndex=0; uIndex < pHash->uSize; uIndex++) | ||
455 | { | ||
456 | BUCKET *pBucket; | ||
457 | pBucket = pHash->ppBucketTable[uIndex]; | ||
458 | while (pBucket != IMG_NULL) | ||
459 | { | ||
460 | PVRSRV_ERROR eError; | ||
461 | BUCKET *pNextBucket = pBucket->pNext; | ||
462 | |||
463 | eError = pfnCallback((IMG_UINTPTR_T) ((IMG_VOID *) *(pBucket->k)), (IMG_UINTPTR_T) pBucket->v); | ||
464 | |||
465 | |||
466 | if (eError != PVRSRV_OK) | ||
467 | return eError; | ||
468 | |||
469 | pBucket = pNextBucket; | ||
470 | } | ||
471 | } | ||
472 | return PVRSRV_OK; | ||
473 | } | ||
474 | |||
447 | #ifdef HASH_TRACE | 475 | #ifdef HASH_TRACE |
448 | IMG_VOID | 476 | IMG_VOID |
449 | HASH_Dump (HASH_TABLE *pHash) | 477 | HASH_Dump (HASH_TABLE *pHash) |