Le funzioni in un'interfaccia HIDL sono mappate ai metodi nella
IFoo
dichiarazione del corso C++. Il nome di ogni funzione rimane
lo stesso in C++; le seguenti sezioni descrivono come gli argomenti HIDL e restituiscono
vengono tradotti in C++.
Parametri della funzione
Gli argomenti elencati nel file .hal
sono mappati ai tipi di dati C++.
Gli argomenti che non sono mappati a un tipo C++ primitivo vengono passati da const
riferimento.
Per ogni funzione HIDL che ha un valore restituito (ha un generates
), l'elenco dei parametri C++ per quella funzione ha un argomento aggiuntivo:
una funzione di callback che viene chiamata con i valori restituiti della funzione HIDL.
Esiste un'eccezione: se la clausola generates
contiene un singolo parametro che viene mappato direttamente a una funzione primitiva C++,
Viene utilizzata elision (il callback viene rimosso e il valore restituito
restituito dalla funzione tramite una normale istruzione return
).
Valori restituiti dalla funzione
Le seguenti funzioni hanno valori restituiti.
Errori di trasporto e tipo di reso
L'istruzione generates
può generare tre tipi di funzioni
firme:
- Per un solo valore restituito che è una primitiva C++,
Il valore restituito
generates
viene restituito dal valore della funzione in un OggettoReturn<T>
. - Per casi più complicati, i valori restituiti da
generates
sono restituito tramite il parametro di callback fornito con la chiamata di funzione stessa, e la funzione restituisceReturn<void>
. - Per quando non esistono istruzioni
generates
, la funzione restituisceReturn<void>
.
Le chiamate RPC a volte possono riscontrare errori di trasporto, ad esempio quando il server
muore, quando le risorse di trasporto sono insufficienti per completare la chiamata o quando
i parametri passati non consentono di completare la chiamata (ad esempio, manca un
funzione di callback richiesta). Return
errore di trasporto dell'archivio di oggetti
nonché un valore T
(tranne
Return<void>
).
Poiché le funzioni lato client e lato server hanno la stessa firma,
funzione lato server deve restituire un tipo Return
anche se la sua funzione
di implementazione non segnala errori di trasporto. Return<T>
vengono creati con Return(myTValue)
(o possono essere implicitamente
creato da mTValue
, ad esempio in return
istruzioni) e gli oggetti Return<void>
sono creati
Void()
,
Return<T>
oggetti hanno una conversione implicita da e verso
il valore di T
. È possibile cercare l'oggetto Return
di trasporto richiamando il metodo isOk()
. Questo controllo non è
obbligatorio; Tuttavia, se si verifica un errore che non viene controllato quando
L'oggetto Return
è stato eliminato o una conversione del valore T
in corso, il processo client verrà interrotto e verrà registrato un errore. Se
isOk()
indica un errore di trasporto o una chiamata non riuscita a causa di una logica
errore nel codice sviluppatore (ad esempio, passaggio di nullptr
come stato sincrono
il callback, description()
può essere chiamato sull'oggetto Return to
restituiscono una stringa adatta per il logging. In questi casi, non è possibile in alcun modo
determinare la quantità di codice che potrebbe essere stata eseguita sul server in seguito
chiamata non riuscita. Viene fornito anche il metodo isDeadObject()
. Questo
indica che !isOk()
è perché l'oggetto remoto ha
si è arrestato in modo anomalo o non esiste più. isDeadObject()
implica sempre
!isOk()
.
Restituisci per valore
Se l'istruzione generates
è mappata a una singola primitiva C++, nessuna
il parametro callback si trova nell'elenco di parametri. Al contrario, un'implementazione fornisce
il valore restituito T
in un oggetto Return<T>
, che
può essere generato implicitamente dal tipo primitivo T
. Per
esempio:
Return<uint32_t> someMethod() { uint32_t return_data = ...; // Compute return_data return return_data; };
Viene fornito anche il metodo Return<*>::withDefault
. Questo
fornisce un valore nei casi in cui il valore restituito è !isOk()
.
Questo metodo contrassegna automaticamente anche l'oggetto restituito come OK, in modo che il client
processo non verrà interrotto.
Restituisci utilizzando il parametro callback
Un callback può ritrasmettere il valore restituito della funzione HIDL al chiamante.
Il prototipo del callback è un oggetto std::function
con
parametri (tratto dall'istruzione generates
) mappati a C++
di testo. Il suo valore restituito è void: il callback stesso non restituisce alcun valore.
Il valore restituito di una funzione C++ con un parametro di callback ha il tipo
Return<void>
. L'implementazione del server è responsabile solo
per fornire il valore restituito. I valori restituiti sono già stati trasferiti
con il callback, il parametro del modello T
è void
:
Return<void> someMethod(someMethod_cb _cb);
Dalla loro implementazione C++, le implementazioni del server devono restituire
Void()
, una funzione in linea statica che restituisce un
Oggetto Return<void>
. Esempio di un metodo server tipico
con un parametro di callback:
Return<void> someMethod(someMethod_cb _cb) { // Do some processing, then call callback with return data hidl_vec<uint32_t> vec = ... _cb(vec); return Void(); };
Funzioni senza valori restituiti
La firma C++ di una funzione senza un'istruzione generates
non avrà un parametro di callback nell'elenco di parametri. Il tipo restituito
essere Return<void>.
Funzioni unidirezionali
Le funzioni contrassegnate con la parola chiave oneway
sono asincrone
(i client non bloccheranno durante l'esecuzione) e non restituiranno
e i relativi valori. La firma C++ di una funzione oneway
non avrà una
parametro di callback nell'elenco di parametri e il relativo valore restituito C++ sarà
Return<void>
.