Funzioni

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 Oggetto Return<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 restituisce Return<void>.
  • Per quando non esistono istruzioni generates, la funzione restituisce Return<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>.