2017-04-14 10 views
4

systemdのsd-bus.hファイルには、オプションでslot引数をとるAPIがいくつかあります。ここではいくつかの例です:sd-bus(C言語)の 'スロット'とは何か

int sd_bus_call_async(sd_bus *bus, sd_bus_slot **slot, sd_bus_message *m, sd_bus_message_handler_t callback, void *userdata, uint64_t usec); 
int sd_bus_add_filter(sd_bus *bus, sd_bus_slot **slot, sd_bus_message_handler_t callback, void *userdata); 
int sd_bus_add_fallback(sd_bus *bus, sd_bus_slot **slot, const char *prefix, sd_bus_message_handler_t callback, void *userdata); 

呼び出し元のコードがNULLを指定する場合、それは私が呼び出し元のコードはそれを心配する必要はありません意味推測する「フローティング・スロット」になります。

私はそこから参照例のソースコードのほとんどは、このサンプルプロジェクトのようなものです:https://github.com/tasleson/dbus-signals/blob/6d0e43d02d24ed51a17ce7df15a3a0a64ec0170d/spamsignals.c#L160

それはスロットを取り、その後、いつか後にはスロットをunreferences。しかし実際にはそれで何もしません。

+1

'スロット'は、ハードウェアバス内の物理的な場所です。スロットには番号が付けられます(列挙されます)。多くの場合、0からコネクタ(スロット)の数から1を引いた値から始まります。アドオンボードはスロットに配置できます。 –

+0

これは 'systemd'の' sd-bus'に特有のソフトウェアに関する質問です。私はハードウェアについて全く話していません。 –

答えて

3

自分のスロットに合格することで、あなたのsd-bus-matchのライフがスロットの1つに絡みつくようになります。この方法では、あなたがスロットを参照していないときにも、あなたはマッチを破壊しています。
それ以外の場合は、NULLを渡すと、バスオブジェクト自体のものと一致するようになります。
リストされている他の機能も同じです:
*スロット付きのsd_bus_call_asyncは、スロットを参照しないことで非同期呼び出しを破棄するオプションを提供します。
*スロットを持つsd_bus_add_filterは、そのスロットを参照していないときにフィルタを破棄します。
私はそれについて聞いたことがないので、sd_bus_add_fallbackについてはわかりません。
スロットが未参照になったときに関数が呼び出されているかどうかを確認してください:https://github.com/systemd/systemd/blob/a7753693547233e4a1d6e10b1a8f6515a477f227/src/libsystemd/sd-bus/bus-slot.c#L68

3

フェデリコは正しいでしょうが、スロットは基本的に不透明なハンドルで、sd_busハンドル(vtable、マッチルール、フィルタなど)にアタッチしているオブジェクトのライフサイクルを管理できます。これは、何かを追加して後で削除する場合に便利です。

追加しているオブジェクトがプロセスの存続期間中に残っている場合や、それを接続するsd_busハンドルの場合は、おそらくNULLを渡す必要があります。

関連する問題