Metody oznaczone jako oneway
nie są blokowane. W przypadku metod nieoznaczonych jako
oneway
, wywołanie metody klienta zablokuje się do czasu, aż serwer
zakończone wykonanie lub wywołanie synchronicznego wywołania zwrotnego (w zależności od tego, co nastąpi wcześniej).
Implementacje metody serwera mogą wywoływać maksymalnie jedno synchroniczne wywołanie zwrotne. dodatkowe
są odrzucane i rejestrowane jako błędy. Jeśli metoda powinna
zwraca wartości przez wywołanie zwrotne i nie wywołuje swojego wywołania zwrotnego, jest to rejestrowane jako
i zgłoszony do klienta jako błąd przesyłania.
Wątki w trybie przekazywania
W trybie przekazywania większość wywołań jest synchroniczna. Aby jednak zachować
zamierzone działanie, które wywołania funkcji oneway
nie blokują klienta,
dla każdego procesu jest tworzony wątek. Więcej informacji:
Informacje o HIDL.
Wątki w powiązanych zestawach HAL
Do obsługi przychodzących wywołań RPC (w tym asynchronicznych wywołań zwrotnych z list HAL do użytkowników HAL) i powiadomienia o śmierci, z każdym procesem jest powiązana pula wątków. wykorzystujący HIDL. Jeśli w jednym procesie zaimplementowano wiele interfejsów HIDL lub obsługi powiadomień o śmierci, pula wątków jest wspólna dla każdego z nich. Kiedy proces odbiera połączenie przychodzące od klienta, wybiera wolny wątek z puli wątków i wykonuje wywołanie w tym wątku. Jeśli nie ma wolnego wątku będzie on zablokowany do momentu, aż użytkownik będzie dostępny.
Jeśli serwer ma tylko jeden wątek, wywołania serwera są realizowane.
w określonej kolejności. Serwer z większą liczbą wątków może wykonywać wywołania w niewłaściwej kolejności
nawet jeśli klient ma tylko jeden wątek. Jednak dla danego obiektu interfejsu
Gwarantujemy kolejność oneway
połączeń (zobacz
Model podziału na wątki serwera). Serwer wielowątkowy,
hostuje wiele interfejsów, oneway
wywołania różnych interfejsów
mogą być przetwarzane równocześnie ze sobą lub z innymi blokującymi połączenia.
W tym samym wątku Hwbinder wysyłanych jest wiele zagnieżdżonych wywołań. Przykład: jeśli proces (A) wykonuje synchroniczne wywołanie z wątku hwbinder w procesie (B), a następnie proces (B) przeprowadza synchroniczne wywołanie z powrotem do procesu (A), zostało wykonane w pierwotnym wątku Hwbinder w (A) i zablokowanym . Dzięki tej optymalizacji serwer z jednym wątkiem może obsługuje zagnieżdżone wywołania, ale nie dotyczy to przypadków, w których te połączenia kolejną sekwencję wywołań IPC. Jeśli na przykład proces (B) utworzył wywołanie binder/vndbindera, które jest wywołaniem procesu (C), a następnie przetwarza wywołania (C) z powrotem do źródła (A), nie można go przesłać w pierwotnym wątku w (A).
Model podziału na wątki serwera
Z wyjątkiem trybu przekazywania aktywne implementacje interfejsów HIDL są uruchomione w innym procesie niż klient i potrzebują co najmniej jednego wątku połączeń przychodzących. Te wątki stanowią pulę wątków serwera. serwer może decyduje, ile wątków ma być uruchomionych w puli wątków, i może użyć funkcji rozmiar puli wątków równą 1, aby zserializować wszystkie wywołania jego interfejsów. Jeśli serwer ma więcej niż jeden wątek w puli wątków, może odbierać równocześnie przychodzące rozmowy w dowolnym jego interfejsie (w C++ oznacza to, że udostępniane dane muszą być ostrożnie zablokowany).
Wywołania jednokierunkowe do tego samego interfejsu są serializowane. Jeśli wielowątkowość
klient wywołuje method1
i method2
w interfejsie
IFoo
i method3
w interfejsie IBar
,
method1
i method2
są zawsze serializowane, ale
method3
może działać równolegle z method1
i
method2
Pojedynczy wątek wykonania klienta może powodować równoczesne wykonywanie serwer z wieloma wątkami na dwa sposoby:
oneway
połączenia nie są blokowane. Jeśli połączenieoneway
jest a następnie wywołanie inne niżoneway
, serwer może wykonać połączenieoneway
i połączenie spozaoneway
jednocześnie.- Metody serwera przekazujące dane z powrotem za pomocą synchronicznych wywołań zwrotnych mogą odblokować do klienta natychmiast po wywołaniu wywołania zwrotnego z serwera.
W drugim przypadku dowolny kod w funkcji serwera, który jest wykonywany po może być wykonywane równocześnie, przy czym serwer obsługuje kolejne ze strony klienta. Obejmuje to kod w funkcji serwera i automatyczne destruktory wykonywane na końcu funkcji. Jeśli serwer ma więcej niż jednego wątku w puli wątków, problemy z równoczesnością pojawiają się nawet wtedy, gdy przychodzą wywołania tylko z jednego wątku klienta. (Jeśli HAL obsługiwana przez proces wymaga wiele wątków, wszystkie HAL mają wiele wątków, ponieważ pula wątków jest udostępniane dla poszczególnych procesów).
Gdy tylko serwer wywoła podane wywołanie zwrotne, system transportowy może wywołać metodę Wdrożenie wywołania zwrotnego i odblokowanie klienta. Klient kontynuuje równolegle ze wszystkimi działaniami implementacji serwera po wywołaniu wywołanie zwrotne (może ono obejmować uruchamianie destruktorów). Kod w funkcji serwera gdy wywołanie zwrotne nie będzie już blokować klienta (o ile serwer pula wątków ma wystarczającą liczbę wątków do obsługi połączeń przychodzących, ale może zostać wykonana jednocześnie z przyszłymi wywołaniami klienta (chyba że pula wątków serwera ma tylko jeden wątek).
Oprócz synchronicznych wywołań zwrotnych funkcja oneway
wywołuje
klient jednowątkowy może być obsługiwany jednocześnie przez serwer z wieloma
wątki w puli wątków, ale tylko wtedy, gdy te wywołania funkcji oneway
wykonywane w różnych interfejsach. oneway
połączenia w tym samym czasie
są zawsze serializowane.
Uwaga: zdecydowanie zalecamy, aby funkcje serwera natychmiast po wywołaniu funkcji wywołania zwrotnego.
Na przykład (w C++):
Return<void> someMethod(someMethod_cb _cb) { // Do some processing, then call callback with return data hidl_vec<uint32_t> vec = ... _cb(vec); // At this point, the client's callback is called, // and the client resumes execution. ... return Void(); // is basically a no-op };
Model podziału klienta na wątki
Model podziału na wątki na kliencie różni się w przypadku wywołań nieblokujących
(funkcje oznaczone słowem kluczowym oneway
) i blokowanie
(funkcje, które nie mają określonego słowa kluczowego oneway
).
Blokuj połączenia
W przypadku blokowania połączeń klient blokuje połączenia, dopóki nie wystąpi jedna z tych sytuacji:
- Występuje błąd związany z transportem. obiekt
Return
zawiera błąd stan, który można pobrać za pomocąReturn::isOk()
. - Implementacja serwera wywołuje wywołanie zwrotne (jeśli takie było).
- Implementacja serwera zwraca wartość (jeśli nie ma parametru wywołania zwrotnego).
W przypadku powodzenia funkcja wywołania zwrotnego, którą klient przekazuje jako argument, to
zawsze wywoływane przez serwer przed zwróceniem samej funkcji. Oddzwanianie to
są wykonywane w tym samym wątku, w którym wywoływane jest wywołanie funkcji, więc funkcje implementujące
należy zachować ostrożność przy przytrzymywaniu blokad podczas wywoływania funkcji (i unikać ich
w miarę możliwości). Funkcja bez instrukcji generates
lub słowo kluczowe oneway
wciąż jest blokowane; blokowane przez klienta do czasu
serwer zwraca obiekt Return<void>
.
Połączenia w jedną stronę
Gdy funkcja jest oznaczona jako oneway
, klient wraca natychmiast
i nie czeka na zakończenie wywołania funkcji przez serwer. Na
na powierzchnię (i w postaci zbiorczej), oznacza to, że wywołanie funkcji zajmuje połowę
ponieważ wykonuje ona połowę kodu, ale przy pisaniu implementacji, które
są wrażliwe na wydajność, może to mieć wpływ na harmonogramy. Zwykle
podczas połączenia jednokierunkowego osoba dzwoniąca jest nadal zaplanowana,
użycie normalnego wywołania synchronicznego powoduje natychmiastowe przejście przez algorytm szeregowania
z rozmówcy do procesu wywołującego. To jest optymalizacja skuteczności w
separatora. W przypadku usług, w których proces docelowy musi zostać wykonane wywołanie jednokierunkowe
zasadą szeregowania usługi odbierającej może być
została zmieniona. W C++ z użyciem metody libhidltransport
setMinSchedulerPolicy
z priorytetami i zasadami algorytmu szeregowania
zdefiniowaną w sched.h
gwarantuje, że wszystkie wywołania usługi są wykonywane
a przynajmniej ustaw zasadę planowania i priorytet.