mirror of https://github.com/acidanthera/audk.git
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 <siyuan.fu@intel.com> Reviewed-by: Ye Ting <ting.ye@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18449 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
7fd71047a6
commit
51b0450e00
|
@ -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);
|
||||
}
|
||||
|
@ -520,9 +524,6 @@ Error2:
|
|||
}
|
||||
|
||||
Error1:
|
||||
if (Url != NULL) {
|
||||
FreePool (Url);
|
||||
}
|
||||
if (HostName != NULL) {
|
||||
FreePool (HostName);
|
||||
}
|
||||
|
|
|
@ -431,6 +431,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);
|
||||
|
||||
|
@ -496,6 +502,11 @@ HttpCleanProtocol (
|
|||
HttpInstance->MsgParser = NULL;
|
||||
}
|
||||
|
||||
if (HttpInstance->Url != NULL) {
|
||||
FreePool (HttpInstance->Url);
|
||||
HttpInstance->Url = NULL;
|
||||
}
|
||||
|
||||
NetMapClean (&HttpInstance->TxTokens);
|
||||
NetMapClean (&HttpInstance->RxTokens);
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue