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


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


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

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


class BpSensorEventConnection : public BpInterface<ISensorEventConnection>
class BpSensorEventConnection : public BpInterface<ISensorEventConnection>
@@ -84,13 +83,6 @@ public:
        remote()->transact(FLUSH_SENSOR, data, &reply);
        remote()->transact(FLUSH_SENSOR, data, &reply);
        return reply.readInt32();
        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");
IMPLEMENT_META_INTERFACE(SensorEventConnection, "android.gui.SensorEventConnection");
@@ -133,11 +125,6 @@ status_t BnSensorEventConnection::onTransact(
            reply->writeInt32(result);
            reply->writeInt32(result);
            return NO_ERROR;
            return NO_ERROR;
        } break;
        } break;
        case DECREASE_WAKE_LOCK_REFCOUNT: {
            CHECK_INTERFACE(ISensorEventConnection, data, reply);
            decreaseWakeLockRefCount();
            return NO_ERROR;
        } break;
    }
    }
    return BBinder::onTransact(code, data, reply, flags);
    return BBinder::onTransact(code, data, reply, flags);
}
}
+9 −1
Original line number Original line Diff line number Diff line
@@ -18,6 +18,7 @@


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


#include <utils/Errors.h>
#include <utils/Errors.h>
#include <utils/RefBase.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) {
void SensorEventQueue::sendAck(const ASensorEvent* events, int count) {
    for (int i = 0; i < count; ++i) {
    for (int i = 0; i < count; ++i) {
        if (events[i].flags & WAKE_UP_SENSOR_EVENT_NEEDS_ACK) {
        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;
    return;
Loading