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>
26ddc20de1483028ee0b4401266499a59631e9d659Rom Lemarchand#include "sw_sync.h"
27196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
28196b3a5f6f48649500909c66177967abaf05b898Erik Gillingpthread_mutex_t printf_mutex = PTHREAD_MUTEX_INITIALIZER;
29196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
30196b3a5f6f48649500909c66177967abaf05b898Erik Gillingstruct sync_thread_data {
31196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    int thread_no;
32196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    int fd[2];
33196b3a5f6f48649500909c66177967abaf05b898Erik Gilling};
34196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
35196b3a5f6f48649500909c66177967abaf05b898Erik Gillingvoid *sync_thread(void *data)
36196b3a5f6f48649500909c66177967abaf05b898Erik Gilling{
37196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    struct sync_thread_data *sync_data = data;
38196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    struct sync_fence_info_data *info;
39196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    int err;
40196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    int i;
41196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
42196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    for (i = 0; i < 2; i++) {
43196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        err = sync_wait(sync_data->fd[i], 10000);
44196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
45196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        pthread_mutex_lock(&printf_mutex);
46196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        if (err < 0) {
47196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            printf("thread %d wait %d failed: %s\n", sync_data->thread_no,
48196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                   i, strerror(errno));
49196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        } else {
50196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            printf("thread %d wait %d done\n", sync_data->thread_no, i);
51196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        }
52196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        info = sync_fence_info(sync_data->fd[i]);
53196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        if (info) {
54196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            struct sync_pt_info *pt_info = NULL;
55196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            printf("  fence %s %d\n", info->name, info->status);
56196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
57196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            while ((pt_info = sync_pt_info(info, pt_info))) {
58196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                int ts_sec = pt_info->timestamp_ns / 1000000000LL;
59196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                int ts_usec = (pt_info->timestamp_ns % 1000000000LL) / 1000LL;
60196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                printf("    pt %s %s %d %d.%06d", pt_info->obj_name,
61196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                       pt_info->driver_name, pt_info->status,
62196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                       ts_sec, ts_usec);
63196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                if (!strcmp(pt_info->driver_name, "sw_sync"))
64196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                    printf(" val=%d\n", *(uint32_t *)pt_info->driver_data);
65196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                else
66196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                    printf("\n");
67196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            }
68196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            sync_fence_info_free(info);
69196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        }
70196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        pthread_mutex_unlock(&printf_mutex);
71196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    }
72196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
73196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    return NULL;
74196b3a5f6f48649500909c66177967abaf05b898Erik Gilling}
75196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
76b6279689edecc898bd9622f4ac562239650815bcEdwin Vaneint main(int argc __attribute__((unused)), char *argv[] __attribute__((unused)))
77196b3a5f6f48649500909c66177967abaf05b898Erik Gilling{
78196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    struct sync_thread_data sync_data[4];
79196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    pthread_t threads[4];
80196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    int sync_timeline_fd;
81196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    int i, j;
82196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    char str[256];
83196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
84196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    sync_timeline_fd = sw_sync_timeline_create();
85196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    if (sync_timeline_fd < 0) {
86196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        perror("can't create sw_sync_timeline:");
87196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        return 1;
88196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    }
89196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
90196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    for (i = 0; i < 3; i++) {
91196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        sync_data[i].thread_no = i;
92196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
93196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        for (j = 0; j < 2; j++) {
94196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            unsigned val = i + j * 3 + 1;
95196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            sprintf(str, "test_fence%d-%d", i, j);
96196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            int fd = sw_sync_fence_create(sync_timeline_fd, str, val);
97196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            if (fd < 0) {
98196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                printf("can't create sync pt %d: %s", val, strerror(errno));
99196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                return 1;
100196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            }
101196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            sync_data[i].fd[j] = fd;
102196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            printf("sync_data[%d].fd[%d] = %d;\n", i, j, fd);
103196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
104196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        }
105196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    }
106196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
107196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    sync_data[3].thread_no = 3;
108196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    for (j = 0; j < 2; j++) {
109196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        sprintf(str, "merged_fence%d", j);
110196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        sync_data[3].fd[j] = sync_merge(str, sync_data[0].fd[j], sync_data[1].fd[j]);
111196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        if (sync_data[3].fd[j] < 0) {
112196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            printf("can't merge sync pts %d and %d: %s\n",
113196b3a5f6f48649500909c66177967abaf05b898Erik Gilling                   sync_data[0].fd[j], sync_data[1].fd[j], strerror(errno));
114196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            return 1;
115196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        }
116196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    }
117196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
118196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    for (i = 0; i < 4; i++)
119196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        pthread_create(&threads[i], NULL, sync_thread, &sync_data[i]);
120196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
121196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
122196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    for (i = 0; i < 3; i++) {
123196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        int err;
124196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        printf("press enter to inc to %d\n", i+1);
125196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        fgets(str, sizeof(str), stdin);
126196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        err = sw_sync_timeline_inc(sync_timeline_fd, 1);
127196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        if (err < 0) {
128196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            perror("can't increment sync obj:");
129196b3a5f6f48649500909c66177967abaf05b898Erik Gilling            return 1;
130196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        }
131196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    }
132196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
133196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    printf("press enter to close sync_timeline\n");
134196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    fgets(str, sizeof(str), stdin);
135196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
136196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    close(sync_timeline_fd);
137196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
138196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    printf("press enter to end test\n");
139196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    fgets(str, sizeof(str), stdin);
140196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
141196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    for (i = 0; i < 3; i++) {
142196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        void *val;
143196b3a5f6f48649500909c66177967abaf05b898Erik Gilling        pthread_join(threads[i], &val);
144196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    }
145196b3a5f6f48649500909c66177967abaf05b898Erik Gilling
146196b3a5f6f48649500909c66177967abaf05b898Erik Gilling    return 0;
147196b3a5f6f48649500909c66177967abaf05b898Erik Gilling}
148