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

Commit 65dbe971 authored by Jon McCaffrey's avatar Jon McCaffrey
Browse files

InputDispatcher: Optimize count()

Count items as they are added and removed rather than iterating over the
entire list to count them.

Increases performance slightly, particularly when tracing is turned on,
which causes count to be queried more often, and when the number of
items in the queues grow large.  This can happen due to applications not
responding, for example.

Change-Id: I0f11f7edd46089612af910cdfabfeb3ee685d7d9
parent fecc0bf4
Loading
Loading
Loading
Loading
+0 −12
Original line number Original line Diff line number Diff line
@@ -3814,18 +3814,6 @@ void InputDispatcher::monitor() {
}
}




// --- InputDispatcher::Queue ---

template <typename T>
uint32_t InputDispatcher::Queue<T>::count() const {
    uint32_t result = 0;
    for (const T* entry = head; entry; entry = entry->next) {
        result += 1;
    }
    return result;
}


// --- InputDispatcher::InjectionState ---
// --- InputDispatcher::InjectionState ---


InputDispatcher::InjectionState::InjectionState(int32_t injectorPid, int32_t injectorUid) :
InputDispatcher::InjectionState::InjectionState(int32_t injectorPid, int32_t injectorUid) :
+9 −2
Original line number Original line Diff line number Diff line
@@ -606,8 +606,9 @@ private:
    struct Queue {
    struct Queue {
        T* head;
        T* head;
        T* tail;
        T* tail;
        uint32_t entryCount;


        inline Queue() : head(NULL), tail(NULL) {
        inline Queue() : head(NULL), tail(NULL), entryCount(0) {
        }
        }


        inline bool isEmpty() const {
        inline bool isEmpty() const {
@@ -615,6 +616,7 @@ private:
        }
        }


        inline void enqueueAtTail(T* entry) {
        inline void enqueueAtTail(T* entry) {
            entryCount++;
            entry->prev = tail;
            entry->prev = tail;
            if (tail) {
            if (tail) {
                tail->next = entry;
                tail->next = entry;
@@ -626,6 +628,7 @@ private:
        }
        }


        inline void enqueueAtHead(T* entry) {
        inline void enqueueAtHead(T* entry) {
            entryCount++;
            entry->next = head;
            entry->next = head;
            if (head) {
            if (head) {
                head->prev = entry;
                head->prev = entry;
@@ -637,6 +640,7 @@ private:
        }
        }


        inline void dequeue(T* entry) {
        inline void dequeue(T* entry) {
            entryCount--;
            if (entry->prev) {
            if (entry->prev) {
                entry->prev->next = entry->next;
                entry->prev->next = entry->next;
            } else {
            } else {
@@ -650,6 +654,7 @@ private:
        }
        }


        inline T* dequeueAtHead() {
        inline T* dequeueAtHead() {
            entryCount--;
            T* entry = head;
            T* entry = head;
            head = entry->next;
            head = entry->next;
            if (head) {
            if (head) {
@@ -660,7 +665,9 @@ private:
            return entry;
            return entry;
        }
        }


        uint32_t count() const;
        uint32_t count() const {
            return entryCount;
        }
    };
    };


    /* Specifies which events are to be canceled and why. */
    /* Specifies which events are to be canceled and why. */