The open source OpenXR runtime
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

ipc: Improve init_all error handling.

Also fixes a bug where teardown would be called twice if the service was
already running, under debug builds this assert in mutex destroy.

Part-of: <https://gitlab.freedesktop.org/monado/monado/-/merge_requests/2468>

authored by

Jakob Bornecrantz and committed by
Marge Bot
5c137fe2 62a0a874

+41 -58
+41 -58
src/xrt/ipc/server/ipc_server_process.c
··· 103 103 idev->io_active = false; 104 104 } 105 105 106 - static int 106 + static void 107 107 init_idevs(struct ipc_server *s) 108 108 { 109 109 // Copy the devices over into the idevs array. ··· 114 114 115 115 init_idev(&s->idevs[i], s->xsysd->xdevs[i]); 116 116 } 117 - 118 - return 0; 119 117 } 120 118 121 119 static void ··· 217 215 os_mutex_destroy(&s->global_state.lock); 218 216 } 219 217 220 - static int 218 + static void 221 219 init_tracking_origins(struct ipc_server *s) 222 220 { 223 221 for (size_t i = 0; i < XRT_SYSTEM_MAX_DEVICES; i++) { ··· 240 238 } 241 239 } 242 240 } 243 - 244 - return 0; 245 241 } 246 242 247 243 static void ··· 284 280 *output_pair_index_ptr = output_pair_index; 285 281 } 286 282 287 - static int 283 + XRT_CHECK_RESULT static xrt_result_t 288 284 init_shm(struct ipc_server *s) 289 285 { 290 286 const size_t size = sizeof(struct ipc_shared_memory); 291 287 xrt_shmem_handle_t handle; 292 - xrt_result_t result = ipc_shmem_create(size, &handle, (void **)&s->ism); 293 - if (result != XRT_SUCCESS) { 294 - return -1; 295 - } 288 + 289 + xrt_result_t xret = ipc_shmem_create(size, &handle, (void **)&s->ism); 290 + IPC_CHK_AND_RET(s, xret, "ipc_shmem_create"); 296 291 297 292 // we have a filehandle, we will pass this to our client 298 293 s->ism_handle = handle; ··· 440 435 // Fill out git version info. 441 436 snprintf(s->ism->u_git_tag, IPC_VERSION_NAME_LEN, "%s", u_git_tag); 442 437 443 - return 0; 438 + return XRT_SUCCESS; 444 439 } 445 440 446 441 static void ··· 460 455 } 461 456 } 462 457 463 - static int 458 + static xrt_result_t 464 459 init_all(struct ipc_server *s, enum u_logging_level log_level) 465 460 { 466 - xrt_result_t xret; 461 + xrt_result_t xret = XRT_SUCCESS; 467 462 int ret; 468 463 469 464 // First order of business set the log level. ··· 474 469 if (ret < 0) { 475 470 IPC_ERROR(s, "Global state lock mutex failed to init!"); 476 471 // Do not call teardown_all here, os_mutex_destroy will assert. 477 - return ret; 472 + return XRT_ERROR_SYNC_PRIMITIVE_CREATION_FAILED; 478 473 } 479 474 480 475 s->process = u_process_create_if_not_running(); 481 - 482 476 if (!s->process) { 483 477 IPC_ERROR(s, "monado-service is already running! Use XRT_LOG=trace for more information."); 484 - teardown_all(s); 485 - return 1; 478 + xret = XRT_ERROR_IPC_SERVICE_ALREADY_RUNNING; 486 479 } 480 + IPC_CHK_WITH_GOTO(s, xret, "u_process_create_if_not_running", error); 487 481 488 482 // Yes we should be running. 489 483 s->running = true; ··· 494 488 s->exit_when_idle_delay_ns = delay_ms * U_TIME_1MS_IN_NS; 495 489 496 490 xret = xrt_instance_create(NULL, &s->xinst); 497 - if (xret != XRT_SUCCESS) { 498 - IPC_ERROR(s, "Failed to create instance!"); 499 - teardown_all(s); 500 - return -1; 501 - } 491 + IPC_CHK_WITH_GOTO(s, xret, "xrt_instance_create", error); 502 492 503 493 xret = xrt_instance_create_system(s->xinst, &s->xsys, &s->xsysd, &s->xso, &s->xsysc); 504 - if (xret != XRT_SUCCESS) { 505 - IPC_ERROR(s, "Could not create system!"); 506 - teardown_all(s); 507 - return -1; 508 - } 494 + IPC_CHK_WITH_GOTO(s, xret, "xrt_instance_create_system", error); 509 495 510 - ret = init_idevs(s); 511 - if (ret < 0) { 512 - IPC_ERROR(s, "Failed to init idevs!"); 513 - teardown_all(s); 514 - return ret; 515 - } 496 + // Always succeeds. 497 + init_idevs(s); 498 + init_tracking_origins(s); 516 499 517 - ret = init_tracking_origins(s); 518 - if (ret < 0) { 519 - IPC_ERROR(s, "Failed to init tracking origins!"); 520 - teardown_all(s); 521 - return ret; 522 - } 523 - 524 - ret = init_shm(s); 525 - if (ret < 0) { 526 - IPC_ERROR(s, "Could not init shared memory!"); 527 - teardown_all(s); 528 - return ret; 529 - } 500 + xret = init_shm(s); 501 + IPC_CHK_WITH_GOTO(s, xret, "init_shm", error); 530 502 531 503 ret = ipc_server_mainloop_init(&s->ml); 532 504 if (ret < 0) { 533 - IPC_ERROR(s, "Failed to init ipc main loop!"); 534 - teardown_all(s); 535 - return ret; 505 + xret = XRT_ERROR_IPC_MAINLOOP_FAILED_TO_INIT; 536 506 } 507 + IPC_CHK_WITH_GOTO(s, xret, "ipc_server_mainloop_init", error); 537 508 538 509 // Never fails, do this second last. 539 510 init_server_state(s); ··· 545 516 u_var_add_u64(s, &s->exit_when_idle_delay_ns, "exit_when_idle_delay_ns"); 546 517 u_var_add_bool(s, (bool *)&s->running, "running"); 547 518 548 - return 0; 519 + return XRT_SUCCESS; 520 + 521 + error: 522 + teardown_all(s); 523 + 524 + return xret; 549 525 } 550 526 551 527 static int ··· 1000 976 int 1001 977 ipc_server_main(int argc, char **argv, const struct ipc_server_main_info *ismi) 1002 978 { 979 + xrt_result_t xret = XRT_SUCCESS; 980 + int ret = -1; 981 + 1003 982 // Get log level first. 1004 983 enum u_logging_level log_level = debug_get_log_option_ipc_log(); 1005 984 ··· 1020 999 */ 1021 1000 u_debug_gui_create(&ismi->udgci, &s->debug_gui); 1022 1001 1023 - 1024 - int ret = init_all(s, log_level); 1025 - if (ret < 0) { 1002 + xret = init_all(s, log_level); 1003 + U_LOG_CHK_ONLY_PRINT(log_level, xret, "init_all"); 1004 + if (xret != XRT_SUCCESS) { 1026 1005 #ifdef XRT_OS_LINUX 1027 1006 // Print information how to debug issues. 1028 1007 print_linux_end_user_failed_information(log_level); ··· 1030 1009 1031 1010 u_debug_gui_stop(&s->debug_gui); 1032 1011 free(s); 1033 - return ret; 1012 + return -1; 1034 1013 } 1035 1014 1036 1015 // Start the debug UI now (if enabled). ··· 1065 1044 int 1066 1045 ipc_server_main_android(struct ipc_server **ps, void (*startup_complete_callback)(void *data), void *data) 1067 1046 { 1047 + xrt_result_t xret = XRT_SUCCESS; 1048 + int ret = -1; 1049 + 1068 1050 // Get log level first. 1069 1051 enum u_logging_level log_level = debug_get_log_option_ipc_log(); 1070 1052 1071 1053 struct ipc_server *s = U_TYPED_CALLOC(struct ipc_server); 1072 1054 U_LOG_D("Created IPC server!"); 1073 1055 1074 - int ret = init_all(s, log_level); 1075 - if (ret < 0) { 1056 + xret = init_all(s, log_level); 1057 + U_LOG_CHK_ONLY_PRINT(log_level, xret, "init_all"); 1058 + if (xret != XRT_SUCCESS) { 1076 1059 free(s); 1077 1060 startup_complete_callback(data); 1078 - return ret; 1061 + return -1; 1079 1062 } 1080 1063 1081 1064 *ps = s;