Home | History | Annotate | Download | only in libsync
      1 /*
      2  *  sync_test.c
      3  *
      4  *   Copyright 2012 Google, Inc
      5  *
      6  *  Licensed under the Apache License, Version 2.0 (the "License");
      7  *  you may not use this file except in compliance with the License.
      8  *  You may obtain a copy of the License at
      9  *
     10  *      http://www.apache.org/licenses/LICENSE-2.0
     11  *
     12  *  Unless required by applicable law or agreed to in writing, software
     13  *  distributed under the License is distributed on an "AS IS" BASIS,
     14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15  *  See the License for the specific language governing permissions and
     16  *  limitations under the License.
     17  */
     18 
     19 #include <errno.h>
     20 #include <pthread.h>
     21 #include <stdio.h>
     22 #include <string.h>
     23 #include <unistd.h>
     24 
     25 #include <sync/sync.h>
     26 #include "sw_sync.h"
     27 
     28 pthread_mutex_t printf_mutex = PTHREAD_MUTEX_INITIALIZER;
     29 
     30 struct sync_thread_data {
     31     int thread_no;
     32     int fd[2];
     33 };
     34 
     35 void *sync_thread(void *data)
     36 {
     37     struct sync_thread_data *sync_data = data;
     38     struct sync_fence_info_data *info;
     39     int err;
     40     int i;
     41 
     42     for (i = 0; i < 2; i++) {
     43         err = sync_wait(sync_data->fd[i], 10000);
     44 
     45         pthread_mutex_lock(&printf_mutex);
     46         if (err < 0) {
     47             printf("thread %d wait %d failed: %s\n", sync_data->thread_no,
     48                    i, strerror(errno));
     49         } else {
     50             printf("thread %d wait %d done\n", sync_data->thread_no, i);
     51         }
     52         info = sync_fence_info(sync_data->fd[i]);
     53         if (info) {
     54             struct sync_pt_info *pt_info = NULL;
     55             printf("  fence %s %d\n", info->name, info->status);
     56 
     57             while ((pt_info = sync_pt_info(info, pt_info))) {
     58                 int ts_sec = pt_info->timestamp_ns / 1000000000LL;
     59                 int ts_usec = (pt_info->timestamp_ns % 1000000000LL) / 1000LL;
     60                 printf("    pt %s %s %d %d.%06d", pt_info->obj_name,
     61                        pt_info->driver_name, pt_info->status,
     62                        ts_sec, ts_usec);
     63                 if (!strcmp(pt_info->driver_name, "sw_sync"))
     64                     printf(" val=%d\n", *(uint32_t *)pt_info->driver_data);
     65                 else
     66                     printf("\n");
     67             }
     68             sync_fence_info_free(info);
     69         }
     70         pthread_mutex_unlock(&printf_mutex);
     71     }
     72 
     73     return NULL;
     74 }
     75 
     76 int main(int argc __attribute__((unused)), char *argv[] __attribute__((unused)))
     77 {
     78     struct sync_thread_data sync_data[4];
     79     pthread_t threads[4];
     80     int sync_timeline_fd;
     81     int i, j;
     82     char str[256];
     83 
     84     sync_timeline_fd = sw_sync_timeline_create();
     85     if (sync_timeline_fd < 0) {
     86         perror("can't create sw_sync_timeline:");
     87         return 1;
     88     }
     89 
     90     for (i = 0; i < 3; i++) {
     91         sync_data[i].thread_no = i;
     92 
     93         for (j = 0; j < 2; j++) {
     94             unsigned val = i + j * 3 + 1;
     95             sprintf(str, "test_fence%d-%d", i, j);
     96             int fd = sw_sync_fence_create(sync_timeline_fd, str, val);
     97             if (fd < 0) {
     98                 printf("can't create sync pt %d: %s", val, strerror(errno));
     99                 return 1;
    100             }
    101             sync_data[i].fd[j] = fd;
    102             printf("sync_data[%d].fd[%d] = %d;\n", i, j, fd);
    103 
    104         }
    105     }
    106 
    107     sync_data[3].thread_no = 3;
    108     for (j = 0; j < 2; j++) {
    109         sprintf(str, "merged_fence%d", j);
    110         sync_data[3].fd[j] = sync_merge(str, sync_data[0].fd[j], sync_data[1].fd[j]);
    111         if (sync_data[3].fd[j] < 0) {
    112             printf("can't merge sync pts %d and %d: %s\n",
    113                    sync_data[0].fd[j], sync_data[1].fd[j], strerror(errno));
    114             return 1;
    115         }
    116     }
    117 
    118     for (i = 0; i < 4; i++)
    119         pthread_create(&threads[i], NULL, sync_thread, &sync_data[i]);
    120 
    121 
    122     for (i = 0; i < 3; i++) {
    123         int err;
    124         printf("press enter to inc to %d\n", i+1);
    125         fgets(str, sizeof(str), stdin);
    126         err = sw_sync_timeline_inc(sync_timeline_fd, 1);
    127         if (err < 0) {
    128             perror("can't increment sync obj:");
    129             return 1;
    130         }
    131     }
    132 
    133     printf("press enter to close sync_timeline\n");
    134     fgets(str, sizeof(str), stdin);
    135 
    136     close(sync_timeline_fd);
    137 
    138     printf("press enter to end test\n");
    139     fgets(str, sizeof(str), stdin);
    140 
    141     for (i = 0; i < 3; i++) {
    142         void *val;
    143         pthread_join(threads[i], &val);
    144     }
    145 
    146     return 0;
    147 }
    148