diff options
| author | 2010-06-08 20:14:11 -0700 | |
|---|---|---|
| committer | 2010-06-08 20:14:11 -0700 | |
| commit | 74b3237fa93d73bcc44c57021c261bd81b9d9c9b (patch) | |
| tree | fcdb35e14852bd834d1d702aa94f07e2f3405942 /libs/surfaceflinger/SurfaceFlinger.cpp | |
| parent | 9cc61ca4877e8215ecf691d0cae2876be8329249 (diff) | |
| parent | 579b3f88d03d06b897b778bd11818f5104677d1d (diff) | |
Merge "allow re-targetting of surfaces" into kraken
Diffstat (limited to 'libs/surfaceflinger/SurfaceFlinger.cpp')
| -rw-r--r-- | libs/surfaceflinger/SurfaceFlinger.cpp | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/libs/surfaceflinger/SurfaceFlinger.cpp b/libs/surfaceflinger/SurfaceFlinger.cpp index 49268588b5..4dea62f410 100644 --- a/libs/surfaceflinger/SurfaceFlinger.cpp +++ b/libs/surfaceflinger/SurfaceFlinger.cpp @@ -1718,7 +1718,10 @@ void UserClient::detachLayer(const Layer* layer) { int32_t name = layer->getToken(); if (name >= 0) { - android_atomic_and(~(1LU<<name), &mBitmap); + int32_t mask = 1LU<<name; + if ((android_atomic_and(~mask, &mBitmap) & mask) == 0) { + LOGW("token %d wasn't marked as used %08x", name, int(mBitmap)); + } } } @@ -1732,17 +1735,23 @@ ssize_t UserClient::getTokenForSurface(const sp<ISurface>& sur) const sp<Layer> layer(mFlinger->getLayer(sur)); if (layer == 0) return name; - // this layer already has a token, just return it - // FIXME: we should check that this token is for the same client + // if this layer already has a token, just return it name = layer->getToken(); - if (name >= 0) return name; + if ((name >= 0) && (layer->getClient() == this)) + return name; name = 0; do { int32_t mask = 1LU<<name; if ((android_atomic_or(mask, &mBitmap) & mask) == 0) { // we found and locked that name - layer->setToken(const_cast<UserClient*>(this), ctrlblk, name); + status_t err = layer->setToken( + const_cast<UserClient*>(this), ctrlblk, name); + if (err != NO_ERROR) { + // free the name + android_atomic_and(~mask, &mBitmap); + name = err; + } break; } if (++name > 31) |