Lines Matching refs:uipc
81 static int uipc_close_ch_locked(tUIPC_STATE& uipc, tUIPC_CH_ID ch_id);
181 static int uipc_main_init(tUIPC_STATE& uipc) { in uipc_main_init() argument
186 uipc.tid = 0; in uipc_main_init()
187 uipc.running = 0; in uipc_main_init()
188 memset(&uipc.active_set, 0, sizeof(uipc.active_set)); in uipc_main_init()
189 memset(&uipc.read_set, 0, sizeof(uipc.read_set)); in uipc_main_init()
190 uipc.max_fd = 0; in uipc_main_init()
191 memset(&uipc.signal_fds, 0, sizeof(uipc.signal_fds)); in uipc_main_init()
192 memset(&uipc.ch, 0, sizeof(uipc.ch)); in uipc_main_init()
195 if (socketpair(AF_UNIX, SOCK_STREAM, 0, uipc.signal_fds) < 0) { in uipc_main_init()
199 FD_SET(uipc.signal_fds[0], &uipc.active_set); in uipc_main_init()
200 uipc.max_fd = MAX(uipc.max_fd, uipc.signal_fds[0]); in uipc_main_init()
203 tUIPC_CHAN* p = &uipc.ch[i]; in uipc_main_init()
213 void uipc_main_cleanup(tUIPC_STATE& uipc) { in uipc_main_cleanup() argument
218 close(uipc.signal_fds[0]); in uipc_main_cleanup()
219 close(uipc.signal_fds[1]); in uipc_main_cleanup()
222 for (i = 0; i < UIPC_CH_NUM; i++) uipc_close_ch_locked(uipc, i); in uipc_main_cleanup()
226 static void uipc_check_task_flags_locked(tUIPC_STATE& uipc) { in uipc_check_task_flags_locked() argument
230 if (uipc.ch[i].task_evt_flags & UIPC_TASK_FLAG_DISCONNECT_CHAN) { in uipc_check_task_flags_locked()
231 uipc.ch[i].task_evt_flags &= ~UIPC_TASK_FLAG_DISCONNECT_CHAN; in uipc_check_task_flags_locked()
232 uipc_close_ch_locked(uipc, i); in uipc_check_task_flags_locked()
239 static int uipc_check_fd_locked(tUIPC_STATE& uipc, tUIPC_CH_ID ch_id) { in uipc_check_fd_locked() argument
245 if (SAFE_FD_ISSET(uipc.ch[ch_id].srvfd, &uipc.read_set)) { in uipc_check_fd_locked()
249 if (uipc.ch[ch_id].fd != UIPC_DISCONNECTED) { in uipc_check_fd_locked()
250 BTIF_TRACE_EVENT("CLOSE CONNECTION (FD %d)", uipc.ch[ch_id].fd); in uipc_check_fd_locked()
251 close(uipc.ch[ch_id].fd); in uipc_check_fd_locked()
252 FD_CLR(uipc.ch[ch_id].fd, &uipc.active_set); in uipc_check_fd_locked()
253 uipc.ch[ch_id].fd = UIPC_DISCONNECTED; in uipc_check_fd_locked()
256 uipc.ch[ch_id].fd = accept_server_socket(uipc.ch[ch_id].srvfd); in uipc_check_fd_locked()
258 BTIF_TRACE_EVENT("NEW FD %d", uipc.ch[ch_id].fd); in uipc_check_fd_locked()
260 if ((uipc.ch[ch_id].fd >= 0) && uipc.ch[ch_id].cback) { in uipc_check_fd_locked()
263 BTIF_TRACE_EVENT("ADD FD %d TO ACTIVE SET", uipc.ch[ch_id].fd); in uipc_check_fd_locked()
264 FD_SET(uipc.ch[ch_id].fd, &uipc.active_set); in uipc_check_fd_locked()
265 uipc.max_fd = MAX(uipc.max_fd, uipc.ch[ch_id].fd); in uipc_check_fd_locked()
268 if (uipc.ch[ch_id].fd < 0) { in uipc_check_fd_locked()
273 if (uipc.ch[ch_id].cback) uipc.ch[ch_id].cback(ch_id, UIPC_OPEN_EVT); in uipc_check_fd_locked()
278 if (SAFE_FD_ISSET(uipc.ch[ch_id].fd, &uipc.read_set)) { in uipc_check_fd_locked()
281 if (uipc.ch[ch_id].cback) in uipc_check_fd_locked()
282 uipc.ch[ch_id].cback(ch_id, UIPC_RX_DATA_READY_EVT); in uipc_check_fd_locked()
287 static void uipc_check_interrupt_locked(tUIPC_STATE& uipc) { in uipc_check_interrupt_locked() argument
288 if (SAFE_FD_ISSET(uipc.signal_fds[0], &uipc.read_set)) { in uipc_check_interrupt_locked()
291 recv(uipc.signal_fds[0], &sig_recv, sizeof(sig_recv), MSG_WAITALL)); in uipc_check_interrupt_locked()
295 static inline void uipc_wakeup_locked(tUIPC_STATE& uipc) { in uipc_wakeup_locked() argument
299 OSI_NO_INTR(send(uipc.signal_fds[1], &sig_on, sizeof(sig_on), 0)); in uipc_wakeup_locked()
302 static int uipc_setup_server_locked(tUIPC_STATE& uipc, tUIPC_CH_ID ch_id, in uipc_setup_server_locked() argument
310 std::lock_guard<std::recursive_mutex> guard(uipc.mutex); in uipc_setup_server_locked()
320 FD_SET(fd, &uipc.active_set); in uipc_setup_server_locked()
321 uipc.max_fd = MAX(uipc.max_fd, fd); in uipc_setup_server_locked()
323 uipc.ch[ch_id].srvfd = fd; in uipc_setup_server_locked()
324 uipc.ch[ch_id].cback = cback; in uipc_setup_server_locked()
325 uipc.ch[ch_id].read_poll_tmo_ms = DEFAULT_READ_POLL_TMO_MS; in uipc_setup_server_locked()
328 uipc_wakeup_locked(uipc); in uipc_setup_server_locked()
333 static void uipc_flush_ch_locked(tUIPC_STATE& uipc, tUIPC_CH_ID ch_id) { in uipc_flush_ch_locked() argument
338 pfd.fd = uipc.ch[ch_id].fd; in uipc_flush_ch_locked()
340 if (uipc.ch[ch_id].fd == UIPC_DISCONNECTED) { in uipc_flush_ch_locked()
372 static void uipc_flush_locked(tUIPC_STATE& uipc, tUIPC_CH_ID ch_id) { in uipc_flush_locked() argument
377 uipc_flush_ch_locked(uipc, UIPC_CH_ID_AV_CTRL); in uipc_flush_locked()
381 uipc_flush_ch_locked(uipc, UIPC_CH_ID_AV_AUDIO); in uipc_flush_locked()
386 static int uipc_close_ch_locked(tUIPC_STATE& uipc, tUIPC_CH_ID ch_id) { in uipc_close_ch_locked() argument
393 if (uipc.ch[ch_id].srvfd != UIPC_DISCONNECTED) { in uipc_close_ch_locked()
394 BTIF_TRACE_EVENT("CLOSE SERVER (FD %d)", uipc.ch[ch_id].srvfd); in uipc_close_ch_locked()
395 close(uipc.ch[ch_id].srvfd); in uipc_close_ch_locked()
396 FD_CLR(uipc.ch[ch_id].srvfd, &uipc.active_set); in uipc_close_ch_locked()
397 uipc.ch[ch_id].srvfd = UIPC_DISCONNECTED; in uipc_close_ch_locked()
401 if (uipc.ch[ch_id].fd != UIPC_DISCONNECTED) { in uipc_close_ch_locked()
402 BTIF_TRACE_EVENT("CLOSE CONNECTION (FD %d)", uipc.ch[ch_id].fd); in uipc_close_ch_locked()
403 close(uipc.ch[ch_id].fd); in uipc_close_ch_locked()
404 FD_CLR(uipc.ch[ch_id].fd, &uipc.active_set); in uipc_close_ch_locked()
405 uipc.ch[ch_id].fd = UIPC_DISCONNECTED; in uipc_close_ch_locked()
410 if (uipc.ch[ch_id].cback) uipc.ch[ch_id].cback(ch_id, UIPC_CLOSE_EVT); in uipc_close_ch_locked()
413 if (wakeup) uipc_wakeup_locked(uipc); in uipc_close_ch_locked()
418 void uipc_close_locked(tUIPC_STATE& uipc, tUIPC_CH_ID ch_id) { in uipc_close_locked() argument
419 if (uipc.ch[ch_id].srvfd == UIPC_DISCONNECTED) { in uipc_close_locked()
425 uipc.ch[ch_id].task_evt_flags |= UIPC_TASK_FLAG_DISCONNECT_CHAN; in uipc_close_locked()
426 uipc_wakeup_locked(uipc); in uipc_close_locked()
430 tUIPC_STATE& uipc = *((tUIPC_STATE*)arg); in uipc_read_task() local
438 while (uipc.running) { in uipc_read_task()
439 uipc.read_set = uipc.active_set; in uipc_read_task()
441 result = select(uipc.max_fd + 1, &uipc.read_set, NULL, NULL, NULL); in uipc_read_task()
455 std::lock_guard<std::recursive_mutex> guard(uipc.mutex); in uipc_read_task()
458 uipc_check_interrupt_locked(uipc); in uipc_read_task()
461 uipc_check_task_flags_locked(uipc); in uipc_read_task()
464 uipc_check_fd_locked(uipc, UIPC_CH_ID_AV_AUDIO); in uipc_read_task()
468 if (ch_id != UIPC_CH_ID_AV_AUDIO) uipc_check_fd_locked(uipc, ch_id); in uipc_read_task()
475 uipc_main_cleanup(uipc); in uipc_read_task()
477 uipc.tid = 0; in uipc_read_task()
484 int uipc_start_main_server_thread(tUIPC_STATE& uipc) { in uipc_start_main_server_thread() argument
485 uipc.running = 1; in uipc_start_main_server_thread()
487 if (pthread_create(&uipc.tid, (const pthread_attr_t*)NULL, uipc_read_task, in uipc_start_main_server_thread()
488 &uipc) != 0) { in uipc_start_main_server_thread()
497 void uipc_stop_main_server_thread(tUIPC_STATE& uipc) { in uipc_stop_main_server_thread() argument
500 std::lock_guard<std::recursive_mutex> lock(uipc.mutex); in uipc_stop_main_server_thread()
501 uipc.running = 0; in uipc_stop_main_server_thread()
502 uipc_wakeup_locked(uipc); in uipc_stop_main_server_thread()
509 if (uipc.tid) pthread_join(uipc.tid, NULL); in uipc_stop_main_server_thread()
522 std::unique_ptr<tUIPC_STATE> uipc = std::make_unique<tUIPC_STATE>(); in UIPC_Init() local
525 std::lock_guard<std::recursive_mutex> lock(uipc->mutex); in UIPC_Init()
527 uipc_main_init(*uipc); in UIPC_Init()
528 uipc_start_main_server_thread(*uipc); in UIPC_Init()
530 return uipc; in UIPC_Init()
542 bool UIPC_Open(tUIPC_STATE& uipc, tUIPC_CH_ID ch_id, tUIPC_RCV_CBACK* p_cback, in UIPC_Open() argument
546 std::lock_guard<std::recursive_mutex> lock(uipc.mutex); in UIPC_Open()
552 if (uipc.ch[ch_id].srvfd != UIPC_DISCONNECTED) { in UIPC_Open()
557 uipc_setup_server_locked(uipc, ch_id, socket_path, p_cback); in UIPC_Open()
571 void UIPC_Close(tUIPC_STATE& uipc, tUIPC_CH_ID ch_id) { in UIPC_Close() argument
576 std::lock_guard<std::recursive_mutex> lock(uipc.mutex); in UIPC_Close()
577 uipc_close_locked(uipc, ch_id); in UIPC_Close()
582 uipc_stop_main_server_thread(uipc); in UIPC_Close()
595 bool UIPC_Send(tUIPC_STATE& uipc, tUIPC_CH_ID ch_id, in UIPC_Send() argument
600 std::lock_guard<std::recursive_mutex> lock(uipc.mutex); in UIPC_Send()
603 OSI_NO_INTR(ret = write(uipc.ch[ch_id].fd, p_buf, msglen)); in UIPC_Send()
621 uint32_t UIPC_Read(tUIPC_STATE& uipc, tUIPC_CH_ID ch_id, in UIPC_Read() argument
630 int fd = uipc.ch[ch_id].fd; in UIPC_Read()
646 OSI_NO_INTR(poll_ret = poll(&pfd, 1, uipc.ch[ch_id].read_poll_tmo_ms)); in UIPC_Read()
649 uipc.ch[ch_id].read_poll_tmo_ms); in UIPC_Read()
662 std::lock_guard<std::recursive_mutex> lock(uipc.mutex); in UIPC_Read()
663 uipc_close_locked(uipc, ch_id); in UIPC_Read()
674 std::lock_guard<std::recursive_mutex> lock(uipc.mutex); in UIPC_Read()
675 uipc_close_locked(uipc, ch_id); in UIPC_Read()
700 extern bool UIPC_Ioctl(tUIPC_STATE& uipc, tUIPC_CH_ID ch_id, uint32_t request, in UIPC_Ioctl() argument
704 std::lock_guard<std::recursive_mutex> lock(uipc.mutex); in UIPC_Ioctl()
708 uipc_flush_locked(uipc, ch_id); in UIPC_Ioctl()
714 uipc.ch[ch_id].cback = (tUIPC_RCV_CBACK*)param; in UIPC_Ioctl()
719 if (uipc.ch[ch_id].fd != UIPC_DISCONNECTED) { in UIPC_Ioctl()
721 FD_CLR(uipc.ch[ch_id].fd, &uipc.active_set); in UIPC_Ioctl()
724 uipc_wakeup_locked(uipc); in UIPC_Ioctl()
729 uipc.ch[ch_id].read_poll_tmo_ms = (intptr_t)param; in UIPC_Ioctl()
731 uipc.ch[ch_id].read_poll_tmo_ms); in UIPC_Ioctl()