globle void *genalloc( void *theEnv, size_t size) { char *memPtr; #if BLOCK_MEMORY memPtr = (char *) RequestChunk(theEnv,size); if (memPtr == NULL) { EnvReleaseMem(theEnv,(long) ((size * 5 > 4096) ? size * 5 : 4096),FALSE); memPtr = (char *) RequestChunk(theEnv,size); if (memPtr == NULL) { EnvReleaseMem(theEnv,-1L,TRUE); memPtr = (char *) RequestChunk(theEnv,size); while (memPtr == NULL) { if ((*MemoryData(theEnv)->OutOfMemoryFunction)(theEnv,(unsigned long) size)) return(NULL); memPtr = (char *) RequestChunk(theEnv,size); } } } #else memPtr = (char *) malloc(size); if (memPtr == NULL) { EnvReleaseMem(theEnv,(long) ((size * 5 > 4096) ? size * 5 : 4096),FALSE); memPtr = (char *) malloc(size); if (memPtr == NULL) { EnvReleaseMem(theEnv,-1L,TRUE); memPtr = (char *) malloc(size); while (memPtr == NULL) { if ((*MemoryData(theEnv)->OutOfMemoryFunction)(theEnv,size)) return(NULL); memPtr = (char *) malloc(size); } } } #endif MemoryData(theEnv)->MemoryAmount += (long) size; MemoryData(theEnv)->MemoryCalls++; return((void *) memPtr); }
void Terrain::HandleRequests(Vector3 Pos) { Vector3 CurrentChunk; CurrentChunk.X = floor(Pos.X / ChunkSize); CurrentChunk.Y = floor(Pos.Y / ChunkSize); CurrentChunk.Z = floor(Pos.Z / ChunkSize); // TODO: lol. RequestChunk(CurrentChunk); RequestChunk(CurrentChunk + Vector3(-1, 0, 0)); RequestChunk(CurrentChunk + Vector3(-1, -1, 0)); RequestChunk(CurrentChunk + Vector3( 0, -1, 0)); RequestChunk(CurrentChunk + Vector3( 1, -1, 0)); RequestChunk(CurrentChunk + Vector3( 1, 0, 0)); RequestChunk(CurrentChunk + Vector3( 1, 1, 0)); RequestChunk(CurrentChunk + Vector3( 0, 1, 0)); RequestChunk(CurrentChunk + Vector3(-1, 1, 0)); RequestChunk(CurrentChunk + Vector3( 0, 0, 1)); RequestChunk(CurrentChunk + Vector3(-1, 0, 1)); RequestChunk(CurrentChunk + Vector3(-1, -1, 1)); RequestChunk(CurrentChunk + Vector3( 0, -1, 1)); RequestChunk(CurrentChunk + Vector3( 1, -1, 1)); RequestChunk(CurrentChunk + Vector3( 1, 0, 1)); RequestChunk(CurrentChunk + Vector3( 1, 1, 1)); RequestChunk(CurrentChunk + Vector3( 0, 1, 1)); RequestChunk(CurrentChunk + Vector3(-1, 1, 1)); RequestChunk(CurrentChunk + Vector3( 0, 0, -1)); RequestChunk(CurrentChunk + Vector3(-1, 0, -1)); RequestChunk(CurrentChunk + Vector3(-1, -1, -1)); RequestChunk(CurrentChunk + Vector3( 0, -1, -1)); RequestChunk(CurrentChunk + Vector3( 1, -1, -1)); RequestChunk(CurrentChunk + Vector3( 1, 0, -1)); RequestChunk(CurrentChunk + Vector3( 1, 1, -1)); RequestChunk(CurrentChunk + Vector3( 0, 1, -1)); RequestChunk(CurrentChunk + Vector3(-1, 1, -1)); }
// Private Methods void MhProtoClient::DownloadFileFromServer( int cd_sd, const char *metaFile, const char *localFile) { unsigned char *rcv_buffer = NULL; unsigned char rcv_md5sum[16]; int64_t rcv_dataSize; MD5Utils md5Utils; rcv_buffer = static_cast<unsigned char*>(malloc(MAX_CHUNK_SIZE)); SndCmd(cd_sd, DOWNLOAD_CHUNK); metadata_.LoadMetadata(metaFile); metadata_.WriteMetadataHeader(cd_sd); int fd_download = open(localFile , O_WRONLY | O_CREAT , 0000644); if (fd_download == -1) { perror("open download file "); exit(1); } int64_t chunkNumber = -1; int br = 0; bool sock_error = false; off_t filePos; do { DEBUG("Before lock : %ld - \033[1m\033[32m%d\033[0m\n", i64toLong(chunkNumber), getpid()); sem_->semaphore_get_lock(); metadata_.LoadMetadata(metaFile); chunkNumber = metadata_.getNextPendingChunk(); if (chunkNumber == -1) { sem_->semaphore_release_lock(); break; } metadata_.setChunkStatus(chunkNumber, CH_DOWNLOAD, NULL); metadata_.UpdateControlData(metaFile); DEBUG("Next Pending Chunk : %ld\n", i64toLong(chunkNumber)); sem_->semaphore_release_lock(); // Receive chunk RequestChunk(cd_sd, chunkNumber); DEBUG("Next Pending Chunk-v : %ld\n", i64toLong(chunkNumber)); br = so_read(cd_sd, rcv_md5sum, DIGEST_SIZE); DEBUG("MD5 : <%s>\n", md5Utils.digestToStr(rcv_md5sum)); if (br != DIGEST_SIZE) { sock_error = true; goto update; } br = so_read(cd_sd, (unsigned char*)&rcv_dataSize, sizeof(int64_t)); DEBUG("Data Size : %ld\n", i64toLong(rcv_dataSize)); if (br != sizeof(int64_t)) { sock_error = true; goto update; } br = so_read(cd_sd, rcv_buffer, rcv_dataSize); if (br != rcv_dataSize) { sock_error = true; goto update; } // hex_dump((char*)rcv_buffer,200); filePos = (chunkNumber*metadata_.getChunkSize()); lseek(fd_download, filePos, SEEK_SET); write(fd_download, rcv_buffer, rcv_dataSize); update: sem_->semaphore_get_lock(); metadata_.LoadMetadata(metaFile); if (sock_error) { metadata_.setChunkStatus(chunkNumber, CH_ERROR, rcv_md5sum); chunkNumber = -1; } else { metadata_.setChunkStatus(chunkNumber, CH_OK, rcv_md5sum); } metadata_.UpdateControlData(metaFile); sem_->semaphore_release_lock(); } while (chunkNumber != -1 && *kill_proc_ == 0); close(fd_download); if (rcv_buffer != NULL) free(rcv_buffer); DEBUG("Process: no more chunks to download.\n"); }