I was guessing that was the case. Thanks for the confirmation. But because the original fd returned by getDataChanel is used to create an instance of ParcelFileDescriptor (mSensorDataFd) before the event handling thread is spawned, does anything happen behind the scenes to make the descriptor local to that thread? I'm asking both because in sensors.h there's a comment 'The caller takes ownership of this fd. This is intended to be passed cross processes.' (referring to open_data_source) and because if the descriptor isn't made thread- local by the Parcel code, I don't see why one would use a ParcelFileDescriptor instance in the first place.
Further, the event handler thread closes mSensorDataFd. The event handler thread dies every time there are no more listeners. Registering a new listener would then cause a new handler thread to get spawned. That will call getDataChanel again. So the really I'm asking whether getDataChanel has to open the device again, or whether it can just open it once over the life of the SensorManager process? On Apr 2, 12:10 am, pixelflinger <[email protected]> wrote: > There is only one thread per process handling the events. Note that > there should only be one instance of SensorManager as well (it's a > singleton). > > It's therefore not possible to have more than one thread per process > using the low-level sensor api from Java. > > Mathias > > On Wed, Apr 1, 2009 at 4:26 PM, Huaka‘i Po <[email protected]> wrote: > > > (reposting from android-framework) > > Hi all, > > is the file descriptor in SensorManager.java global to all threads? > > > In setting up the event dispatch thread for sensor events, there is a > > call > > ParcelFileDescriptor fd = service.getDataChanel(); > > getDataChanel() eventually winds up calling open_data_source in the > > sensor framework, which returns an open Linux fd. Then the code > > instantiates a new thread with a SensorThreadRunnable, part of which > > is here: > > > private class SensorThreadRunnable implements Runnable { > > private ParcelFileDescriptor mSensorDataFd; > > SensorThreadRunnable(ParcelFileDescriptor fd) { > > mSensorDataFd = fd; > > } > > ... > > > The run() method of SensorThreadRunnable later closes mSensorDataFd. > > Does that close the original fd returned by getDataChanel? (i.e. is > > the fd the same one in both threads, or are the semantics more like > > dup > > () because of the Parcel stuff?) > > > Thanks, > > Hod --~--~---------~--~----~------------~-------~--~----~ unsubscribe: [email protected] website: http://groups.google.com/group/android-porting -~----------~----~----~----~------~----~------~--~---
