Även 2.1.1 gör riktigt håriga saker med mutexar spritslat runt kod som kör select i while(1) i Socket_unix.cpp. Nog för att det är svårt att skriva portabel kod, men jag är uppriktigt sagt förvånad att den där koden öht fungerar så bra som den ändå gör, och då är den ändå "bara" för unix-liknande system. Den kollar till exempel timeval efter select, vilket man inte bör göra om man vill att det ska fungera på något annat än linux. Däremot kollas inte errno och om select returnerar 0 eller -1 verkar inte heller göras skillnad på...
För att prova vad som tar tid, gör ett enkelt timingtestprogram:
Code: Select all
#include <telldus-core.h>
int main(int argc, char **argv) {
tdInit();
int id = tdGetDeviceId(0);
int supported = tdMethods(id,TELLSTICK_TURNON | TELLSTICK_TURNOFF | TELLSTICK_DIM);
tdClose();
return 0;
}
Skippar man tdClose tar det precis en sekund mindre. Om man inte anropar ngt mellan tdInit och tdClose tar det precis en sekund mindre. Enda koden jag hittar som har ngt att göra med en sekund som jag kan hitta är
Code: Select all
std::wstring clientMessage = d->eventSocket.read(1000); //testing 5 second timeout
och jag misstänker att någon tänkt Fel i just hanteringen runt select inne i Socket_unix.cpp i read(int)-metoden.
Edit: det spelar alltså ingen roll om man har ngn hårdvara ansluten, så länge man frågar telldusd något kommer tdClose() att ta en sekund. Om tdtool gör tdInit() och tdClose() runt varje kommando kommer varje kommando ta en onödig sekund. Tar jag bort tdClose() från ovanstående och kör programmet 1000 gånger tar det totalt 9.890s och telldusd tar 6% CPU. I kombination med körande TelldusCenter verkar det mindre stabilt och verkar hamna i ngn mer eller mindre oändlig loop, så något bra gör uppenbarligen tdClose() men jag kan inte utan vidare avgöra om det är pga att det finns en sleep som undviker race conditions någonstans eller för att något frigörs på rätt sätt bara om klienten avslutar korrekt. Jag hoppas på det förra...
Edit 2: Jag får "telldusd: Received SIGPIPE signal." repeterat lika många gånger i syslog som jag kör ngt som inte gör tdClose(). Lutar åt att schemalägga en restart av telldusd varje natt tills den här är löst.