Reviewed-by: Ye Ting <[email protected]> 

-----Original Message-----
From: Fu, Siyuan 
Sent: Monday, September 14, 2015 4:24 PM
To: [email protected]
Cc: Ye, Ting; Wu, Jiaxin
Subject: [Patch 4/4] NetworkPkg: Avoid memory allocation for each HTTP message 
exchange.

This patch updates the HTTP driver to use a shared buffer for URL parsing to 
avoid memory allocation for each HTTP request.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Fu Siyuan <[email protected]>
---
 NetworkPkg/HttpDxe/HttpImpl.c  | 19 ++++++++++---------  
NetworkPkg/HttpDxe/HttpProto.c | 11 +++++++++++  NetworkPkg/HttpDxe/HttpProto.h 
|  4 ++++
 3 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/NetworkPkg/HttpDxe/HttpImpl.c b/NetworkPkg/HttpDxe/HttpImpl.c 
index c176a65..2b62dc5 100644
--- a/NetworkPkg/HttpDxe/HttpImpl.c
+++ b/NetworkPkg/HttpDxe/HttpImpl.c
@@ -224,6 +224,7 @@ EfiHttpRequest (
   BOOLEAN                       ReConfigure;
   CHAR8                         *RequestStr;
   CHAR8                         *Url;
+  UINTN                         UrlLen;
   CHAR16                        *HostNameStr;
   HTTP_TOKEN_WRAP               *Wrap;
   HTTP_TCP_TOKEN_WRAP           *TcpWrap;
@@ -283,10 +284,15 @@ EfiHttpRequest (
   //
   // Parse the URI of the remote host.
   //
-  Url = AllocatePool (StrLen (Request->Url) + 1);
-  if (Url == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
+  UrlLen = StrLen (Request->Url) + 1;
+  if (UrlLen > HTTP_URL_BUFFER_LEN) {
+    Url = AllocateZeroPool (UrlLen);
+    if (Url == NULL) {
+      return EFI_OUT_OF_RESOURCES;
+    }
+    FreePool (HttpInstance->Url);
+    HttpInstance->Url = Url;    
+  }
 
   UnicodeStrToAsciiStr (Request->Url, Url);
   UrlParser = NULL;
@@ -347,7 +353,6 @@ EfiHttpRequest (
 
         Wrap->TcpWrap.Method = Request->Method;
 
-        FreePool (Url);
         FreePool (HostName);
         
         //
@@ -480,7 +485,6 @@ EfiHttpRequest (
     goto Error4;
   }
 
-  FreePool (Url);
   if (HostName != NULL) {
     FreePool (HostName);
   }
@@ -522,9 +526,6 @@ Error2:
   }
 
 Error1:
-  if (Url != NULL) {
-    FreePool (Url);
-  }
   if (HostName != NULL) {
     FreePool (HostName);
   }
diff --git a/NetworkPkg/HttpDxe/HttpProto.c b/NetworkPkg/HttpDxe/HttpProto.c 
index 06a41b7..8fbd454 100644
--- a/NetworkPkg/HttpDxe/HttpProto.c
+++ b/NetworkPkg/HttpDxe/HttpProto.c
@@ -470,6 +470,12 @@ HttpInitProtocol (
     goto ON_ERROR;
   }
 
+  HttpInstance->Url = AllocateZeroPool (HTTP_URL_BUFFER_LEN);  if 
+ (HttpInstance->Url == NULL) {
+    Status = EFI_OUT_OF_RESOURCES;
+    goto ON_ERROR;
+  }
+
   NetMapInit (&HttpInstance->TxTokens);
   NetMapInit (&HttpInstance->RxTokens);
 
@@ -535,6 +541,11 @@ HttpCleanProtocol (
     HttpInstance->MsgParser = NULL;
   }
 
+  if (HttpInstance->Url != NULL) {
+    FreePool (HttpInstance->Url);
+    HttpInstance->Url = NULL;
+  }
+
   NetMapClean (&HttpInstance->TxTokens);
   NetMapClean (&HttpInstance->RxTokens);
 
diff --git a/NetworkPkg/HttpDxe/HttpProto.h b/NetworkPkg/HttpDxe/HttpProto.h 
index ca4b7b6..c37b80c 100644
--- a/NetworkPkg/HttpDxe/HttpProto.h
+++ b/NetworkPkg/HttpDxe/HttpProto.h
@@ -51,6 +51,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER 
EXPRESS OR IMPLIED.
 #define HTTP_KEEP_ALIVE_TIME         7200
 #define HTTP_KEEP_ALIVE_INTERVAL     30
 
+#define HTTP_URL_BUFFER_LEN          4096
+
 typedef struct _HTTP_SERVICE {
   UINT32                        Signature;
   EFI_SERVICE_BINDING_PROTOCOL  ServiceBinding; @@ -120,6 +122,8 @@ typedef 
struct _HTTP_PROTOCOL {
 
   NET_MAP                       TxTokens;
   NET_MAP                       RxTokens;
+
+  CHAR8                         *Url;
 } HTTP_PROTOCOL;
 
 typedef struct {
--
2.5.0.windows.1

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to