Android GingerBread Sensor HAL ひず぀のプロセス間でのメッセヌゞのやりずりに぀いお

241 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