Lines Matching refs:sfd

45 static int signalfd_add_notify(struct rt_signalfd_ctx *sfd);
61 struct rt_signalfd_ctx *sfd; in signalfd_close() local
66 sfd = file->vnode->data; in signalfd_close()
68 if (sfd) in signalfd_close()
70 rt_mutex_detach(&sfd->lock); in signalfd_close()
71 rt_free(sfd); in signalfd_close()
85 struct rt_signalfd_ctx *sfd; in signalfd_poll() local
90 sfd = file->vnode->data; in signalfd_poll()
92 rt_poll_add(&sfd->signalfd_queue, req); in signalfd_poll()
93 signalfd_add_notify(sfd); in signalfd_poll()
95 rt_mutex_take(&sfd->lock, RT_WAITING_FOREVER); in signalfd_poll()
97 if (sfd->sig_num) in signalfd_poll()
100 rt_mutex_release(&sfd->lock); in signalfd_poll()
127 struct rt_signalfd_ctx *sfd = RT_NULL; in signalfd_read() local
145 sfd = file->vnode->data; in signalfd_read()
147 signalfd_add_notify(sfd); in signalfd_read()
148 if ((sfd->sig_num == 0) && (file->flags & O_NONBLOCK)) in signalfd_read()
154 if (sfd->sig_num == 0) in signalfd_read()
156 rt_wqueue_wait(&sfd->signalfd_queue, 0, RT_WAITING_FOREVER); in signalfd_read()
159 rt_mutex_take(&sfd->lock, RT_WAITING_FOREVER); in signalfd_read()
160 for (i = 0; i < sfd->sig_num; i++) in signalfd_read()
164 memcpy(&buffer[i], &sfd->info[i], sizeof(struct signalfd_siginfo)); in signalfd_read()
165 sfd->sig_num -= 1; in signalfd_read()
174 for (int j = 0; j < sfd->sig_num; j ++) in signalfd_read()
176 memcpy(&sfd->info[j], &sfd->info[i ++], sizeof(struct signalfd_siginfo)); in signalfd_read()
179 rt_mutex_release(&sfd->lock); in signalfd_read()
195 struct rt_signalfd_ctx *sfd; in signalfd_callback() local
197 sfd = rt_container_of(signalfd_queue, struct rt_signalfd_ctx, signalfd_queue); in signalfd_callback()
199 if (sfd) in signalfd_callback()
201 if (sigismember(&sfd->sigmask, signum)) in signalfd_callback()
203 rt_mutex_take(&sfd->lock, RT_WAITING_FOREVER); in signalfd_callback()
204 if (sfd->sig_num < SIGINFO_MAX) in signalfd_callback()
206 sfd->info[sfd->sig_num].si_signo = signum; in signalfd_callback()
207 sfd->sig_num += 1; in signalfd_callback()
209 rt_mutex_release(&sfd->lock); in signalfd_callback()
220 static int signalfd_add_notify(struct rt_signalfd_ctx *sfd) in signalfd_add_notify() argument
227 rt_mutex_take(&sfd->lock, RT_WAITING_FOREVER); in signalfd_add_notify()
231 if (sfd->lwp[i]) in signalfd_add_notify()
233 if (sfd->lwp[i] == lwp_self()) in signalfd_add_notify()
242 sfd->lwp[is_head_init] = lwp_self(); in signalfd_add_notify()
246 rt_slist_init(&sfd->lwp[is_head_init]->signalfd_notify_head); in signalfd_add_notify()
253 lwp_notify->signalfd_queue = &sfd->signalfd_queue; in signalfd_add_notify()
254 … rt_slist_append(&sfd->lwp[is_head_init]->signalfd_notify_head, &(lwp_notify->list_node)); in signalfd_add_notify()
261 rt_slist_for_each(node, &sfd->lwp[is_head_init]->signalfd_notify_head) in signalfd_add_notify()
264 rt_slist_remove(&sfd->lwp[is_head_init]->signalfd_notify_head, &n->list_node); in signalfd_add_notify()
271 rt_mutex_release(&sfd->lock); in signalfd_add_notify()
286 struct rt_signalfd_ctx *sfd; in signalfd_do() local
300 sfd = (struct rt_signalfd_ctx *)rt_malloc(sizeof(struct rt_signalfd_ctx)); in signalfd_do()
301 if (sfd) in signalfd_do()
307 df->vnode->data = sfd; in signalfd_do()
311 sfd->lwp[i] = RT_NULL; in signalfd_do()
314 sigemptyset(&sfd->sigmask); in signalfd_do()
315 memcpy(&sfd->sigmask, mask, sizeof(sigset_t)); in signalfd_do()
317 rt_mutex_init(&sfd->lock, SIGNALFD_MUTEX_NAME, RT_IPC_FLAG_FIFO); in signalfd_do()
318 rt_wqueue_init(&sfd->signalfd_queue); in signalfd_do()
320 if (signalfd_add_notify(sfd) < 0) in signalfd_do()
324 rt_free(sfd); in signalfd_do()
328 sfd->sig_num = 0; in signalfd_do()
339 rt_free(sfd); in signalfd_do()
359 sfd = df->vnode->data; in signalfd_do()
361 sigemptyset(&sfd->sigmask); in signalfd_do()
362 memcpy(&sfd->sigmask, mask, sizeof(sigset_t)); in signalfd_do()