sync_test.c revision b6279689edecc898bd9622f4ac562239650815bc
1196b3a5f6f48649500909c66177967abaf05b898Erik Gilling/*
2196b3a5f6f48649500909c66177967abaf05b898Erik Gilling *  sync_test.c
3196b3a5f6f48649500909c66177967abaf05b898Erik Gilling *
4196b3a5f6f48649500909c66177967abaf05b898Erik Gilling *   Copyright 2012 Google, Inc
5196b3a5f6f48649500909c66177967abaf05b898Erik Gilling *
6196b3a5f6f48649500909c66177967abaf05b898Erik Gilling *  Licensed under the Apache License, Version 2.0 (the "License");
7196b3a5f6f48649500909c66177967abaf05b898Erik Gilling *  you may not use this file except in compliance with the License.
8196b3a5f6f48649500909c66177967abaf05b898Erik Gilling *  You may obtain a copy of the License at
9196b3a5f6f48649500909c66177967abaf05b898Erik Gilling *
10196b3a5f6f48649500909c66177967abaf05b898Erik Gilling *      http://www.apache.org/licenses/LICENSE-2.0
11196b3a5f6f48649500909c66177967abaf05b898Erik Gilling *
12196b3a5f6f48649500909c66177967abaf05b898Erik Gilling *  Unless required by applicable law or agreed to in writing, software
13196b3a5f6f48649500909c66177967abaf05b898Erik Gilling *  distributed under the License is distributed on an "AS IS" BASIS,
14196b3a5f6f48649500909c66177967abaf05b898Erik Gilling *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15196b3a5f6f48649500909c66177967abaf05b898Erik Gilling *  See the License for the specific language governing permissions and
16196b3a5f6f48649500909c66177967abaf05b898Erik Gilling *  limitations under the License.
17196b3a5f6f48649500909c66177967abaf05b898Erik Gilling */
18196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
19196b3a5f6f48649500909c66177967abaf05b898Erik Gilling#include <errno.h>
20196b3a5f6f48649500909c66177967abaf05b898Erik Gilling#include <pthread.h>
21196b3a5f6f48649500909c66177967abaf05b898Erik Gilling#include <stdio.h>
22196b3a5f6f48649500909c66177967abaf05b898Erik Gilling#include <string.h>
23196b3a5f6f48649500909c66177967abaf05b898Erik Gilling#include <unistd.h>
24196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
25196b3a5f6f48649500909c66177967abaf05b898Erik Gilling#include <sync/sync.h>
26196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
27196b3a5f6f48649500909c66177967abaf05b898Erik Gillingpthread_mutex_t printf_mutex = PTHREAD_MUTEX_INITIALIZER;
28196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
29196b3a5f6f48649500909c66177967abaf05b898Erik Gillingstruct sync_thread_data {
30196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    int thread_no;
31196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    int fd[2];
32196b3a5f6f48649500909c66177967abaf05b898Erik Gilling};
33196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
34196b3a5f6f48649500909c66177967abaf05b898Erik Gillingvoid *sync_thread(void *data)
35196b3a5f6f48649500909c66177967abaf05b898Erik Gilling{
36196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    struct sync_thread_data *sync_data = data;
37196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    struct sync_fence_info_data *info;
38196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    int err;
39196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    int i;
40196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
41196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    for (i = 0; i < 2; i++) {
42196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        err = sync_wait(sync_data->fd[i], 10000);
43196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
44196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        pthread_mutex_lock(&printf_mutex);
45196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        if (err < 0) {
46196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            printf("thread %d wait %d failed: %s\n", sync_data->thread_no,
47196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                   i, strerror(errno));
48196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        } else {
49196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            printf("thread %d wait %d done\n", sync_data->thread_no, i);
50196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        }
51196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        info = sync_fence_info(sync_data->fd[i]);
52196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        if (info) {
53196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            struct sync_pt_info *pt_info = NULL;
54196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            printf("  fence %s %d\n", info->name, info->status);
55196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
56196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            while ((pt_info = sync_pt_info(info, pt_info))) {
57196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                int ts_sec = pt_info->timestamp_ns / 1000000000LL;
58196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                int ts_usec = (pt_info->timestamp_ns % 1000000000LL) / 1000LL;
59196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                printf("    pt %s %s %d %d.%06d", pt_info->obj_name,
60196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                       pt_info->driver_name, pt_info->status,
61196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                       ts_sec, ts_usec);
62196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                if (!strcmp(pt_info->driver_name, "sw_sync"))
63196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                    printf(" val=%d\n", *(uint32_t *)pt_info->driver_data);
64196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                else
65196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                    printf("\n");
66196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            }
67196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            sync_fence_info_free(info);
68196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        }
69196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        pthread_mutex_unlock(&printf_mutex);
70196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    }
71196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
72196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    return NULL;
73196b3a5f6f48649500909c66177967abaf05b898Erik Gilling}
74196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
75b6279689edecc898bd9622f4ac562239650815bcEdwin Vaneint main(int argc __attribute__((unused)), char *argv[] __attribute__((unused)))
76196b3a5f6f48649500909c66177967abaf05b898Erik Gilling{
77196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    struct sync_thread_data sync_data[4];
78196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    pthread_t threads[4];
79196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    int sync_timeline_fd;
80196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    int i, j;
81196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    char str[256];
82196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
83196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    sync_timeline_fd = sw_sync_timeline_create();
84196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    if (sync_timeline_fd < 0) {
85196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        perror("can't create sw_sync_timeline:");
86196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        return 1;
87196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    }
88196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
89196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    for (i = 0; i < 3; i++) {
90196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        sync_data[i].thread_no = i;
91196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
92196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        for (j = 0; j < 2; j++) {
93196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            unsigned val = i + j * 3 + 1;
94196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            sprintf(str, "test_fence%d-%d", i, j);
95196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            int fd = sw_sync_fence_create(sync_timeline_fd, str, val);
96196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            if (fd < 0) {
97196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                printf("can't create sync pt %d: %s", val, strerror(errno));
98196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                return 1;
99196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            }
100196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            sync_data[i].fd[j] = fd;
101196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            printf("sync_data[%d].fd[%d] = %d;\n", i, j, fd);
102196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
103196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        }
104196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    }
105196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
106196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    sync_data[3].thread_no = 3;
107196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    for (j = 0; j < 2; j++) {
108196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        sprintf(str, "merged_fence%d", j);
109196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        sync_data[3].fd[j] = sync_merge(str, sync_data[0].fd[j], sync_data[1].fd[j]);
110196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        if (sync_data[3].fd[j] < 0) {
111196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            printf("can't merge sync pts %d and %d: %s\n",
112196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                   sync_data[0].fd[j], sync_data[1].fd[j], strerror(errno));
113196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            return 1;
114196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        }
115196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    }
116196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
117196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    for (i = 0; i < 4; i++)
118196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        pthread_create(&threads[i], NULL, sync_thread, &sync_data[i]);
119196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
120196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
121196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    for (i = 0; i < 3; i++) {
122196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        int err;
123196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        printf("press enter to inc to %d\n", i+1);
124196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        fgets(str, sizeof(str), stdin);
125196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        err = sw_sync_timeline_inc(sync_timeline_fd, 1);
126196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        if (err < 0) {
127196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            perror("can't increment sync obj:");
128196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            return 1;
129196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        }
130196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    }
131196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
132196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    printf("press enter to close sync_timeline\n");
133196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    fgets(str, sizeof(str), stdin);
134196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
135196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    close(sync_timeline_fd);
136196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
137196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    printf("press enter to end test\n");
138196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    fgets(str, sizeof(str), stdin);
139196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
140196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    for (i = 0; i < 3; i++) {
141196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        void *val;
142196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        pthread_join(threads[i], &val);
143196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    }
144196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
145196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    return 0;
146196b3a5f6f48649500909c66177967abaf05b898Erik Gilling}
147