Example #1
0
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);
  }
Example #2
0
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));
}
Example #3
0
// 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");
}