事项:跨平台libc

  • g3_446013
    了解作者
  • 12.4KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-06-05 05:48
    上传日期
事项:跨平台libc
matter-master.zip
内容介绍
#ifndef _MALLOC_MALLOC_C_ #define _MALLOC_MALLOC_C_ #include <malloc.h> #include <string.h> #include <unistd.h> // Implementation copied from https://danluu.com/malloc-tutorial/ struct block_meta { size_t size; struct block_meta *next; int free; }; #define META_SIZE sizeof(struct block_meta) void *global_base = NULL; struct block_meta *find_free_block(struct block_meta **last, size_t size) { struct block_meta *current = global_base; while (current && !(current->free && current->size >= size)) { *last = current; current = current->next; } return current; } struct block_meta *request_space(struct block_meta* last, size_t size) { struct block_meta *block; block = sbrk(0); void *request = sbrk(size + META_SIZE); // assert((void*)block == request); // Not thread safe. if (request == (void*) -1) { return NULL; // sbrk failed. } if (last) { // NULL on first request. last->next = block; } block->size = size; block->next = NULL; block->free = 0; return block; } void *malloc(size_t size) { struct block_meta *block; // TODO: align size? if (size <= 0) { return NULL; } if (!global_base) { // First call. block = request_space(NULL, size); if (!block) { return NULL; } global_base = block; } else { struct block_meta *last = global_base; block = find_free_block(&last, size); if (!block) { // Failed to find free block. block = request_space(last, size); if (!block) { return NULL; } } else { // Found free block // TODO: consider splitting block here. block->free = 0; } } return(block+1); } struct block_meta *get_block_ptr(void *ptr) { return (struct block_meta*)ptr - 1; } void free(void *ptr) { if (!ptr) { return; } // TODO: consider merging blocks once splitting blocks is implemented. struct block_meta* block_ptr = get_block_ptr(ptr); // assert(block_ptr->free == 0); block_ptr->free = 1; } void *realloc(void *ptr, size_t size) { if (!ptr) { // NULL ptr. realloc should act like malloc. return malloc(size); } struct block_meta* block_ptr = get_block_ptr(ptr); if (block_ptr->size >= size) { // We have enough space. Could free some once we implement split. return ptr; } // Need to really realloc. Malloc new space and free old space. // Then copy old data to new space. void *new_ptr; new_ptr = malloc(size); if (!new_ptr) { return NULL; // TODO: set errno on failure. } memcpy(new_ptr, ptr, block_ptr->size); free(ptr); return new_ptr; } void *calloc(size_t nelem, size_t elsize) { size_t size = nelem * elsize; // TODO: check for overflow. void *ptr = malloc(size); memset(ptr, 0, size); return ptr; } #endif // _MALLOC_MALLOC_C_
评论
    相关推荐
    • dbg跨平台诊断工具
      dbg是一款跨平台诊断和调试工具,支持MingGw等编译器。在程序崩溃的情况下可以打印出dump文件
    • 跨平台工具的cmake
      跨平台工具的cmake
    • 跨平台
      公司业务平台 满足您在业务十字路口的成功 技术运用 WEB API 休息 储存库模式 依赖注入 实体框架 数据传输对象(DTO) 自动贴图 中介 二手包装 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore....
    • 跨平台实时写日志
      1、日志文件大小、个数自定义; 2、自动创建相对与绝对路径; 3、实时写文件,方便查看; 4、跨平台VS2008、gcc-5.4下警告级别最高,没有任何警告。
    • 跨平台的播放器
      跨平台的播放器跨平台的播放器跨平台的播放器
    • 跨平台账户管理
      实现不同账户之间的切换管理,跟单一键平仓,止盈和止损。
    • 跨平台WEB播放器
      一个跨平台的播放器,支持RTMP,HLS,MP4的直播和点播
    • 跨平台故事讲述
      跨平台故事讲述
    • 重新思考跨平台
      重新思考跨平台
    • GaussDB_100_1.0.1-DATABASE-REDHAT-64bit.tar.gz
      guassdb100在redhat上安装包,单机部署的包,安装步骤请看我的文中介绍,经过大量实验搭建总结出来的文档