/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #undef NDEBUG #include <assert.h> #include <cutils/memory.h> #include <cutils/log.h> #include <utils/Errors.h> #include <private/surfaceflinger/SharedBufferStack.h> using namespace android; void log(const char* prefix, int *b, size_t num); void test0(SharedBufferServer& s, SharedBufferClient& c, size_t num, int* list); // ---------------------------------------------------------------------------- int main(int argc, char** argv) { SharedClient client; SharedBufferServer s(&client, 0, 4, 0); SharedBufferClient c(&client, 0, 4, 0); printf("basic test 0\n"); int list0[4] = {0, 1, 2, 3}; test0(s, c, 4, list0); printf("basic test 1\n"); int list1[4] = {2, 1, 0, 3}; test0(s, c, 4, list1); int b = c.dequeue(); c.lock(b); c.queue(b); s.retireAndLock(); printf("basic test 2\n"); int list2[4] = {1, 2, 3, 0}; test0(s, c, 4, list2); printf("resize test\n"); class SetBufferCountIPC : public SharedBufferClient::SetBufferCountCallback { SharedBufferServer& s; virtual status_t operator()(int bufferCount) const { return s.resize(bufferCount); } public: SetBufferCountIPC(SharedBufferServer& s) : s(s) { } } resize(s); c.setBufferCount(6, resize); int list3[6] = {3, 2, 1, 4, 5, 0}; test0(s, c, 6, list3); return 0; } void log(const char* prefix, int *b, size_t num) { printf("%s: ", prefix); for (size_t i=0 ; i<num ; i++) { printf("%d ", b[i]); } printf("\n"); } // ---------------------------------------------------------------------------- void test0( SharedBufferServer& s, SharedBufferClient& c, size_t num, int* list) { status_t err; int b[num], u[num], r[num]; for (size_t i=0 ; i<num ; i++) { b[i] = c.dequeue(); assert(b[i]==list[i]); } log("DQ", b, num); for (size_t i=0 ; i<num-1 ; i++) { err = c.lock(b[i]); assert(err==0); } log("LK", b, num-1); for (size_t i=0 ; i<num-1 ; i++) { err = c.queue(b[i]); assert(err==0); } log(" Q", b, num-1); for (size_t i=0 ; i<num-1 ; i++) { r[i] = s.retireAndLock(); assert(r[i]==list[i]); err = s.unlock(r[i]); assert(err == 0); } log("RT", r, num-1); err = c.lock(b[num-1]); assert(err == 0); log("LK", b+num-1, 1); err = c.queue(b[num-1]); assert(err == 0); log(" Q", b+num-1, 1); r[num-1] = s.retireAndLock(); assert(r[num-1]==list[num-1]); err = s.unlock(r[num-1]); assert(err == 0); log("RT", r+num-1, 1); // ------------------------------------ printf("\n"); for (size_t i=0 ; i<num ; i++) { b[i] = c.dequeue(); assert(b[i]==list[i]); } log("DQ", b, num); for (size_t i=0 ; i<num-1 ; i++) { err = c.lock(b[i]); assert(err==0); } log("LK", b, num-1); for (size_t i=0 ; i<num-1 ; i++) { u[i] = b[num-2-i]; } u[num-1] = b[num-1]; for (size_t i=0 ; i<num-1 ; i++) { err = c.queue(u[i]); assert(err==0); } log(" Q", u, num-1); for (size_t i=0 ; i<num-1 ; i++) { r[i] = s.retireAndLock(); assert(r[i]==u[i]); err = s.unlock(r[i]); assert(err == 0); } log("RT", r, num-1); err = c.lock(b[num-1]); assert(err == 0); log("LK", b+num-1, 1); err = c.queue(b[num-1]); assert(err == 0); log(" Q", b+num-1, 1); r[num-1] = s.retireAndLock(); assert(r[num-1]==list[num-1]); err = s.unlock(r[num-1]); assert(err == 0); log("RT", r+num-1, 1); // ------------------------------------ printf("\n"); for (size_t i=0 ; i<num ; i++) { b[i] = c.dequeue(); assert(b[i]==u[i]); } log("DQ", b, num); for (size_t i=0 ; i<num-1 ; i++) { err = c.lock(b[i]); assert(err==0); } log("LK", b, num-1); for (size_t i=0 ; i<num-1 ; i++) { err = c.queue(b[i]); assert(err==0); } log(" Q", b, num-1); for (size_t i=0 ; i<num-1 ; i++) { r[i] = s.retireAndLock(); assert(r[i]==u[i]); err = s.unlock(r[i]); assert(err == 0); } log("RT", r, num-1); err = c.lock(u[num-1]); assert(err == 0); log("LK", u+num-1, 1); err = c.queue(u[num-1]); assert(err == 0); log(" Q", u+num-1, 1); r[num-1] = s.retireAndLock(); assert(r[num-1]==u[num-1]); err = s.unlock(r[num-1]); assert(err == 0); log("RT", r+num-1, 1); // ------------------------------------ printf("\n"); b[0] = c.dequeue(); assert(b[0]==u[0]); log("DQ", b, 1); c.undoDequeue(b[0]); assert(err == 0); log("UDQ", b, 1); // ------------------------------------ printf("\n"); for (size_t i=0 ; i<num ; i++) { b[i] = c.dequeue(); assert(b[i]==u[i]); } log("DQ", b, num); for (size_t i=0 ; i<num-1 ; i++) { err = c.lock(b[i]); assert(err==0); } log("LK", b, num-1); for (size_t i=0 ; i<num-1 ; i++) { err = c.queue(b[i]); assert(err==0); } log(" Q", b, num-1); for (size_t i=0 ; i<num-1 ; i++) { r[i] = s.retireAndLock(); assert(r[i]==u[i]); err = s.unlock(r[i]); assert(err == 0); } log("RT", r, num-1); err = c.lock(u[num-1]); assert(err == 0); log("LK", u+num-1, 1); err = c.queue(u[num-1]); assert(err == 0); log(" Q", u+num-1, 1); r[num-1] = s.retireAndLock(); assert(r[num-1]==u[num-1]); err = s.unlock(r[num-1]); assert(err == 0); log("RT", r+num-1, 1); printf("\n"); }