remotecontrol Geschrieben February 9, 2013 at 14:21 Geschrieben February 9, 2013 at 14:21 Hallo zusammen, im der Methode Device.sendRequestExpectResponse wird die ganze Zeit der Socket-Mutex der IPConnection gehalten, in der Art (Java Beispiel): synchronized(requestMutex) { synchronized(ipcon.socketMutex) {  Ist das notwendig? Das bewirkt, dass bis die Response zurĂŒck ist keinerlei andere Commands gesendet werden können, auch keine, die keine Response erwarten. In API Version 1 wurde nur der IPConnection.write synchronisiert. Damit war es möglich, dass ein anderes Device schon frĂŒher wieder ein Command senden konnte. Verarbeitet der Master-Brick eh alles seriell oder könnte man theoretisch weitere Commands senden? Dann wĂŒrde es sich lohnen, sich die Synchronisierung genau anzusehen. Zitieren
AuronX Geschrieben February 9, 2013 at 19:27 Geschrieben February 9, 2013 at 19:27 Hierzu auch als Referenz: https://github.com/Tinkerforge/generators/pull/32 Regarding the requestLock inside sendRequestNoResponse(): It could probably be removed' date=' but you don't gain much form that expect making it easier to overflow the communication buffers with too many setter calls in flight.[/quote'] Deine Frage wie der Master die Calls verarbeitet finde ich sehr interessant! Soweit ich das verstanden habe sind alle Komponenten unabhĂ€ngig genug voneinander, dass ein Setter (oder ein Getter eines anderen Device) zwischendurch problemlos aufgerufen werden können mĂŒsste. Eine offizielle Antwort ist aber mehr Wert als meine ^^ Zitieren
remotecontrol Geschrieben February 11, 2013 at 11:04 Autor Geschrieben February 11, 2013 at 11:04 Ich habe bei mir die Device.sendRequestExpectResponse und sendRequestNoResponse mal so umgebaut: synchronized(requestMutex) { if (ipcon.getConnectionState() != IPConnection.CONNECTION_STATE_CONNECTED) { throw new NotConnectedException(); } ...  Also den 2. synchronized Block entfernt und IPConnection.write sieht dann so aus: void write(byte[] data) { try {   synchronized(socketMutex) {     out.write(data);   } } catch(java.io.IOException e) { e.printStackTrace(); } }  Damit lĂ€uft meine Steuerung deutlich flĂŒssiger, weil Statusabfragen, wie Ambilight-Sensor oder Spannung/Strom auslesen andere Requests ohne Response nicht mehr vollstĂ€ndig blockieren. Ob das so "gut" ist oder eher Probleme im Master bereiten kann (wegen ParallelitĂ€t) kann ich so nicht sagen. Zitieren
photron Geschrieben February 11, 2013 at 12:45 Geschrieben February 11, 2013 at 12:45 In API Version 1 wurde nur der IPConnection.write synchronisiert. Damit war es möglich, dass ein anderes Device schon frĂŒher wieder ein Command senden konnte.  Ah ich sehe was du meinst. Du beziehst dich auf den socketMutex. Der ist neu in v2 und fĂŒhrt dazu dass alle Setter/Getter Aufrufe aller Devices der selben IPConnection serialisiert werden. Das ist schlecht fĂŒr die Performance mit mehreren Threads. Da haben wir nicht aufgepasst  AuronX, du beziehst dich auf den requestMutex im Setter Fall. Wie im Pull Request schon gesagt sehe ich da keine Problem das zu Ă€ndern. In remotecontrols Fall ĂŒber WLAN (nehme ich an) wo die Getter Roundtriptime höher ist ist der Gewinn einer solchen Ănderung natĂŒrlich deutlich gröĂer als ĂŒber USB. Damit steht jetzt feineres Locking auf der TODO Liste fĂŒr die nĂ€chste Release. Zitieren
AuronX Geschrieben February 11, 2013 at 15:07 Geschrieben February 11, 2013 at 15:07 Stimmt, mein Fall war nur relevant wenn das gleiche Device in mehreren Threads genutzt wurde. Bei Java ist es ja auch bei mehr als einem Device ein Problem. Hoffe der Beitrag war trotzdem halbwegs relevant  Viele GrĂŒĂe Jan Zitieren
photron Geschrieben February 20, 2013 at 14:40 Geschrieben February 20, 2013 at 14:40 Das Locking ist mit der letzten Version in allen Binsings verbessert worden. In allen Bindings wird das Request Lock nur noch fĂŒr Getter Aufrufe (und Setter mit Response Expected Flag) gehalten. Das Socket Lock wird nur noch direkt um die Interaktion mit dem Socket gehalten. Es wird in Java nicht mehr fĂŒr die gesamte Zeit eines Getter Aufrufs gehalten. Zitieren
remotecontrol Geschrieben February 20, 2013 at 17:08 Autor Geschrieben February 20, 2013 at 17:08 Schaut gut aus - meine Anwendung lĂ€uft damit flĂŒssig und ich nutze wieder die Standard API. Vielen Dank Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.