/* Clears remaining memory of the path repo */ static apr_status_t pr_cleanup(void *data) { path_repo_t *repo = data; int i; #ifdef DEBUG L1("path_repo: snapshot interval: %d\n", SNAPSHOT_INTERVAL); L1("path_repo: cache size: %d\n", CACHE_SIZE); L1("path_repo: stored deltas: %d kB\n", repo->delta_bytes / 1024); L1("path_repo: stored deltas (raw): %d kB\n", repo->delta_bytes_raw / 1024); L1("path_repo: total recon time: %ld ms\n", apr_time_msec(repo->recon_time)); L1("path_repo: total store time: %ld ms\n", apr_time_msec(repo->store_time)); L1("path_repo: cache miss rate: %.2f%% (%d of %d)\n", 100.0f*repo->cache_misses / (repo->cache_hits+repo->cache_misses), repo->cache_misses, (repo->cache_hits+repo->cache_misses)); #endif cb_tree_clear(&repo->tree); for (i = 0; i < repo->cache->nelts; i++) { if (APR_ARRAY_IDX(repo->cache, i, pr_cache_entry_t).tree.root) { cb_tree_clear(&APR_ARRAY_IDX(repo->cache, i, pr_cache_entry_t).tree); } } mukv_close(repo->db); #ifdef USE_SNAPPY snappy_free_env(&repo->snappy_env); #endif return APR_SUCCESS; }
APR_DECLARE(apr_status_t) apr_pollset_poll(apr_pollset_t *pollset, apr_interval_time_t timeout, apr_int32_t *num, const apr_pollfd_t **descriptors) { apr_os_sock_t fd; int ret, i; unsigned int nget; pfd_elem_t *ep; struct timespec tv, *tvptr; apr_status_t rv = APR_SUCCESS; if (timeout < 0) { tvptr = NULL; } else { tv.tv_sec = (long) apr_time_sec(timeout); tv.tv_nsec = (long) apr_time_msec(timeout); tvptr = &tv; } nget = 1; pollset_lock_rings(); while (!APR_RING_EMPTY(&(pollset->add_ring), pfd_elem_t, link)) { ep = APR_RING_FIRST(&(pollset->add_ring)); APR_RING_REMOVE(ep, link); if (ep->pfd.desc_type == APR_POLL_SOCKET) { fd = ep->pfd.desc.s->socketdes; } else { fd = ep->pfd.desc.f->filedes; } port_associate(pollset->port_fd, PORT_SOURCE_FD, fd, get_event(ep->pfd.reqevents), ep); APR_RING_INSERT_TAIL(&(pollset->query_ring), ep, pfd_elem_t, link); } pollset_unlock_rings(); ret = port_getn(pollset->port_fd, pollset->port_set, pollset->nalloc, &nget, tvptr); (*num) = nget; if (ret == -1) { (*num) = 0; if (errno == ETIME || errno == EINTR) { rv = APR_TIMEUP; } else { rv = APR_EGENERAL; } } else if (nget == 0) { rv = APR_TIMEUP; } else { pollset_lock_rings(); for (i = 0; i < nget; i++) { pollset->result_set[i] = (((pfd_elem_t*)(pollset->port_set[i].portev_user))->pfd); pollset->result_set[i].rtnevents = get_revent(pollset->port_set[i].portev_events); APR_RING_REMOVE((pfd_elem_t*)pollset->port_set[i].portev_user, link); APR_RING_INSERT_TAIL(&(pollset->add_ring), (pfd_elem_t*)pollset->port_set[i].portev_user, pfd_elem_t, link); } pollset_unlock_rings(); if (descriptors) { *descriptors = pollset->result_set; } } pollset_lock_rings(); /* Shift all PFDs in the Dead Ring to be Free Ring */ APR_RING_CONCAT(&(pollset->free_ring), &(pollset->dead_ring), pfd_elem_t, link); pollset_unlock_rings(); return rv; }
static const char *log_request_duration_milliseconds(request_rec *r, char *a) { apr_time_t duration = apr_time_now() - r->request_time; return apr_psprintf(r->pool, "%" APR_TIME_T_FMT ".%" APR_TIME_T_FMT, apr_time_sec(duration), apr_time_msec(duration)); }