Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 56ae4261 authored by Aravind Akella's avatar Aravind Akella
Browse files

SensorService performance improvements.

  i) Send ack for wake_up sensors on the socket connection instead of using Binder RPC.
  ii) Cache events per connection in case there are write failures. Compute cache size
      from FIFO counts of sensors.
 iii) Send FlushCompleteEvent only for apps that explicitly called flush().

Change-Id: I018969736b7794b1b930529586f2294a03ee8667
parent 2cbba477
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -48,6 +48,9 @@ public:
    // get receive file-descriptor
    int getFd() const;

    // get the send file-descriptor.
    int getSendFd() const;

    // send objects (sized blobs). All objects are guaranteed to be written or the call fails.
    template <typename T>
    static ssize_t sendObjects(const sp<BitTube>& tube,
+0 −1
Original line number Diff line number Diff line
@@ -40,7 +40,6 @@ public:
                                   nsecs_t maxBatchReportLatencyNs, int reservedFlags) = 0;
    virtual status_t setEventRate(int handle, nsecs_t ns) = 0;
    virtual status_t flush() = 0;
    virtual void decreaseWakeLockRefCount() = 0;
};

// ----------------------------------------------------------------------------
+5 −0
Original line number Diff line number Diff line
@@ -99,6 +99,11 @@ int BitTube::getFd() const
    return mReceiveFd;
}

int BitTube::getSendFd() const
{
    return mSendFd;
}

ssize_t BitTube::write(void const* vaddr, size_t size)
{
    ssize_t err, len;
+1 −14
Original line number Diff line number Diff line
@@ -34,8 +34,7 @@ enum {
    GET_SENSOR_CHANNEL = IBinder::FIRST_CALL_TRANSACTION,
    ENABLE_DISABLE,
    SET_EVENT_RATE,
    FLUSH_SENSOR,
    DECREASE_WAKE_LOCK_REFCOUNT
    FLUSH_SENSOR
};

class BpSensorEventConnection : public BpInterface<ISensorEventConnection>
@@ -84,13 +83,6 @@ public:
        remote()->transact(FLUSH_SENSOR, data, &reply);
        return reply.readInt32();
    }

    virtual void decreaseWakeLockRefCount() {
        Parcel data, reply;
        data.writeInterfaceToken(ISensorEventConnection::getInterfaceDescriptor());
        remote()->transact(DECREASE_WAKE_LOCK_REFCOUNT, data, &reply, IBinder::FLAG_ONEWAY);
        return;
    }
};

IMPLEMENT_META_INTERFACE(SensorEventConnection, "android.gui.SensorEventConnection");
@@ -133,11 +125,6 @@ status_t BnSensorEventConnection::onTransact(
            reply->writeInt32(result);
            return NO_ERROR;
        } break;
        case DECREASE_WAKE_LOCK_REFCOUNT: {
            CHECK_INTERFACE(ISensorEventConnection, data, reply);
            decreaseWakeLockRefCount();
            return NO_ERROR;
        } break;
    }
    return BBinder::onTransact(code, data, reply, flags);
}
+9 −1
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

#include <stdint.h>
#include <sys/types.h>
#include <sys/socket.h>

#include <utils/Errors.h>
#include <utils/RefBase.h>
@@ -147,7 +148,14 @@ status_t SensorEventQueue::setEventRate(Sensor const* sensor, nsecs_t ns) const
void SensorEventQueue::sendAck(const ASensorEvent* events, int count) {
    for (int i = 0; i < count; ++i) {
        if (events[i].flags & WAKE_UP_SENSOR_EVENT_NEEDS_ACK) {
            mSensorEventConnection->decreaseWakeLockRefCount();
            // Send just a byte of data to acknowledge for the wake up sensor events
            // received
            char buf = '1';
            ssize_t size = ::send(mSensorChannel->getFd(), &buf, sizeof(buf),
                                             MSG_DONTWAIT | MSG_NOSIGNAL);
            if (size < 0) {
                ALOGE("sendAck failure %d", size);
            }
        }
    }
    return;
Loading