Home | History | Annotate | Download | only in SharedBufferStack
      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