Tcp4->Transmit() queues outgoing data into the transmit queue. In current
implementation, the notify function will be signaled as soon as the data is
queued, before TCP4->Transmit() finishes all its responsibilities.
Best Regards,
Ye Ting
From: Thomas Rognon [mailto:tcrog...@gmail.com]
Sent: Thursday, August 21, 2014 11:47 AM
To: edk2-devel
Subject: Re: [edk2] Asynchronous TCP issue
By callback, I mean the notify function that is passed into Tcp4->Accept() /
Tcp4->Transmit() / Tcp4->Receive() / etc. I'll say notify function instead of
callback, since that seems to be the language edk2 uses.
I have a distinct notify function for each async operation. For example, my
notify function for Tcp4->Accept() is AcceptCallback() and my notify function
for Tcp4->Transmit() is TransmitCallback() etc.
Inside the Tcp4->Transmit() notify function, I want to call Tcp4->Receive(). I
can't because the socket's lock isn't released until sometime after execution
returns from the notify function.
What I did to work around this temporarily is set a relative timer in the
Tcp4->Transmit() notify function for 100ms. I put the Tcp4->Receive() in the
timer's notify function. This works because 100ms is enough time for the
execution to return from Tcp4->Transmit() notify function and release the
socket's lock. But doing it this way is very inefficient and could cause a race
condition.
In other words, why isn't the socket's lock released before the notify function
is signaled? Shouldn't the notify function be signaled after the socket is
completely finished with all of it's responsibilities?
Thank you for being so helpful!
Thomas
On Wed, Aug 20, 2014 at 9:29 PM, Ye, Ting
<ting...@intel.com<mailto:ting...@intel.com>> wrote:
The Sock->Lock is defined to protect the sharing data in socket. An access to
socket interface will acquire the lock at the beginning and release the lock at
the end.
In your case, would you please describe the “callback finishes” more detail? Do
you mean the “callback” includes a Tcp4->Transmit() call and you need wait for
this call finish before entering Tcp4->Receive()?
Best Regards,
Ye Ting
From: Thomas Rognon [mailto:tcrog...@gmail.com<mailto:tcrog...@gmail.com>]
Sent: Thursday, August 21, 2014 9:12 AM
To: edk2-devel
Subject: [edk2] Asynchronous TCP issue
I have a driver that needs to do async TCP in the background while other UEFI
apps are running. The flow needs to go like this:
{
Tcp4->Accept(); // async
}
AcceptCallback() {
Tcp4->Transmit(); // async
}
TransmitCallback() {
Tcp4->Receive(); // async
}
This works up until Tcp4->Receive() which immediately returns
EFI_ACCESS_DENIED. I traced it back to Status = EfiAcquireLockOrFail
(&(Sock->Lock)); in SockRcv().
So the socket is locked while in the callback, which is very inconvenient. I
worked around it by setting a timer to call Tcp4->Receive() a few milliseconds
later. That way the callback finishes and the socket's lock is released before
my code is run. I'd rather not do it that way, though.
Is this intended? Thank you for any insight.
Thomas Rognon
------------------------------------------------------------------------------
Slashdot TV.
Video for Nerds. Stuff that matters.
http://tv.slashdot.org/
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net<mailto:edk2-devel@lists.sourceforge.net>
https://lists.sourceforge.net/lists/listinfo/edk2-devel
------------------------------------------------------------------------------
Slashdot TV.
Video for Nerds. Stuff that matters.
http://tv.slashdot.org/
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel