| 1880 | } |
| 1881 | |
| 1882 | static void *application_update_thread(void *opaque) { |
| 1883 | cbm_daemon_application_t *application = opaque; |
| 1884 | cbm_daemon_application_update_worker_t worker = NULL; |
| 1885 | if (application->update_ops.start(application->update_ops.context, &worker) != 0 || !worker) { |
| 1886 | cbm_mutex_lock(&application->mutex); |
| 1887 | application_update_publish_terminal_locked(application, NULL, false); |
| 1888 | cbm_mutex_unlock(&application->mutex); |
| 1889 | return NULL; |
| 1890 | } |
| 1891 | |
| 1892 | cbm_mutex_lock(&application->mutex); |
| 1893 | application->update_worker = worker; |
| 1894 | if (application->update_cancel_requested || application->stopping || |
| 1895 | application->update_owners == 0) { |
| 1896 | application_update_cancel_locked(application); |
| 1897 | } |
| 1898 | cbm_mutex_unlock(&application->mutex); |
| 1899 | |
| 1900 | const char *latest_version = NULL; |
| 1901 | for (;;) { |
| 1902 | cbm_daemon_application_update_poll_t status = |
| 1903 | application->update_ops.poll(application->update_ops.context, worker, &latest_version); |
| 1904 | if (status != CBM_DAEMON_APPLICATION_UPDATE_POLL_RUNNING) { |
| 1905 | if (status == CBM_DAEMON_APPLICATION_UPDATE_POLL_ERROR) { |
| 1906 | latest_version = NULL; |
| 1907 | } |
| 1908 | break; |
| 1909 | } |
| 1910 | cbm_mutex_lock(&application->mutex); |
| 1911 | if (application->update_cancel_requested || application->stopping || |
| 1912 | application->update_owners == 0) { |
| 1913 | application_update_cancel_locked(application); |
| 1914 | } |
| 1915 | cbm_mutex_unlock(&application->mutex); |
| 1916 | cbm_usleep(APPLICATION_UPDATE_POLL_US); |
| 1917 | } |
| 1918 | |
| 1919 | char version[APPLICATION_UPDATE_VERSION_CAP] = {0}; |
| 1920 | if (latest_version && strlen(latest_version) < sizeof(version)) { |
| 1921 | (void)snprintf(version, sizeof(version), "%s", latest_version); |
| 1922 | } |
| 1923 | cbm_mutex_lock(&application->mutex); |
| 1924 | bool completed_generation = !application->update_cancel_requested && !application->stopping && |
| 1925 | application->update_owners > 0; |
| 1926 | application_update_publish_terminal_locked(application, version[0] ? version : NULL, |
| 1927 | completed_generation); |
| 1928 | cbm_mutex_unlock(&application->mutex); |
| 1929 | application->update_ops.destroy(application->update_ops.context, worker); |
| 1930 | return NULL; |
| 1931 | } |
| 1932 | |
| 1933 | static void application_update_subscribe_locked(cbm_daemon_application_session_t *session) { |
| 1934 | cbm_daemon_application_t *application = session->application; |
nothing calls this directly
no test coverage detected