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

Commit 879a5631 authored by Android (Google) Code Review's avatar Android (Google) Code Review
Browse files

Merge change 24642 into eclair

* changes:
  make sure conditions will return when the status of a surface is not NO_ERROR
parents 6731d8c9 b58b5d72
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -93,12 +93,12 @@ public:
    volatile int32_t available; // number of dequeue-able buffers
    volatile int32_t queued;    // number of buffers waiting for post
    volatile int32_t inUse;     // buffer currently in use by SF
    volatile status_t status;   // surface's status code

    // not part of the conditions
    volatile int32_t reallocMask;

    int32_t     identity;       // surface's identity (const)
    status_t    status;         // surface's status code
    int32_t     reserved32[13];
    FlatRegion  dirtyRegion[NUM_BUFFER_MAX];    // 12*4=48 bytes
};
@@ -168,10 +168,11 @@ protected:
template <typename T>
status_t SharedBufferBase::waitForCondition(T condition) 
{
    const SharedBufferStack& stack( *mSharedStack );
    SharedClient& client( *mSharedClient );
    const nsecs_t TIMEOUT = s2ns(1); 
    Mutex::Autolock _l(client.lock);
    while (!condition()) {
    while ((condition()==false) && (stack.status == NO_ERROR)) {
        status_t err = client.cv.waitRelative(client.lock, TIMEOUT);
        
        // handle errors and timeouts
@@ -195,7 +196,7 @@ status_t SharedBufferBase::waitForCondition(T condition)
            }
        }
    }
    return NO_ERROR;
    return stack.status;
}


@@ -265,6 +266,7 @@ public:

    ssize_t retireAndLock();
    status_t unlock(int buffer);
    void setStatus(status_t status);
    status_t reallocate();
    status_t assertReallocate(int buffer);
    
@@ -283,6 +285,12 @@ private:
        inline ssize_t operator()();
    };

    struct StatusUpdate : public UpdateBase {
        const status_t status;
        inline StatusUpdate(SharedBufferBase* sbb, status_t status);
        inline ssize_t operator()();
    };

    struct ReallocateCondition : public ConditionBase {
        int buf;
        inline ReallocateCondition(SharedBufferBase* sbb, int buf);
+17 −1
Original line number Diff line number Diff line
@@ -64,7 +64,7 @@ status_t SharedClient::setIdentity(size_t token, uint32_t identity) {


SharedBufferStack::SharedBufferStack()
    : inUse(-1), identity(-1), status(NO_ERROR)
    : inUse(-1), status(NO_ERROR), identity(-1)
{
}

@@ -231,6 +231,16 @@ ssize_t SharedBufferServer::RetireUpdate::operator()() {
    return head;
}

SharedBufferServer::StatusUpdate::StatusUpdate(
        SharedBufferBase* sbb, status_t status)
    : UpdateBase(sbb), status(status) {
}

ssize_t SharedBufferServer::StatusUpdate::operator()() {
    android_atomic_write(status, &stack.status);
    return NO_ERROR;
}

// ============================================================================

SharedBufferClient::SharedBufferClient(SharedClient* sharedClient,
@@ -327,6 +337,12 @@ status_t SharedBufferServer::unlock(int buffer)
    return err;
}

void SharedBufferServer::setStatus(status_t status)
{
    StatusUpdate update(this, status);
    updateCondition( update );
}

status_t SharedBufferServer::reallocate()
{
    SharedBufferStack& stack( *mSharedStack );