public async Task <bool> AddAssetAsync(TQuery query, TAsset asset) { LogUsedMemory(); var activeTreeElement = TryRetriveAssetFromTree(query); Preconditions.Assert(activeTreeElement == null, "There arleady is one detailElement of given description: qa: " + query); var newElement = new ReferenceCountedAsset() { Element = asset, ReferenceCount = 1 }; await ClearNonReferencedElements(); if (await ThereIsPlaceForNewAssetAsync(asset)) { await AddElementToActiveTreeAsync(query, newElement); return(true); } else { return(false); } }
private async Task DeleteElementAsync(TQuery queryArea, ReferenceCountedAsset foundElement) { await _entityActionsPerformer.DestroyAsset(foundElement.Element); var removalResult = _activeTree.Remove(queryArea); Preconditions.Assert(removalResult, "Removing failed"); _elementsLength -= await _entityActionsPerformer.CalculateMemoryUsage(foundElement.Element); }
public Task <TAsset> TryRetriveAsync(TQuery queryArea) { LogUsedMemory(); ReferenceCountedAsset foundElement = null; foundElement = TryRetriveAssetFromTree(queryArea); if (foundElement != null) { if (foundElement.ReferenceCount == 0) { var indexInNonReferenced = _nonReferencedElementsList .Select((c, i) => new { Index = i, AssetWithQueryArea = c }).FirstOrDefault(c => c.AssetWithQueryArea.Equals(queryArea)); if (indexInNonReferenced == null) { Debug.Log("In Queue"); foreach (var elem in _nonReferencedElementsList) { Debug.Log("Elem: " + elem); } Debug.Log("We were looking for: " + queryArea); } Preconditions.Assert(indexInNonReferenced != null, " There is no non referenced element's token in queue. "); _nonReferencedElementsList.RemoveAt(indexInNonReferenced.Index); //Debug.Log("T99 Removing element from non referenced List"); } foundElement.ReferenceCount++; return(TaskUtils.MyFromResult(foundElement.Element)); } else { return(null); } }
private async Task AddElementToActiveTreeAsync(TQuery queryArea, ReferenceCountedAsset newElement) { _activeTree[queryArea] = newElement; _elementsLength += await _entityActionsPerformer.CalculateMemoryUsage(newElement.Element); }