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şlevReturn<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.