İşlevler

HIDL arayüzündeki işlevler, otomatik olarak oluşturulan IFoo C++ sınıf bildirimindeki yöntemlerle eşlenir. C++'da her işlevin adı aynı kalır; aşağıdaki bölümlerde HIDL bağımsız değişkenlerinin ve dönüş değerlerinin C++'a nasıl çevrildiği açıklanmaktadır.

Fonksiyon parametreleri

.hal dosyasında listelenen bağımsız değişkenler C++ veri türleriyle eşleşir. İlkel bir C++ türüyle eşleşmeyen bağımsız değişkenler const referansıyla iletilir.

Bir dönüş değeri olan (bir generates ifadesi olan) her HIDL işlevi için, o işlevin C++ parametre listesinde ek bir bağımsız değişken bulunur: HIDL işlevinin dönüş değerleriyle çağrılan bir geri çağırma işlevi. Bir istisna vardır: generates tümcesi doğrudan bir C++ temel öğesiyle eşleşen tek bir parametre içeriyorsa, geri çağırma seçimi kullanılır (geri çağırma kaldırılır ve dönüş değeri, normal bir return ifadesi aracılığıyla işlevden döndürülür).

İşlev dönüş değerleri

Aşağıdaki fonksiyonların dönüş değerleri vardır.

Taşıma hataları ve dönüş türü

generates deyimi üç tür işlev imzasıyla sonuçlanabilir:

  • C++ temel öğesi olan yalnızca bir dönüş değeri için, generates dönüş değeri, Return<T> nesnesindeki işlevden gelen değere göre döndürülür.
  • Daha karmaşık durumlarda, generates dönüş değerleri, işlev çağrısının kendisi ile sağlanan geri çağırma parametresi aracılığıyla döndürülür ve işlev, Return<void> değerini döndürür.
  • Çünkü hiçbir generates ifadesi mevcut olmadığında, işlev Return<void> değerini döndürür.

RPC çağrıları zaman zaman aktarım hatalarıyla karşılaşabilir; örneğin sunucu öldüğünde, aktarım kaynakları çağrıyı tamamlamak için yetersiz olduğunda veya iletilen parametreler çağrının tamamlanmasına izin vermediğinde (gerekli bir geri çağırma işlevinin eksik olması gibi). Return nesneleri, aktarım hatası göstergelerinin yanı sıra bir T değerini de saklar ( Return<void> hariç).

İstemci tarafı ve sunucu tarafı işlevleri aynı imzaya sahip olduğundan, sunucu tarafı işlevi, uygulaması aktarım hatalarını işaret etmese bile bir Return türü döndürmelidir. Return<T> nesneleri Return(myTValue) ile oluşturulur (veya return ifadelerinde olduğu gibi mTValue öğesinden örtülü olarak oluşturulabilir) ve Return<void> nesneleri Void() ile oluşturulur.

Return<T> nesnelerinin T değerlerine ve T değerlerinden örtülü dönüşümü vardır. Return nesnesi isOk() yöntemi çağrılarak aktarım hatalarına karşı kontrol edilebilir. Bu kontrol gerekli değildir; ancak bir hata oluşursa ve Return nesnesi yok edilene kadar kontrol edilmezse veya bir T değeri dönüştürme girişiminde bulunulursa, istemci işlemi sonlandırılır ve bir hata günlüğe kaydedilir. isOk() bir aktarım hatasını veya geliştirici kodundaki bir mantık hatasından kaynaklanan bir çağrı hatasını gösteriyorsa ( nullptr eşzamanlı geri çağırma olarak iletmek gibi), o zaman günlüğe kaydetmeye uygun bir dize döndürmek için Return nesnesinde description() çağrılabilir. Bu gibi durumlarda, başarısız çağrı sonucunda sunucuda ne kadar kodun çalıştırıldığını belirlemenin bir yolu yoktur. isDeadObject() yöntemi de sağlanmaktadır. Bu yöntem !isOk() öğesinin uzak nesnenin çökmesinden veya artık mevcut olmamasından kaynaklandığını gösterir. isDeadObject() her zaman !isOk() anlamına gelir.

Değere göre dönüş

generates deyimi tek bir C++ temel öğesiyle eşleşiyorsa, parametre listesinde hiçbir geri çağırma parametresi yoktur. Bunun yerine, bir uygulama, T ilkel türünden örtülü olarak oluşturulabilen bir Return<T> nesnesinde T dönüş değerini sağlar. Örneğin:

Return<uint32_t> someMethod() {
    uint32_t return_data = ...; // Compute return_data
    return return_data;
};

Return<*>::withDefault yöntemi de sağlanır. Bu yöntem, dönüş değerinin !isOk() olduğu durumlarda bir değer sağlar. Bu yöntem ayrıca, istemci işleminin sonlandırılmaması için dönüş nesnesini otomatik olarak tamam olarak işaretler.

Geri arama parametresini kullanarak geri dön

Geri arama, HIDL işlevinin dönüş değerini arayana geri iletebilir. Geri çağırmanın prototipi, C++ türleriyle eşlenen parametrelere ( generates deyiminden alınan) sahip bir std::function nesnesidir. Dönüş değeri geçersizdir; geri çağırmanın kendisi bir değer döndürmez.

Geri çağırma parametresine sahip bir C++ işlevinin dönüş değeri Return<void> türüne sahiptir. Sunucu uygulaması yalnızca dönüş değerinin sağlanmasından sorumludur. Dönüş değerleri zaten geri çağırma kullanılarak aktarıldığından, T şablon parametresi void :

Return<void> someMethod(someMethod_cb _cb);

Sunucu uygulamaları, C++ uygulamalarından, bir Return<void> nesnesi döndüren statik bir satır içi işlev olan Void() işlevini döndürmelidir. Geri çağırma parametresiyle tipik bir sunucu yöntemi uygulaması örneği:

Return<void> someMethod(someMethod_cb _cb) {
    // Do some processing, then call callback with return data
    hidl_vec<uint32_t> vec = ...
    _cb(vec);
    return Void();
};

Dönüş değeri olmayan işlevler

generates deyimi olmayan bir işlevin C++ imzasının, parametre listesinde bir geri çağırma parametresi bulunmaz. Dönüş türü Return<void>.

Tek yönlü işlevler

oneway anahtar sözcüğüyle işaretlenen işlevler eşzamansız işlevlerdir (istemciler bunların yürütülmesini engellemez) ve dönüş değerleri yoktur. oneway bir işlevin C++ imzası, parametre listesinde bir geri çağırma parametresine sahip olmayacaktır ve C++ dönüş değeri Return<void> olacaktır.