Android GingerBread Sensor HAL ひとつのプロセス間でのメッセージのやりとりについて

234 views
Skip to first unread message

蔵花たけし

unread,
Dec 6, 2011, 1:23:45 PM12/6/11
to Android-Embedded-Japan
蔵花です。

http://gitorious.org/xdandroid/device_xdandroid/blobs/fef368f7e6d4ec82a7eeae39cc85b556cae58014/msm/libsensors/nusensors.cpp

activate( ):
const char wakeMessage(WAKE_MESSAGE);
write(mWritePipeFd, &wakeMessage, 1);

pollEvents( ):
if (mPollFds[wake].revents & POLLIN) {
read(mPollFds[wake].fd, &msg, 1);
}

についてなのですが、

なぜpipeをつかってメッセージのWrite/Read
をおこなう必要があるのでしょうか?
このメッセージのやりとりによっていったい何が行われるのでしょうか?
ご教示のほどよろしくお願いします。

以上

koba

unread,
Dec 6, 2011, 10:56:06 PM12/6/11
to Android-Embedded-Japan
kobaです。

On 12月7日, 午前3:23, 蔵花たけし <kuraba...@gmail.com> wrote:

> なぜpipeをつかってメッセージのWrite/Read
> をおこなう必要があるのでしょうか?

蔵花たけしさんだったらpipeを使わずにどのように実装しますか?
それとpipeを使った場合の比較をすることで理解が深まると思います。

> このメッセージのやりとりによっていったい何が行われるのでしょうか?

蔵花たけしさんなりの仮説を書いてみてください。そうすればそれを検証するためのアイディアがもらえるかもしれません。

なお、上手な質問をするために以下のページが参考になります。

技術系メーリングリストで質問するときのパターン・ランゲージ
「問題の解決」から「情報の共有」に至るために
http://www.hyuki.com/writing/techask.html

蔵花たけし

unread,
Dec 7, 2011, 7:54:47 AM12/7/11
to Android-Embedded-Japan
>
> 蔵花たけしさんだったらpipeを使わずにどのように実装しますか?
> それとpipeを使った場合の比較をすることで理解が深まると思います。

私はこのwrite/readは必要ないと考えています。
よって、pipe()など使用する必要性はまったくありません。
poll(mPollFds, numFds, nbEvents ? 0 : -1);
で監視するのは、センサー用に用意したファイルディスクリプタだけ
監視すればよいと考えています。
ただ、これらのファイルディスクリプタにデータが来なかった場合、
poll()は待機状態になってしまう危険性があります。
そこで、poll()の第3引数は、-1(timeout に負の値を指定すると、タイムアウト時間が無限)ではなく、
0以上のタイムアウト時間を設定すればよいのではないかとおもうのですが。
なぜこんな危険な仕様にしたのか検討もつきません。

koba

unread,
Dec 7, 2011, 8:20:19 AM12/7/11
to Android-Embedded-Japan
kobaです。

activate( ) とpollEvents( ) は別々のスレッドで呼ばれるのではないかな。
そうすれば、poll()でタイムアウトを無限にしていても問題がない。
排他制御を考慮したスレッド間のデータのやりとりのためにpipeを使っているのだと思います。

蔵花たけし

unread,
Dec 9, 2011, 11:56:39 AM12/9/11
to Android-Embedded-Japan
> 排他制御を考慮したスレッド間のデータのやりとりのためにpipeを使っているのだと思います。

static const char WAKE_MESSAGE = 'W';
const char wakeMessage(WAKE_MESSAGE);
int result = write(mWritePipeFd, &wakeMessage, 1);

"W"というメッセージをおくっているだけで、それ以外の
データをおくっていません。
それだけのためにpipeをつかっているのでしょうか?
これが排他制御に関連しているとは思えません。

私は、「これらのファイルディスクリプタにデータが来なかった場合、
poll()は待機状態になってしまう危険性があります」
と書きましたが、この危険を回避するために存在するのでは
ないでしょうか?
すなわち、activate()をcallすることで、確実にファイルディスクリプタには
書き込みが行われ,pollEvents()にて読み込みが行われ、
無限に待機するという状態を回避することができます。

On 12月7日, 午後10:20, koba <tetsu.k...@gmail.com> wrote:
> kobaです。
>
> activate( ) とpollEvents( ) は別々のスレッドで呼ばれるのではないかな。
> そうすれば、poll()でタイムアウトを無限にしていても問題がない。
>

蔵花たけし

unread,
Dec 9, 2011, 10:20:43 PM12/9/11
to Android-Embedded-Japan
「データのやりとりのためにpipeはつかってない」
とおもいますが、
sensor用のファイルディスクリプタを「共有資源」と考えた場合、
確かに排他制御になっていますね。
sensor用のファイルディスクリプタ とsensor以外のファイルディスクリプタ
を用意しておき、これらをpoll()で監視していた場合、
ファイルディスクリプタにデータが到着するのをまっている状態が「ロック状態」で、
sensor以外のファイルディスクリプタにデータを書き込んでやれば、
確実にロック状態は解除されますね。

この「sensor以外のファイルディスクリプタ」を用意しないといけないわけですが、
なぜ、外部にファイルディスクリプタを用意するのではなく、内部のファイルディスクリプタ
(pipe()用)を用意したのでしょうか?
ロックを開放するときだけ、一時的にファイルディスクリプタを用意したい。
そこで、ファイルを利用せず、メモリー上のバッファを利用すればよいのでは
とおもったのでは?それにはpipe()用のファイルディスクリプタが一番よいと。

Reply all
Reply to author
Forward
0 new messages