Exemple #1
0
void* mem_realloc(void *p, size_t size, const char *source, uint line, uint id)
{
    ASSERT(g_mem);

    void* ptr;
    if (g_mem->trace)     {
        mt_mutex_lock(&g_mem->lock);
        if (g_mem->stats.limit_bytes != 0 &&
            (size + g_mem->stats.alloc_bytes) > g_mem->stats.limit_bytes)
        {
            return NULL;
        }

        ptr = mem_realloc_withtrace(p, size);
        if (ptr != NULL)    {
            struct mem_trace_data* trace = get_trace_data(ptr);
#if defined(_DEBUG_)
            path_getfullfilename(trace->filename, source);
            trace->line = line;
#endif
            trace->size = size;
            trace->mem_id = id;

            mem_addto_ids(id, size);
        }
        mt_mutex_unlock(&g_mem->lock);
    }	else	{
        ptr = malloc_withsize(size);
    }
    return ptr;
}
Exemple #2
0
void load_pak(struct paki_args* args)
{
    result_t r;
    struct pak_file pak;
    char filename[DH_PATH_MAX];

    path_norm(args->pakfile, args->pakfile);
    path_tounix(args->path, args->path);

    r = pak_open(&pak, mem_heap(), args->pakfile, 0);
    if (IS_FAIL(r))     {
        err_sendtolog(FALSE);
        return;
    }

    uint file_id = pak_findfile(&pak, args->path);
    if (file_id == INVALID_INDEX)   {
        printf(TERM_BOLDRED "Extract failed: file '%s' not found in pak.\n" TERM_RESET, args->path);
        pak_close(&pak);
        return;
    }

    path_getfullfilename(filename, args->path);
    file_t f = fio_createdisk(filename);
    if (f == NULL)     {
        printf(TERM_BOLDRED "Extract failed: could not create '%s' for writing.\n" TERM_RESET,
               filename);
        pak_close(&pak);
        err_sendtolog(FALSE);
        return;
    }

    file_t src_file = pak_getfile(&pak, mem_heap(), mem_heap(), file_id, 0);
    if (src_file == NULL)   {
        pak_close(&pak);
        fio_close(f);
        err_sendtolog(FALSE);
        return;
    }

    size_t size;
    struct allocator* alloc;
    void* buffer = fio_detachmem(src_file, &size, &alloc);
    fio_write(f, buffer, size, 1);
    A_FREE(alloc, buffer);
    fio_close(f);

    pak_close(&pak);

    if (BIT_CHECK(args->usage, PAKI_USAGE_VERBOSE)) {
        printf(TERM_WHITE "%s -> %s\n" TERM_RESET, args->path, filename);
    }
    args->file_cnt ++;

    // report
    printf(TERM_BOLDWHITE "Finished: total %d file(s) - %d error(s), %d warning(s)\n" TERM_RESET,
           args->file_cnt, args->err_cnt, args->warn_cnt);
}