1/* 2 * Copyright 2012 Google, Inc 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15#include "sync.h" 16#include <errno.h> 17#include <poll.h> 18#include <stdio.h> 19 20int SyncWait(int num, int time) 21{ 22 struct pollfd work; 23 int result; 24 25 if (num < 0) { 26 errno = EINVAL; 27 return -1; 28 } 29 30 work.fd = num; 31 work.events = POLLIN; 32 33 do { 34 result = poll(&work, 1, time); 35 if (result > 0) { 36 if (work.revents & (POLLERR | POLLNVAL)) { 37 errno = EINVAL; 38 return -1; 39 } 40 return 0; 41 } else if (result == 0) { 42 errno = ETIME; 43 return -1; 44 } 45 } while (result == -1 && (errno == EINTR || errno == EAGAIN)); 46 47 return result; 48} 49