• Home
  • Raw
  • Download

Lines Matching refs:f

58     pa_fdsem *f;  in pa_fdsem_new()  local
60 f = pa_xmalloc0(PA_ALIGN(sizeof(pa_fdsem)) + PA_ALIGN(sizeof(pa_fdsem_data))); in pa_fdsem_new()
63 if ((f->efd = eventfd(0, EFD_CLOEXEC)) >= 0) in pa_fdsem_new()
64 f->fds[0] = f->fds[1] = -1; in pa_fdsem_new()
68 if (pa_pipe_cloexec(f->fds) < 0) { in pa_fdsem_new()
69 pa_xfree(f); in pa_fdsem_new()
74 f->data = (pa_fdsem_data*) ((uint8_t*) f + PA_ALIGN(sizeof(pa_fdsem))); in pa_fdsem_new()
76 pa_atomic_store(&f->data->waiting, 0); in pa_fdsem_new()
77 pa_atomic_store(&f->data->signalled, 0); in pa_fdsem_new()
78 pa_atomic_store(&f->data->in_pipe, 0); in pa_fdsem_new()
80 return f; in pa_fdsem_new()
84 pa_fdsem *f = NULL; in pa_fdsem_open_shm() local
90 f = pa_xnew0(pa_fdsem, 1); in pa_fdsem_open_shm()
92 f->efd = event_fd; in pa_fdsem_open_shm()
93 pa_make_fd_cloexec(f->efd); in pa_fdsem_open_shm()
94 f->fds[0] = f->fds[1] = -1; in pa_fdsem_open_shm()
95 f->data = data; in pa_fdsem_open_shm()
98 return f; in pa_fdsem_open_shm()
102 pa_fdsem *f = NULL; in pa_fdsem_new_shm() local
108 f = pa_xnew0(pa_fdsem, 1); in pa_fdsem_new_shm()
110 if ((f->efd = eventfd(0, EFD_CLOEXEC)) < 0) { in pa_fdsem_new_shm()
111 pa_xfree(f); in pa_fdsem_new_shm()
115 f->fds[0] = f->fds[1] = -1; in pa_fdsem_new_shm()
116 f->data = data; in pa_fdsem_new_shm()
118 pa_atomic_store(&f->data->waiting, 0); in pa_fdsem_new_shm()
119 pa_atomic_store(&f->data->signalled, 0); in pa_fdsem_new_shm()
120 pa_atomic_store(&f->data->in_pipe, 0); in pa_fdsem_new_shm()
124 return f; in pa_fdsem_new_shm()
127 void pa_fdsem_free(pa_fdsem *f) { in pa_fdsem_free() argument
128 pa_assert(f); in pa_fdsem_free()
131 if (f->efd >= 0) in pa_fdsem_free()
132 pa_close(f->efd); in pa_fdsem_free()
134 pa_close_pipe(f->fds); in pa_fdsem_free()
136 pa_xfree(f); in pa_fdsem_free()
139 static void flush(pa_fdsem *f) { in flush() argument
141 pa_assert(f); in flush()
143 if (pa_atomic_load(&f->data->in_pipe) <= 0) in flush()
150 if (f->efd >= 0) { in flush()
153 if ((r = pa_read(f->efd, &u, sizeof(u), NULL)) != sizeof(u)) { in flush()
161 if ((r = pa_read(f->fds[0], &x, sizeof(x), NULL)) <= 0) { in flush()
166 } while (pa_atomic_sub(&f->data->in_pipe, (int) r) > (int) r); in flush()
169 void pa_fdsem_post(pa_fdsem *f) { in pa_fdsem_post() argument
170 pa_assert(f); in pa_fdsem_post()
172 if (pa_atomic_cmpxchg(&f->data->signalled, 0, 1)) { in pa_fdsem_post()
174 if (pa_atomic_load(&f->data->waiting)) { in pa_fdsem_post()
178 pa_atomic_inc(&f->data->in_pipe); in pa_fdsem_post()
183 if (f->efd >= 0) { in pa_fdsem_post()
186 if ((r = pa_write(f->efd, &u, sizeof(u), &f->write_type)) != sizeof(u)) { in pa_fdsem_post()
193 if ((r = pa_write(f->fds[1], &x, 1, &f->write_type)) != 1) { in pa_fdsem_post()
204 void pa_fdsem_wait(pa_fdsem *f) { in pa_fdsem_wait() argument
205 pa_assert(f); in pa_fdsem_wait()
207 flush(f); in pa_fdsem_wait()
209 if (pa_atomic_cmpxchg(&f->data->signalled, 1, 0)) in pa_fdsem_wait()
212 pa_atomic_inc(&f->data->waiting); in pa_fdsem_wait()
214 while (!pa_atomic_cmpxchg(&f->data->signalled, 1, 0)) { in pa_fdsem_wait()
219 if (f->efd >= 0) { in pa_fdsem_wait()
222 if ((r = pa_read(f->efd, &u, sizeof(u), NULL)) != sizeof(u)) { in pa_fdsem_wait()
231 if ((r = pa_read(f->fds[0], &x, sizeof(x), NULL)) <= 0) { in pa_fdsem_wait()
236 pa_atomic_sub(&f->data->in_pipe, (int) r); in pa_fdsem_wait()
239 pa_assert_se(pa_atomic_dec(&f->data->waiting) >= 1); in pa_fdsem_wait()
242 int pa_fdsem_try(pa_fdsem *f) { in pa_fdsem_try() argument
243 pa_assert(f); in pa_fdsem_try()
245 flush(f); in pa_fdsem_try()
247 if (pa_atomic_cmpxchg(&f->data->signalled, 1, 0)) in pa_fdsem_try()
253 int pa_fdsem_get(pa_fdsem *f) { in pa_fdsem_get() argument
254 pa_assert(f); in pa_fdsem_get()
257 if (f->efd >= 0) in pa_fdsem_get()
258 return f->efd; in pa_fdsem_get()
261 return f->fds[0]; in pa_fdsem_get()
264 int pa_fdsem_before_poll(pa_fdsem *f) { in pa_fdsem_before_poll() argument
265 pa_assert(f); in pa_fdsem_before_poll()
267 flush(f); in pa_fdsem_before_poll()
269 if (pa_atomic_cmpxchg(&f->data->signalled, 1, 0)) in pa_fdsem_before_poll()
272 pa_atomic_inc(&f->data->waiting); in pa_fdsem_before_poll()
274 if (pa_atomic_cmpxchg(&f->data->signalled, 1, 0)) { in pa_fdsem_before_poll()
275 pa_assert_se(pa_atomic_dec(&f->data->waiting) >= 1); in pa_fdsem_before_poll()
281 int pa_fdsem_after_poll(pa_fdsem *f) { in pa_fdsem_after_poll() argument
282 pa_assert(f); in pa_fdsem_after_poll()
284 pa_assert_se(pa_atomic_dec(&f->data->waiting) >= 1); in pa_fdsem_after_poll()
286 flush(f); in pa_fdsem_after_poll()
288 if (pa_atomic_cmpxchg(&f->data->signalled, 1, 0)) in pa_fdsem_after_poll()