exp/sensor: don't block the looper thread indefinitely

The sensor package had a deadlock case if it started to poll the
events but all sensors have been disabled on the underlying ALooper.

Consider the following program:

  app.Main(func(a app.App) {
    sensor.Enable(a, sensor.Gyroscope, time.Millisecond)
    go func() {
      time.Sleep(5 * time.Second)
      sensor.Disable(sensor.Gyroscope)
      time.Sleep(2 * time.Second)
      sensor.Enable(a, sensor.Gyroscope, time.Millisecond)
    }()
    for e := range a.Events() {
    case sensor.Event:
      //...
    }

The initial Enable will enable the gyroscope and start polling events
from the ALooper. After 5 seconds, the gyroscope will be disabled.

  ALooper_pollAll(-1, NULL, &events, NULL)

will block indefinately because there are no events will be
available until another sensor is enabled.

After 2 seconds, we will attempt to enable the gyroscope again. But,
the underlying thread will be blocked at pollAll and won't be able
to make the sensor enabling call on the same thread.

In order to overcome this deadlock case, this thread introduces a
hard timeout limit during polling. If timeout occurs, the looper
thread will be unblocked and select{} statement will be able to
handle {enable,disable,close}Signal cases.

Fixes golang/go#12501.

Change-Id: I35efa2e29057ca37f8ac0f38be8dc59c9b8262b3
Reviewed-on: https://go-review.googlesource.com/15438
Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
1 file changed
tree: 8053ff2a006eaa64a055cade2eba4a98e9490b5d
  1. app/
  2. asset/
  3. bind/
  4. cmd/
  5. doc/
  6. event/
  7. example/
  8. exp/
  9. geom/
  10. gl/
  11. internal/
  12. misc/
  13. testdata/
  14. .gitattributes
  15. .gitignore
  16. AUTHORS
  17. codereview.cfg
  18. CONTRIBUTING.md
  19. CONTRIBUTORS
  20. LICENSE
  21. PATENTS
  22. README.md
README.md

Go support for Mobile devices

The Go mobile repository holds packages and build tools for using Go on mobile platforms.

Package documentation as a starting point:

Caution image

The Go Mobile project is experimental. Use this at your own risk. While we are working hard to improve it, neither Google nor the Go team can provide end-user support.

This is early work and installing the build system requires Go 1.5. Follow the instructions on golang.org/wiki/Mobile to install the gomobile command, build the basic and the bind example apps.


Contributions to Go are appreciated. See https://golang.org/doc/contribute.html.