1 /* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #undef NDEBUG 18 19 #include <assert.h> 20 #include <cutils/memory.h> 21 #include <cutils/log.h> 22 #include <utils/Errors.h> 23 #include <private/surfaceflinger/SharedBufferStack.h> 24 25 using namespace android; 26 27 void log(const char* prefix, int *b, size_t num); 28 void test0(SharedBufferServer& s, SharedBufferClient& c, size_t num, int* list); 29 30 // ---------------------------------------------------------------------------- 31 32 int main(int argc, char** argv) 33 { 34 SharedClient client; 35 SharedBufferServer s(&client, 0, 4, 0); 36 SharedBufferClient c(&client, 0, 4, 0); 37 38 printf("basic test 0\n"); 39 int list0[4] = {0, 1, 2, 3}; 40 test0(s, c, 4, list0); 41 42 printf("basic test 1\n"); 43 int list1[4] = {2, 1, 0, 3}; 44 test0(s, c, 4, list1); 45 46 int b = c.dequeue(); 47 c.lock(b); 48 c.queue(b); 49 s.retireAndLock(); 50 51 printf("basic test 2\n"); 52 int list2[4] = {1, 2, 3, 0}; 53 test0(s, c, 4, list2); 54 55 56 printf("resize test\n"); 57 class SetBufferCountIPC : public SharedBufferClient::SetBufferCountCallback { 58 SharedBufferServer& s; 59 virtual status_t operator()(int bufferCount) const { 60 return s.resize(bufferCount); 61 } 62 public: 63 SetBufferCountIPC(SharedBufferServer& s) : s(s) { } 64 } resize(s); 65 66 c.setBufferCount(6, resize); 67 int list3[6] = {3, 2, 1, 4, 5, 0}; 68 test0(s, c, 6, list3); 69 70 return 0; 71 } 72 73 void log(const char* prefix, int *b, size_t num) 74 { 75 printf("%s: ", prefix); 76 for (size_t i=0 ; i<num ; i++) { 77 printf("%d ", b[i]); 78 } 79 printf("\n"); 80 } 81 82 // ---------------------------------------------------------------------------- 83 84 void test0( 85 SharedBufferServer& s, 86 SharedBufferClient& c, 87 size_t num, 88 int* list) 89 { 90 status_t err; 91 int b[num], u[num], r[num]; 92 93 for (size_t i=0 ; i<num ; i++) { 94 b[i] = c.dequeue(); 95 assert(b[i]==list[i]); 96 } 97 log("DQ", b, num); 98 99 for (size_t i=0 ; i<num-1 ; i++) { 100 err = c.lock(b[i]); 101 assert(err==0); 102 } 103 log("LK", b, num-1); 104 105 for (size_t i=0 ; i<num-1 ; i++) { 106 err = c.queue(b[i]); 107 assert(err==0); 108 } 109 log(" Q", b, num-1); 110 111 112 for (size_t i=0 ; i<num-1 ; i++) { 113 r[i] = s.retireAndLock(); 114 assert(r[i]==list[i]); 115 err = s.unlock(r[i]); 116 assert(err == 0); 117 } 118 log("RT", r, num-1); 119 120 err = c.lock(b[num-1]); 121 assert(err == 0); 122 log("LK", b+num-1, 1); 123 124 err = c.queue(b[num-1]); 125 assert(err == 0); 126 log(" Q", b+num-1, 1); 127 128 r[num-1] = s.retireAndLock(); 129 assert(r[num-1]==list[num-1]); 130 err = s.unlock(r[num-1]); 131 assert(err == 0); 132 log("RT", r+num-1, 1); 133 134 // ------------------------------------ 135 printf("\n"); 136 137 for (size_t i=0 ; i<num ; i++) { 138 b[i] = c.dequeue(); 139 assert(b[i]==list[i]); 140 } 141 log("DQ", b, num); 142 143 for (size_t i=0 ; i<num-1 ; i++) { 144 err = c.lock(b[i]); 145 assert(err==0); 146 } 147 log("LK", b, num-1); 148 149 for (size_t i=0 ; i<num-1 ; i++) { 150 u[i] = b[num-2-i]; 151 } 152 u[num-1] = b[num-1]; 153 154 for (size_t i=0 ; i<num-1 ; i++) { 155 err = c.queue(u[i]); 156 assert(err==0); 157 } 158 log(" Q", u, num-1); 159 160 for (size_t i=0 ; i<num-1 ; i++) { 161 r[i] = s.retireAndLock(); 162 assert(r[i]==u[i]); 163 err = s.unlock(r[i]); 164 assert(err == 0); 165 } 166 log("RT", r, num-1); 167 168 err = c.lock(b[num-1]); 169 assert(err == 0); 170 log("LK", b+num-1, 1); 171 172 err = c.queue(b[num-1]); 173 assert(err == 0); 174 log(" Q", b+num-1, 1); 175 176 r[num-1] = s.retireAndLock(); 177 assert(r[num-1]==list[num-1]); 178 err = s.unlock(r[num-1]); 179 assert(err == 0); 180 log("RT", r+num-1, 1); 181 182 // ------------------------------------ 183 printf("\n"); 184 185 for (size_t i=0 ; i<num ; i++) { 186 b[i] = c.dequeue(); 187 assert(b[i]==u[i]); 188 } 189 log("DQ", b, num); 190 191 for (size_t i=0 ; i<num-1 ; i++) { 192 err = c.lock(b[i]); 193 assert(err==0); 194 } 195 log("LK", b, num-1); 196 197 for (size_t i=0 ; i<num-1 ; i++) { 198 err = c.queue(b[i]); 199 assert(err==0); 200 } 201 log(" Q", b, num-1); 202 203 for (size_t i=0 ; i<num-1 ; i++) { 204 r[i] = s.retireAndLock(); 205 assert(r[i]==u[i]); 206 err = s.unlock(r[i]); 207 assert(err == 0); 208 } 209 log("RT", r, num-1); 210 211 err = c.lock(u[num-1]); 212 assert(err == 0); 213 log("LK", u+num-1, 1); 214 215 err = c.queue(u[num-1]); 216 assert(err == 0); 217 log(" Q", u+num-1, 1); 218 219 r[num-1] = s.retireAndLock(); 220 assert(r[num-1]==u[num-1]); 221 err = s.unlock(r[num-1]); 222 assert(err == 0); 223 log("RT", r+num-1, 1); 224 225 // ------------------------------------ 226 printf("\n"); 227 228 b[0] = c.dequeue(); 229 assert(b[0]==u[0]); 230 log("DQ", b, 1); 231 232 c.undoDequeue(b[0]); 233 assert(err == 0); 234 log("UDQ", b, 1); 235 236 // ------------------------------------ 237 printf("\n"); 238 239 for (size_t i=0 ; i<num ; i++) { 240 b[i] = c.dequeue(); 241 assert(b[i]==u[i]); 242 } 243 log("DQ", b, num); 244 245 for (size_t i=0 ; i<num-1 ; i++) { 246 err = c.lock(b[i]); 247 assert(err==0); 248 } 249 log("LK", b, num-1); 250 251 for (size_t i=0 ; i<num-1 ; i++) { 252 err = c.queue(b[i]); 253 assert(err==0); 254 } 255 log(" Q", b, num-1); 256 257 for (size_t i=0 ; i<num-1 ; i++) { 258 r[i] = s.retireAndLock(); 259 assert(r[i]==u[i]); 260 err = s.unlock(r[i]); 261 assert(err == 0); 262 } 263 log("RT", r, num-1); 264 265 err = c.lock(u[num-1]); 266 assert(err == 0); 267 log("LK", u+num-1, 1); 268 269 err = c.queue(u[num-1]); 270 assert(err == 0); 271 log(" Q", u+num-1, 1); 272 273 r[num-1] = s.retireAndLock(); 274 assert(r[num-1]==u[num-1]); 275 err = s.unlock(r[num-1]); 276 assert(err == 0); 277 log("RT", r+num-1, 1); 278 printf("\n"); 279 } 280