mirror of
https://github.com/esp8266/Arduino.git
synced 2025-06-13 13:01:55 +03:00
optimistic_yield()
this introduces optimistic_yield() used for when standard library methods are normally used in tight loops waiting for something to happen, like available().
This commit is contained in:
@ -177,20 +177,19 @@ size_t WiFiClient::write(const uint8_t *buf, size_t size)
|
||||
return _client->write(reinterpret_cast<const char*>(buf), size);
|
||||
}
|
||||
|
||||
extern "C" uint32_t esp_micros_at_task_start();
|
||||
extern "C" void optimistic_yield();
|
||||
|
||||
int WiFiClient::available()
|
||||
{
|
||||
static uint32_t lastPollTime = 0;
|
||||
if (!_client)
|
||||
return 0;
|
||||
int result = 0;
|
||||
|
||||
if (lastPollTime > esp_micros_at_task_start())
|
||||
yield();
|
||||
if (_client) {
|
||||
result = _client->getSize();
|
||||
}
|
||||
|
||||
lastPollTime = micros();
|
||||
|
||||
int result = _client->getSize();
|
||||
if (!result) {
|
||||
optimistic_yield();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -84,17 +84,15 @@ bool WiFiServer::getNoDelay(){
|
||||
return tcp_nagle_disabled(_pcb);
|
||||
}
|
||||
|
||||
extern "C" uint32_t esp_micros_at_task_start();
|
||||
|
||||
bool WiFiServer::hasClient(){
|
||||
if (_unclaimed) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
extern "C" void optimistic_yield();
|
||||
|
||||
WiFiClient WiFiServer::available(byte* status)
|
||||
{
|
||||
static uint32_t lastPollTime = 0;
|
||||
|
||||
if (_unclaimed)
|
||||
{
|
||||
WiFiClient result(_unclaimed);
|
||||
@ -103,9 +101,7 @@ WiFiClient WiFiServer::available(byte* status)
|
||||
return result;
|
||||
}
|
||||
|
||||
if (lastPollTime > esp_micros_at_task_start())
|
||||
yield();
|
||||
lastPollTime = micros();
|
||||
optimistic_yield();
|
||||
|
||||
return WiFiClient();
|
||||
}
|
||||
|
@ -113,12 +113,22 @@ uint8_t WiFiUDP::beginMulticast(IPAddress interfaceAddr, IPAddress multicast, ui
|
||||
return 1;
|
||||
}
|
||||
|
||||
extern "C" void optimistic_yield();
|
||||
|
||||
/* return number of bytes available in the current packet,
|
||||
will return zero if parsePacket hasn't been called yet */
|
||||
int WiFiUDP::available() {
|
||||
if (!_ctx)
|
||||
return 0;
|
||||
return static_cast<int>(_ctx->getSize());
|
||||
int result = 0;
|
||||
|
||||
if (_ctx) {
|
||||
result = static_cast<int>(_ctx->getSize());
|
||||
}
|
||||
|
||||
if (!result) {
|
||||
optimistic_yield();
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Release any resources being used by this WiFiUDP instance */
|
||||
|
Reference in New Issue
Block a user