需改內容 | 解釋 | |
文件名稱 | 添加內容(增加紅色字體) | |
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.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |