Optimizations

This commit is contained in:
Me No Dev 2016-07-14 00:01:13 +03:00
parent 59e904362b
commit 933ac023cb
4 changed files with 79 additions and 84 deletions

View File

@ -119,7 +119,7 @@ AsyncEventSourceClient::AsyncEventSourceClient(AsyncWebServerRequest *request, A
_client->onPoll(NULL, NULL);
_client->onData(NULL, NULL);
_client->onTimeout([](void *r, AsyncClient* c, uint32_t time){ ((AsyncEventSourceClient*)(r))->_onTimeout(time); }, this);
_client->onDisconnect([](void *r, AsyncClient* c){ ((AsyncEventSourceClient*)(r))->_onDisconnect(); }, this);
_client->onDisconnect([](void *r, AsyncClient* c){ ((AsyncEventSourceClient*)(r))->_onDisconnect(); delete c; }, this);
_server->_addClient(this);
delete request;
}
@ -133,10 +133,7 @@ void AsyncEventSourceClient::_onTimeout(uint32_t time){
}
void AsyncEventSourceClient::_onDisconnect(){
AsyncClient* cl = _client;
_client = NULL;
cl->free();
delete cl;
_server->_handleDisconnect(this);
}

View File

@ -252,7 +252,7 @@ AsyncWebSocketClient::AsyncWebSocketClient(AsyncWebServerRequest *request, Async
next = NULL;
_client->onError([](void *r, AsyncClient* c, int8_t error){ ((AsyncWebSocketClient*)(r))->_onError(error); }, this);
_client->onAck([](void *r, AsyncClient* c, size_t len, uint32_t time){ ((AsyncWebSocketClient*)(r))->_onAck(len, time); }, this);
_client->onDisconnect([](void *r, AsyncClient* c){ ((AsyncWebSocketClient*)(r))->_onDisconnect(); }, this);
_client->onDisconnect([](void *r, AsyncClient* c){ ((AsyncWebSocketClient*)(r))->_onDisconnect(); delete c; }, this);
_client->onTimeout([](void *r, AsyncClient* c, uint32_t time){ ((AsyncWebSocketClient*)(r))->_onTimeout(time); }, this);
_client->onData([](void *r, AsyncClient* c, void *buf, size_t len){ ((AsyncWebSocketClient*)(r))->_onData(buf, len); }, this);
_client->onPoll([](void *r, AsyncClient* c){ ((AsyncWebSocketClient*)(r))->_onPoll(); }, this);
@ -389,10 +389,7 @@ void AsyncWebSocketClient::_onTimeout(uint32_t time){
}
void AsyncWebSocketClient::_onDisconnect(){
AsyncClient* cl = _client;
_client = NULL;
cl->free();
delete cl;
_server->_handleDisconnect(this);
}
@ -479,52 +476,54 @@ void AsyncWebSocketClient::_onData(void *buf, size_t plen){
size_t AsyncWebSocketClient::printf(const char *format, ...) {
va_list arg;
va_start(arg, format);
#ifdef ESP8266
//ToDo: figure out a way around this
size_t len = 1440;
#else
size_t len = vsnprintf(NULL, 0, format, arg)+1;
#endif
char * msg = (char*)malloc(len+1);
if(msg == NULL){
va_end(arg);
char* temp = new char[64];
if(!temp){
return 0;
}
len = vsnprintf(msg, len, format, arg);
msg[len] = 0;
text(msg);
char* buffer = temp;
size_t len = vsnprintf(temp, 64, format, arg);
va_end(arg);
free(msg);
if (len > 63) {
buffer = new char[len + 1];
if (!buffer) {
return 0;
}
va_start(arg, format);
vsnprintf(buffer, len + 1, format, arg);
va_end(arg);
}
text(buffer, len);
if (buffer != temp) {
delete[] buffer;
}
delete[] temp;
return len;
}
size_t AsyncWebSocketClient::printf_P(PGM_P formatP, ...) {
char* format;
va_list arg;
va_start(arg, formatP);
#ifdef ESP8266
//ToDo: figure out a way around this
size_t len = 1440;
#else
size_t len = vsnprintf(NULL, 0, format, arg)+1;
#endif
size_t fmtLen = strlen_P(formatP);
format = (char*)calloc(fmtLen+1, sizeof(char));
if ( format ) {
strcpy_P(format, formatP);
char * msg = (char*)malloc(len+1);
if(msg == NULL){
va_end(arg);
char* temp = new char[64];
if(!temp){
return 0;
}
char* buffer = temp;
size_t len = vsnprintf_P(temp, 64, formatP, arg);
va_end(arg);
if (len > 63) {
buffer = new char[len + 1];
if (!buffer) {
return 0;
}
len = vsnprintf(msg, len, format, arg);
msg[len] = 0;
text(msg);
va_start(arg, formatP);
vsnprintf_P(buffer, len + 1, formatP, arg);
va_end(arg);
free(msg);
free(format);
}
text(buffer, len);
if (buffer != temp) {
delete[] buffer;
}
delete[] temp;
return len;
}
@ -761,22 +760,27 @@ size_t AsyncWebSocket::printf(uint32_t id, const char *format, ...){
size_t AsyncWebSocket::printfAll(const char *format, ...) {
va_list arg;
va_start(arg, format);
#ifdef ESP8266
//ToDo: figure out a way around this
size_t len = 1440;
#else
size_t len = vsnprintf(NULL, 0, format, arg)+1;
#endif
char * msg = (char*)malloc(len+1);
if(msg == NULL){
va_end(arg);
char* temp = new char[64];
if(!temp){
return 0;
}
len = vsnprintf(msg, len, format, arg);
msg[len] = 0;
textAll(msg);
char* buffer = temp;
size_t len = vsnprintf(temp, 64, format, arg);
va_end(arg);
free(msg);
if (len > 63) {
buffer = new char[len + 1];
if (!buffer) {
return 0;
}
va_start(arg, format);
vsnprintf(buffer, len + 1, format, arg);
va_end(arg);
}
textAll(buffer, len);
if (buffer != temp) {
delete[] buffer;
}
delete[] temp;
return len;
}
@ -793,33 +797,29 @@ size_t AsyncWebSocket::printf_P(uint32_t id, PGM_P formatP, ...){
}
size_t AsyncWebSocket::printfAll_P(PGM_P formatP, ...) {
char* format;
va_list arg;
va_start(arg, formatP);
#ifdef ESP8266
//ToDo: figure out a way around this
size_t len = 1440;
#else
size_t len = vsnprintf(NULL, 0, format, arg)+1;
#endif
size_t fmtLen = strlen_P(formatP);
format = (char*)calloc(fmtLen+1, sizeof(char));
if ( format ) {
strcpy_P(format, formatP);
char * msg = (char*)malloc(len+1);
if(msg == NULL){
va_end(arg);
free(format);
char* temp = new char[64];
if(!temp){
return 0;
}
char* buffer = temp;
size_t len = vsnprintf_P(temp, 64, formatP, arg);
va_end(arg);
if (len > 63) {
buffer = new char[len + 1];
if (!buffer) {
return 0;
}
len = vsnprintf(msg, len, format, arg);
msg[len] = 0;
textAll(msg);
va_start(arg, formatP);
vsnprintf_P(buffer, len + 1, formatP, arg);
va_end(arg);
free(msg);
free(format);
}
textAll(buffer, len);
if (buffer != temp) {
delete[] buffer;
}
delete[] temp;
return len;
}

View File

@ -110,8 +110,8 @@ class AsyncWebSocketClient {
//data packets
void message(AsyncWebSocketMessage *message){ _queueMessage(message); }
size_t printf(const char *format, ...);
size_t printf_P(PGM_P formatP, ...);
size_t printf(const char *format, ...) __attribute__ ((format (printf, 2, 3)));
size_t printf_P(PGM_P formatP, ...) __attribute__ ((format (printf, 2, 3)));
void text(const char * message, size_t len);
void text(const char * message);
@ -194,10 +194,10 @@ class AsyncWebSocket: public AsyncWebHandler {
void message(uint32_t id, AsyncWebSocketMessage *message);
void messageAll(AsyncWebSocketMessage *message);
size_t printf(uint32_t id, const char *format, ...);
size_t printfAll(const char *format, ...);
size_t printf_P(uint32_t id, PGM_P formatP, ...);
size_t printfAll_P(PGM_P formatP, ...);
size_t printf(uint32_t id, const char *format, ...) __attribute__ ((format (printf, 3, 4)));
size_t printfAll(const char *format, ...) __attribute__ ((format (printf, 2, 3)));
size_t printf_P(uint32_t id, PGM_P formatP, ...) __attribute__ ((format (printf, 3, 4)));
size_t printfAll_P(PGM_P formatP, ...) __attribute__ ((format (printf, 2, 3)));
//event listener
void onEvent(AwsEventHandler handler){

View File

@ -69,7 +69,7 @@ AsyncWebServerRequest::AsyncWebServerRequest(AsyncWebServer* s, AsyncClient* c)
{
c->onError([](void *r, AsyncClient* c, int8_t error){ AsyncWebServerRequest *req = (AsyncWebServerRequest*)r; req->_onError(error); }, this);
c->onAck([](void *r, AsyncClient* c, size_t len, uint32_t time){ AsyncWebServerRequest *req = (AsyncWebServerRequest*)r; req->_onAck(len, time); }, this);
c->onDisconnect([](void *r, AsyncClient* c){ AsyncWebServerRequest *req = (AsyncWebServerRequest*)r; req->_onDisconnect(); }, this);
c->onDisconnect([](void *r, AsyncClient* c){ AsyncWebServerRequest *req = (AsyncWebServerRequest*)r; req->_onDisconnect(); delete c; }, this);
c->onTimeout([](void *r, AsyncClient* c, uint32_t time){ AsyncWebServerRequest *req = (AsyncWebServerRequest*)r; req->_onTimeout(time); }, this);
c->onData([](void *r, AsyncClient* c, void *buf, size_t len){ AsyncWebServerRequest *req = (AsyncWebServerRequest*)r; req->_onData(buf, len); }, this);
c->onPoll([](void *r, AsyncClient* c){ AsyncWebServerRequest *req = (AsyncWebServerRequest*)r; req->_onPoll(); }, this);
@ -192,8 +192,6 @@ void AsyncWebServerRequest::_onTimeout(uint32_t time){
void AsyncWebServerRequest::_onDisconnect(){
//os_printf("d\n");
_client->free();
delete _client;
_server->_handleDisconnect(this);
}