• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
main(int argc,char ** argv)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 
log(const char * prefix,int * b,size_t num)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 
test0(SharedBufferServer & s,SharedBufferClient & c,size_t num,int * list)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