private bool DequeueChunk(out string error) { error = null; try { Data.ChunkData chunk = null; lock (ChunkInsertQueue) { try { chunk = ChunkInsertQueue.Dequeue(); } //empty queue catch (InvalidOperationException) { } } if (chunk != null) { lock (chunk) { if (!DAO.Terrain.ChunkData.Insert(chunk) && chunk.DataBaseID <= -1) { lock (ChunkInsertQueue) { //try again later ChunkInsertQueue.Enqueue(chunk); } } else { //atualiza index de base de dados adicionando o novo id var dataBaseHashKey = chunk.DataBaseID.GetHashCode(); var dataBaseChunks = this.ChunksByDataBaseID.GetOrAdd(dataBaseHashKey, new List <Data.ChunkData>()); lock (dataBaseChunks) { dataBaseChunks.Add(chunk); } } } } return(true); } catch (Exception ex) { error = ex.ToString(); return(false); } }
/// <summary> /// Adiciona novo chunk no cache de memoria /// </summary> /// <param name="chunk">Chunk a ser adiciona no cache de memoria</param> /// <returns>Retorna ID na memoria gerado para o chunk ou -1 caso não consiga adicionar o id de memoria do chunk é atualizado no objeto caso tenha sucesso</returns> public long AddChunk(Data.ChunkData chunk) { if (chunk == null) { return(-1); } int maxX = MapLimits.x; int maxZ = MapLimits.z; int maxY = MapLimits.y; if (MapLimits.x < chunk.Position.x) { maxX = chunk.Position.x; } if (MapLimits.y < chunk.Position.y) { maxY = chunk.Position.y; } if (MapLimits.z < chunk.Position.z) { maxZ = chunk.Position.z; } MapLimits = new Vector3i(maxX, maxY, maxZ); int positionHashKey = chunk.Position.GetHashCode(); //busca ou cria index para o hash var positionIndexedChunks = this.PositionIndexedChunks.GetOrAdd(positionHashKey, new List <Data.ChunkData>()); long MemoryID = -1; //incrementa ID lock (LockChunkMemoryIDIncrement) { LastChunkMemoryID++; MemoryID = LastChunkMemoryID; } var hashKey = MemoryID.GetHashCode(); //Tenta adicionar na memoria e no hashIndex var chunks = this.ChunksByMemoryID.GetOrAdd(hashKey, new List <Data.ChunkData>()); lock (chunks) { chunks.Add(chunk); } chunk.MemoryID = MemoryID; lock (positionIndexedChunks) { //adiciona no index positionIndexedChunks.Add(chunk); } if (chunk.DataBaseID <= -1) { lock (ChunkInsertQueue) { ChunkInsertQueue.Enqueue(chunk); } } else { //adiciona no index de base de dados caso ja exista o ID do banco var dataBaseHashKey = chunk.DataBaseID.GetHashCode(); var dataBaseChunks = this.ChunksByDataBaseID.GetOrAdd(dataBaseHashKey, new List <Data.ChunkData>()); lock (dataBaseChunks) { dataBaseChunks.Add(chunk); } } return(MemoryID); }