| Index: third_party/libsync/sync.c
 | 
| diff --git a/third_party/libsync/sync.c b/third_party/libsync/sync.c
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..d73bb111cc70d562bc1d462bf73b9bc891a688d5
 | 
| --- /dev/null
 | 
| +++ b/third_party/libsync/sync.c
 | 
| @@ -0,0 +1,117 @@
 | 
| +/*
 | 
| + *  sync.c
 | 
| + *
 | 
| + *   Copyright 2012 Google, Inc
 | 
| + *
 | 
| + *  Licensed under the Apache License, Version 2.0 (the "License");
 | 
| + *  you may not use this file except in compliance with the License.
 | 
| + *  You may obtain a copy of the License at
 | 
| + *
 | 
| + *      http://www.apache.org/licenses/LICENSE-2.0
 | 
| + *
 | 
| + *  Unless required by applicable law or agreed to in writing, software
 | 
| + *  distributed under the License is distributed on an "AS IS" BASIS,
 | 
| + *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
| + *  See the License for the specific language governing permissions and
 | 
| + *  limitations under the License.
 | 
| + */
 | 
| +
 | 
| +#include <fcntl.h>
 | 
| +#include <malloc.h>
 | 
| +#include <stdint.h>
 | 
| +#include <string.h>
 | 
| +
 | 
| +#include <linux/sync.h>
 | 
| +#include <linux/sw_sync.h>
 | 
| +
 | 
| +#include <sys/ioctl.h>
 | 
| +#include <sys/stat.h>
 | 
| +#include <sys/types.h>
 | 
| +
 | 
| +int sync_wait(int fd, int timeout)
 | 
| +{
 | 
| +    __s32 to = timeout;
 | 
| +
 | 
| +    return ioctl(fd, SYNC_IOC_WAIT, &to);
 | 
| +}
 | 
| +
 | 
| +int sync_merge(const char *name, int fd1, int fd2)
 | 
| +{
 | 
| +    struct sync_merge_data data;
 | 
| +    int err;
 | 
| +
 | 
| +    data.fd2 = fd2;
 | 
| +    strlcpy(data.name, name, sizeof(data.name));
 | 
| +
 | 
| +    err = ioctl(fd1, SYNC_IOC_MERGE, &data);
 | 
| +    if (err < 0)
 | 
| +        return err;
 | 
| +
 | 
| +    return data.fence;
 | 
| +}
 | 
| +
 | 
| +struct sync_fence_info_data *sync_fence_info(int fd)
 | 
| +{
 | 
| +    struct sync_fence_info_data *info;
 | 
| +    int err;
 | 
| +
 | 
| +    info = malloc(4096);
 | 
| +    if (info == NULL)
 | 
| +        return NULL;
 | 
| +
 | 
| +    info->len = 4096;
 | 
| +    err = ioctl(fd, SYNC_IOC_FENCE_INFO, info);
 | 
| +    if (err < 0) {
 | 
| +        free(info);
 | 
| +        return NULL;
 | 
| +    }
 | 
| +
 | 
| +    return info;
 | 
| +}
 | 
| +
 | 
| +struct sync_pt_info *sync_pt_info(struct sync_fence_info_data *info,
 | 
| +                                  struct sync_pt_info *itr)
 | 
| +{
 | 
| +    if (itr == NULL)
 | 
| +        itr = (struct sync_pt_info *) info->pt_info;
 | 
| +    else
 | 
| +        itr = (struct sync_pt_info *) ((__u8 *)itr + itr->len);
 | 
| +
 | 
| +    if ((__u8 *)itr - (__u8 *)info >= (int)info->len)
 | 
| +        return NULL;
 | 
| +
 | 
| +    return itr;
 | 
| +}
 | 
| +
 | 
| +void sync_fence_info_free(struct sync_fence_info_data *info)
 | 
| +{
 | 
| +    free(info);
 | 
| +}
 | 
| +
 | 
| +
 | 
| +int sw_sync_timeline_create(void)
 | 
| +{
 | 
| +    return open("/dev/sw_sync", O_RDWR);
 | 
| +}
 | 
| +
 | 
| +int sw_sync_timeline_inc(int fd, unsigned count)
 | 
| +{
 | 
| +    __u32 arg = count;
 | 
| +
 | 
| +    return ioctl(fd, SW_SYNC_IOC_INC, &arg);
 | 
| +}
 | 
| +
 | 
| +int sw_sync_fence_create(int fd, const char *name, unsigned value)
 | 
| +{
 | 
| +    struct sw_sync_create_fence_data data;
 | 
| +    int err;
 | 
| +
 | 
| +    data.value = value;
 | 
| +    strlcpy(data.name, name, sizeof(data.name));
 | 
| +
 | 
| +    err = ioctl(fd, SW_SYNC_IOC_CREATE_FENCE, &data);
 | 
| +    if (err < 0)
 | 
| +        return err;
 | 
| +
 | 
| +    return data.fence;
 | 
| +}
 | 
| 
 |