/* ============================================================================= * TMhashtable_remove * -- Returns TRUE if successful, else FALSE * ============================================================================= */ bool_t TMhashtable_remove (TM_ARGDECL hashtable_t* hashtablePtr, void* keyPtr) { long numBucket = hashtablePtr->numBucket; long i = hashtablePtr->hash(keyPtr) % numBucket; list_t* chainPtr = hashtablePtr->buckets[i]; pair_t* pairPtr; pair_t removePair; removePair.firstPtr = keyPtr; pairPtr = (pair_t*)TMLIST_FIND(chainPtr, &removePair); if (pairPtr == NULL) { return FALSE; } bool_t status = TMLIST_REMOVE(chainPtr, &removePair); assert(status); TMPAIR_FREE(pairPtr); #ifdef HASHTABLE_SIZE_FIELD TM_SHARED_WRITE(hashtablePtr->size (long)TM_SHARED_READ(hashtablePtr->size)-1); assert(hashtablePtr->size >= 0); #endif return TRUE; }
/* ============================================================================= * TMhashtable_insert * ============================================================================= */ bool_t TMhashtable_insert (TM_ARGDECL hashtable_t* hashtablePtr, void* keyPtr, void* dataPtr) { long numBucket = hashtablePtr->numBucket; long i = hashtablePtr->hash(keyPtr) % numBucket; pair_t findPair; findPair.firstPtr = keyPtr; pair_t* pairPtr = (pair_t*)TMLIST_FIND(hashtablePtr->buckets[i], &findPair); if (pairPtr != NULL) { return FALSE; } pair_t* insertPtr = TMPAIR_ALLOC(keyPtr, dataPtr); if (insertPtr == NULL) { return FALSE; } /* Add new entry */ if (TMLIST_INSERT(hashtablePtr->buckets[i], insertPtr) == FALSE) { TMPAIR_FREE(insertPtr); return FALSE; } #ifdef HASHTABLE_SIZE_FIELD long newSize = TM_SHARED_READ(hashtablePtr->size) + 1; assert(newSize > 0); TM_SHARED_WRITE(hashtablePtr->size, newSize); #endif return TRUE; }
/* ============================================================================= * customer_removeReservationInfo * -- Returns TRUE if success, else FALSE * ============================================================================= */ bool_t customer_removeReservationInfo (TM_ARGDECL customer_t* customerPtr, reservation_type_t type, long id) { reservation_info_t findReservationInfo; findReservationInfo.type = type; findReservationInfo.id = id; /* price not used to compare reservation infos */ list_t* reservationInfoListPtr = (list_t*)TM_SHARED_READ_P(customerPtr->reservationInfoListPtr); reservation_info_t* reservationInfoPtr = (reservation_info_t*)TMLIST_FIND(reservationInfoListPtr, &findReservationInfo); if (reservationInfoPtr == NULL) { return FALSE; } bool_t status = TMLIST_REMOVE(reservationInfoListPtr, (void*)&findReservationInfo); if (status == FALSE) { TM_RESTART(); } RESERVATION_INFO_FREE(reservationInfoPtr); return TRUE; }
/* ============================================================================= * customer_removeReservationInfo * -- Returns TRUE if success, else FALSE * ============================================================================= */ __attribute__((transaction_safe)) bool_t customer_removeReservationInfo ( customer_t* customerPtr, reservation_type_t type, long id) { reservation_info_t findReservationInfo; findReservationInfo.type = type; findReservationInfo.id = id; /* price not used to compare reservation infos */ list_t* reservationInfoListPtr = customerPtr->reservationInfoListPtr; reservation_info_t* reservationInfoPtr = (reservation_info_t*)TMLIST_FIND(reservationInfoListPtr, &findReservationInfo); if (reservationInfoPtr == NULL) { return FALSE; } TMLIST_REMOVE(reservationInfoListPtr,(void*)&findReservationInfo); RESERVATION_INFO_FREE(reservationInfoPtr); return TRUE; }
/* ============================================================================= * TMhashtable_containsKey * ============================================================================= */ bool_t TMhashtable_containsKey (TM_ARGDECL hashtable_t* hashtablePtr, void* keyPtr) { long i = hashtablePtr->hash(keyPtr) % hashtablePtr->numBucket; pair_t* pairPtr; pair_t findPair; findPair.firstPtr = keyPtr; pairPtr = (pair_t*)TMLIST_FIND(hashtablePtr->buckets[i], &findPair); return ((pairPtr != NULL) ? TRUE : FALSE); }
/* ============================================================================= * TMhashtable_find * -- Returns NULL on failure, else pointer to data associated with key * ============================================================================= */ void* TMhashtable_find (TM_ARGDECL hashtable_t* hashtablePtr, void* keyPtr) { long i = hashtablePtr->hash(keyPtr) % hashtablePtr->numBucket; pair_t* pairPtr; pair_t findPair; findPair.firstPtr = keyPtr; pairPtr = (pair_t*)TMLIST_FIND(hashtablePtr->buckets[i], &findPair); if (pairPtr == NULL) { return NULL; } return pairPtr->secondPtr; }