Author: zhu Date: Thu Jul 14 16:40:43 2016 New Revision: 71943
URL: http://svn.reactos.org/svn/reactos?rev=71943&view=rev Log: Added global static lists to keep track of memory allocations for debugging purposes.
Modified: branches/GSoC_2016/lwIP-tcpip/drivers/network/tcpip/address.c
Modified: branches/GSoC_2016/lwIP-tcpip/drivers/network/tcpip/address.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2016/lwIP-tcpip/drivers/net... ============================================================================== --- branches/GSoC_2016/lwIP-tcpip/drivers/network/tcpip/address.c [iso-8859-1] (original) +++ branches/GSoC_2016/lwIP-tcpip/drivers/network/tcpip/address.c [iso-8859-1] Thu Jul 14 16:40:43 2016 @@ -18,6 +18,9 @@ PADDRESS_FILE AddrFileList[128]; PTCP_CONTEXT ContextList[128];
+KSPIN_LOCK PCBListLock; +KSPIN_LOCK AddrFileListLock; +KSPIN_LOCK ContextListLock;
typedef struct { @@ -101,6 +104,7 @@ PLIST_ENTRY Entry; PTCP_REQUEST Request; KIRQL OldIrql; + int i; IoReleaseCancelSpinLock(Irp->CancelIrql); @@ -141,8 +145,19 @@ } tcp_arg(Context->lwip_tcp_pcb, NULL); tcp_abort(Context->lwip_tcp_pcb); - InterlockedDecrement(&PcbCount); - DPRINT1("\n PCB Count: %d\n", PcbCount); + KeAcquireSpinLockAtDpcLevel(&PCBListLock); + DPRINT1("Deleting PCB at %p\n", Context->lwip_tcp_pcb); + for (i=0; i<PcbCount; i++) { + if (PCBList[i] == Context->lwip_tcp_pcb) { + PCBList[i] = PCBList[i+1]; + PCBList[i+1] = NULL; + } else if (PCBList[i] == NULL) { + PCBList[i] = PCBList[i+1]; + PCBList[i+1] = NULL; + } + } + PcbCount--; + KeReleaseSpinLockFromDpcLevel(&PCBListLock); Context->lwip_tcp_pcb = NULL; RemoveEntryList(Entry); @@ -160,8 +175,19 @@ AddressFile->lwip_tcp_pcb = NULL; } tcp_close(Context->lwip_tcp_pcb); - InterlockedDecrement(&PcbCount); - DPRINT1("\n PCB Count: %d\n", PcbCount); + KeAcquireSpinLockAtDpcLevel(&PCBListLock); + DPRINT1("Deleting PCB at %p\n", Context->lwip_tcp_pcb); + for (i=0; i<PcbCount; i++) { + if (PCBList[i] == Context->lwip_tcp_pcb) { + PCBList[i] = PCBList[i+1]; + PCBList[i+1] = NULL; + } else if (PCBList[i] == NULL) { + PCBList[i] = PCBList[i+1]; + PCBList[i+1] = NULL; + } + } + PcbCount--; + KeReleaseSpinLockFromDpcLevel(&PCBListLock); Context->lwip_tcp_pcb = NULL; RemoveEntryList(Entry); @@ -210,6 +236,10 @@ RtlZeroMemory(PCBList, sizeof(PCBList)); RtlZeroMemory(AddrFileList, sizeof(AddrFileList)); RtlZeroMemory(ContextList, sizeof(ContextList)); + + KeInitializeSpinLock(&PCBListLock); + KeInitializeSpinLock(&AddrFileListLock); + KeInitializeSpinLock(&ContextListLock); }
static @@ -239,6 +269,7 @@ PIO_STACK_LOCATION IrpSp; NTSTATUS Status; + int i; switch (err) { @@ -314,8 +345,19 @@ { tcp_arg(Context->lwip_tcp_pcb, NULL); tcp_abort(Context->lwip_tcp_pcb); - InterlockedDecrement(&PcbCount); - DPRINT1("\n PCB Count\n", PcbCount); + KeAcquireSpinLockAtDpcLevel(&PCBListLock); + DPRINT1("Deleting PCB at %p\n", Context->lwip_tcp_pcb); + for (i=0; i<PcbCount; i++) { + if (PCBList[i] == Context->lwip_tcp_pcb) { + PCBList[i] = PCBList[i+1]; + PCBList[i+1] = NULL; + } else if (PCBList[i] == NULL) { + PCBList[i] = PCBList[i+1]; + PCBList[i+1] = NULL; + } + } + PcbCount--; + KeReleaseSpinLockFromDpcLevel(&PCBListLock); } Context->lwip_tcp_pcb = NULL; @@ -495,7 +537,10 @@ Context->lwip_tcp_pcb = newpcb; tcp_err(Context->lwip_tcp_pcb, lwip_tcp_err_callback); - InterlockedIncrement(&PcbCount); + KeAcquireSpinLockAtDpcLevel(&PCBListLock); + PCBList[PcbCount] = newpcb; + PcbCount++; + KeReleaseSpinLockFromDpcLevel(&PCBListLock); DPRINT1("\n PCB Count: %d\n", PcbCount); Context->TcpState = TCP_STATE_ACCEPTED; tcp_accepted(AddressFile->lwip_tcp_pcb); @@ -679,6 +724,7 @@ PLIST_ENTRY Entry; NTSTATUS Status; err_t lwip_err; + int i; /* This error is currently unimplemented in lwIP */ /* if (err != ERR_OK) @@ -728,8 +774,19 @@ DPRINT1("Receive tcp_pcb mismatch\nAborting PCB at %p\n", tpcb); tcp_arg(tpcb, NULL); tcp_abort(tpcb); - InterlockedDecrement(&PcbCount); - DPRINT1("\n PCB Count\n", PcbCount); + KeAcquireSpinLockAtDpcLevel(&PCBListLock); + DPRINT1("Deleting PCB at %p\n", tpcb); + for (i=0; i<PcbCount; i++) { + if (PCBList[i] == tpcb) { + PCBList[i] = PCBList[i+1]; + PCBList[i+1] = NULL; + } else if (PCBList[i] == NULL) { + PCBList[i] = PCBList[i+1]; + PCBList[i+1] = NULL; + } + } + PcbCount--; + KeReleaseSpinLockFromDpcLevel(&PCBListLock); // TODO: better return code Status = STATUS_UNSUCCESSFUL; @@ -1013,6 +1070,10 @@ /* Allocate our new address file */ AddressFile = ExAllocatePoolWithTag(NonPagedPool, sizeof(*AddressFile), TAG_ADDRESS_FILE); + KeAcquireSpinLockAtDpcLevel(&AddrFileListLock); + AddrFileList[AddrFileCount] = AddressFile; + AddrFileCount++; + KeReleaseSpinLockFromDpcLevel(&AddrFileListLock); if (!AddressFile) { KeReleaseSpinLock(&AddressListLock, OldIrql); @@ -1041,7 +1102,10 @@ InsertEntityInstance(CO_TL_ENTITY, &AddressFile->Instance); AddressFile->ContextCount = 0; AddressFile->lwip_tcp_pcb = tcp_new(); - InterlockedIncrement(&PcbCount); + KeAcquireSpinLockAtDpcLevel(&PCBListLock); + PCBList[PcbCount] = AddressFile->lwip_tcp_pcb; + PcbCount++; + KeReleaseSpinLockFromDpcLevel(&PCBListLock); DPRINT1("\n PCB Count: %d\n", PcbCount); tcp_arg(AddressFile->lwip_tcp_pcb, AddressFile); tcp_err(AddressFile->lwip_tcp_pcb, lwip_tcp_err_callback); @@ -1103,6 +1167,7 @@ { PIO_STACK_LOCATION IrpSp; PTCP_CONTEXT Context; + KIRQL OldIrql; IrpSp = IoGetCurrentIrpStackLocation(Irp); @@ -1113,6 +1178,10 @@ } Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(*Context), TAG_TCP_CONTEXT); + KeAcquireSpinLock(&ContextListLock, &OldIrql); + ContextList[ContextCount] = Context; + ContextCount++; + KeReleaseSpinLock(&ContextListLock, OldIrql); if (!Context) { return STATUS_NO_MEMORY; @@ -1142,6 +1211,7 @@ NTSTATUS Status; err_t lwip_err; + int i;
/* Lock the global address list */ KeAcquireSpinLock(&AddressListLock, &OldIrql); @@ -1183,8 +1253,19 @@ tcp_abort(AddressFile->lwip_tcp_pcb); lwip_err = ERR_OK; } - InterlockedDecrement(&PcbCount); - DPRINT1("\n PCB Count: %d\n", PcbCount); + KeAcquireSpinLockAtDpcLevel(&PCBListLock); + DPRINT1("Deleting PCB at %p\n", AddressFile->lwip_tcp_pcb); + for (i=0; i<PcbCount; i++) { + if (PCBList[i] == AddressFile->lwip_tcp_pcb) { + PCBList[i] = PCBList[i+1]; + PCBList[i+1] = NULL; + } else if (PCBList[i] == NULL) { + PCBList[i] = PCBList[i+1]; + PCBList[i+1] = NULL; + } + } + PcbCount--; + KeReleaseSpinLockFromDpcLevel(&PCBListLock); if (lwip_err != ERR_OK) { DPRINT1("lwIP tcp_close error: %d", lwip_err); @@ -1215,6 +1296,18 @@ KeReleaseSpinLockFromDpcLevel(&AddressFile->ContextListLock);
ExFreePoolWithTag(AddressFile, TAG_ADDRESS_FILE); + KeAcquireSpinLockAtDpcLevel(&AddrFileListLock); + for (i=0; i<AddrFileCount; i++) { + if (AddrFileList[i] == NULL) { + AddrFileList[i] = AddrFileList[i+1]; + AddrFileList[i+1] = NULL; + } else if (AddrFileList[i] == AddressFile) { + AddrFileList[i] = AddrFileList[i+1]; + AddrFileList[i+1] = NULL; + } + } + AddrFileCount--; + KeReleaseSpinLockFromDpcLevel(&AddrFileListLock); KeReleaseSpinLock(&AddressListLock, OldIrql);
@@ -1236,6 +1329,7 @@ KIRQL OldIrql; NTSTATUS Status; + int i; AddressFile = Context->AddressFile; @@ -1278,9 +1372,20 @@ tcp_abort(Context->lwip_tcp_pcb); lwip_err = ERR_OK; } + KeAcquireSpinLockAtDpcLevel(&PCBListLock); + DPRINT1("Deleting PCB at %p\n", Context->lwip_tcp_pcb); + for (i=0; i<PcbCount; i++) { + if (PCBList[i] == Context->lwip_tcp_pcb) { + PCBList[i] = PCBList[i+1]; + PCBList[i+1] = NULL; + } else if (PCBList[i] == NULL) { + PCBList[i] = PCBList[i+1]; + PCBList[i+1] = NULL; + } + } + PcbCount--; + KeReleaseSpinLockFromDpcLevel(&PCBListLock); Context->lwip_tcp_pcb = NULL; - InterlockedDecrement(&PcbCount); - DPRINT1("\n PCB Count: %d\n", PcbCount); if (lwip_err != ERR_OK) { DPRINT1("lwIP tcp_close error: %d", lwip_err); @@ -1319,17 +1424,32 @@ KeReleaseSpinLockFromDpcLevel(&Context->RequestListLock); ExFreePoolWithTag(Context, TAG_TCP_CONTEXT); + KeAcquireSpinLockAtDpcLevel(&ContextListLock); + for (i=0; i<ContextCount; i++) { + if (ContextList[i] == NULL) { + ContextList[i] = ContextList[i+1]; + ContextList[i+1] = NULL; + } else if (ContextList[i] == Context) { + ContextList[i] = ContextList[i+1]; + ContextList[i+1] = NULL; + } + } + ContextCount--; + KeReleaseSpinLockFromDpcLevel(&ContextListLock); if (AddressFile->ContextCount == 0) { + DPRINT1("Closing Address File at %p from TcpIpCloseContext on Context at %p", + AddressFile, Context); + + KeReleaseSpinLock(&AddressFile->ContextListLock, OldIrql); Status = TcpIpCloseAddress(AddressFile); } else { + KeReleaseSpinLock(&AddressFile->ContextListLock, OldIrql); Status = STATUS_SUCCESS; } - - KeReleaseSpinLock(&AddressFile->ContextListLock, OldIrql); return Status; }