需改内容 | 解释 | |
文件名称 | 添加内容(增加红色字体) | |
tcp.h | /* the TCP protocol control block */ struct tcp_pcb { /** common PCB members */ IP_PCB; /** protocol specific PCB members */ TCP_PCB_COMMON(struct tcp_pcb); ..............................省略...................................... /* KEEPALIVE counter */ u8_t keep_cnt_sent; u8_t pcb_used; }; | 在struct tcp_pcb 结构体中增加一个字段,pcb_used。这个字段值 = 0 或 = 1。 0代表这个TCP_PCB块没有在使用,已经释放。 1代表这个TCP_PCB块正在使用,占用内存。 |
memp.c | void memp_free(memp_t type, void *mem) { struct memp *memp; struct tcp_pcb *pcb; if(type == MEMP_TCP_PCB ){ pcb = (struct tcp_pcb *)mem; if(pcb->pcb_used == 0){ return; } pcb->pcb_used = 0; } SYS_ARCH_DECL_PROTECT(old_level); ..............................省略...................................... SYS_ARCH_UNPROTECT(old_level); } | 在释放TCP_PCB块的时候,如果pcb_used==0,那么这个TCP_PCB块已经释放过了,可能是没连接的块系统自己释放,也能是自己误操作,多次释放。总之,不管什么原因,已经释放过的不能再释放了,所有这边直接return退出。没有释放的正常释放,只是字段pcb_used置0。 |
tcp.c | struct tcp_pcb * tcp_alloc(u8_t prio) { struct tcp_pcb *pcb; u32_t iss; pcb = memp_malloc(MEMP_TCP_PCB); if (pcb == NULL) { ..............................省略...................................... } if (pcb != NULL) { memset(pcb, 0, sizeof(struct tcp_pcb)); ..............................省略...................................... pcb->keep_cnt_sent = 0; pcb->pcb_used = 1; } return pcb; } | 在申请TCP_PCB块的时候,把pcb_used置1,标记这个块目前正在使用,占用内存。 |
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |