/* User defined transfer function. */ static status_t SDIF_TransferFunction(SDIF_Type *base, sdif_transfer_t *content) { status_t error = kStatus_Success; sdif_dma_config_t dmaConfig; memset(g_sdifDmaTable, 0, sizeof(g_sdifDmaTable)); memset(&dmaConfig, 0, sizeof(dmaConfig)); /* user DMA mode transfer data */ if (content->data != NULL) { dmaConfig.enableFixBurstLen = false; dmaConfig.mode = kSDIF_DualDMAMode; dmaConfig.dmaDesBufferStartAddr = g_sdifDmaTable; dmaConfig.dmaDesBufferLen = SDIF_DMA_TABLE_WORDS; dmaConfig.dmaDesSkipLen = 0U; } do { error = SDIF_TransferNonBlocking(base, &g_sdifHandle, &dmaConfig, content); } while (error == kStatus_SDIF_SyncCmdTimeout); if ((error != kStatus_Success) || (false == EVENT_Wait(kEVENT_TransferComplete, EVENT_TIMEOUT_TRANSFER_COMPLETE)) || (!g_sdifTransferSuccessFlag)) { error = kStatus_Fail; } EVENT_Delete(kEVENT_TransferComplete); return error; }
/** * Deallocates the system resources used by the lock. */ void RWLOCK_Destroy(RWLock * lock) { QEntry * e; ASSERT(!lock->locks); ASSERT(!lock->entriesInUse); ASSERT(!lock->entriesActive); ASSERT(!lock->shareWaiters.size); ASSERT(!lock->exclusiveWaiters.size); MUTEX_Destroy(&lock->mutex); EVENT_Destroy(&lock->shareEvent); EVENT_Destroy(&lock->exclusiveEvent); /* free dynamically allocated entries */ if (lock->moreEntries) { MEM_Free(lock->moreEntries); lock->moreEntries = NULL; } /* free waiter cache */ while ((e = QUEUE_RemoveHead(&lock->waiterCache)) != NULL) { RWLockWaiter * w = QCAST(e,RWLockWaiter,entry); MEM_Free(w); } /* free dynamically allocated events */ while (lock->eventsInCache > 0) { lock->eventsInCache--; ASSERT(lock->eventCache[lock->eventsInCache]); EVENT_Delete(lock->eventCache[lock->eventsInCache]); lock->eventCache[lock->eventsInCache] = NULL; } lock->numEntries = 0; lock->locks = -1; /* to cause ASSERT if destroyed twice */ }
/** * Returns event to the cache or deallocates it if the cache is full. * Must be called under synchronization */ STATIC void RWLOCK_ReleaseExclusiveEvent(RWLock * lock, Event * e) { ASSERT(e); ASSERT(e != &lock->exclusiveEvent); if (lock->eventsInCache < COUNT(lock->eventCache)) { lock->eventCache[lock->eventsInCache++] = e; } else { EVENT_Delete(e); } }