| 1775 | } |
| 1776 | |
| 1777 | static void *application_update_thread(void *opaque) { |
| 1778 | cbm_daemon_application_t *application = opaque; |
| 1779 | cbm_daemon_application_update_worker_t worker = NULL; |
| 1780 | if (application->update_ops.start(application->update_ops.context, &worker) != 0 || !worker) { |
| 1781 | cbm_mutex_lock(&application->mutex); |
| 1782 | application_update_publish_terminal_locked(application, NULL, false); |
| 1783 | cbm_mutex_unlock(&application->mutex); |
| 1784 | return NULL; |
| 1785 | } |
| 1786 | |
| 1787 | cbm_mutex_lock(&application->mutex); |
| 1788 | application->update_worker = worker; |
| 1789 | if (application->update_cancel_requested || application->stopping || |
| 1790 | application->update_owners == 0) { |
| 1791 | application_update_cancel_locked(application); |
| 1792 | } |
| 1793 | cbm_mutex_unlock(&application->mutex); |
| 1794 | |
| 1795 | const char *latest_version = NULL; |
| 1796 | for (;;) { |
| 1797 | cbm_daemon_application_update_poll_t status = |
| 1798 | application->update_ops.poll(application->update_ops.context, worker, &latest_version); |
| 1799 | if (status != CBM_DAEMON_APPLICATION_UPDATE_POLL_RUNNING) { |
| 1800 | if (status == CBM_DAEMON_APPLICATION_UPDATE_POLL_ERROR) { |
| 1801 | latest_version = NULL; |
| 1802 | } |
| 1803 | break; |
| 1804 | } |
| 1805 | cbm_mutex_lock(&application->mutex); |
| 1806 | if (application->update_cancel_requested || application->stopping || |
| 1807 | application->update_owners == 0) { |
| 1808 | application_update_cancel_locked(application); |
| 1809 | } |
| 1810 | cbm_mutex_unlock(&application->mutex); |
| 1811 | cbm_usleep(APPLICATION_UPDATE_POLL_US); |
| 1812 | } |
| 1813 | |
| 1814 | char version[APPLICATION_UPDATE_VERSION_CAP] = {0}; |
| 1815 | if (latest_version && strlen(latest_version) < sizeof(version)) { |
| 1816 | (void)snprintf(version, sizeof(version), "%s", latest_version); |
| 1817 | } |
| 1818 | cbm_mutex_lock(&application->mutex); |
| 1819 | bool completed_generation = !application->update_cancel_requested && !application->stopping && |
| 1820 | application->update_owners > 0; |
| 1821 | application_update_publish_terminal_locked(application, version[0] ? version : NULL, |
| 1822 | completed_generation); |
| 1823 | cbm_mutex_unlock(&application->mutex); |
| 1824 | application->update_ops.destroy(application->update_ops.context, worker); |
| 1825 | return NULL; |
| 1826 | } |
| 1827 | |
| 1828 | static void application_update_subscribe_locked(cbm_daemon_application_session_t *session) { |
| 1829 | cbm_daemon_application_t *application = session->application; |
nothing calls this directly
no test coverage detected