static void clean_old_connections(request_rec *r) {
    upload_progress_node_t *prev = NULL;
    ServerConfig *config = get_server_config(r);
    CACHE_LOCK();
    upload_progress_node_t *node = fetch_first_node(config);
    while(node != NULL) {
        if(time(NULL) > node->expires && node->done == 1 && node->expires != -1) {
            /*clean*/
	    if(prev == NULL) {
		/* head */
		upload_progress_cache_t *cache = fetch_cache(config);
		cache->head = fetch_node(config, node->next);
		cache_free(config, node->key);
		cache_free(config, node);
		node = cache->head;
		continue;
	    } else {
		prev->next = node->next;
		cache_free(config, node->key);
		cache_free(config, node);
		node = prev;
		continue;
	    }
        }
	prev = node;
	node = fetch_node(config, node->next);
  }
  CACHE_UNLOCK();
}
void upload_progress_destroy_cache(ServerConfig *config) {
    upload_progress_cache_t *cache = fetch_cache(config);
    upload_progress_node_t *node, *temp;
   
    cache_free(config, cache);
    node = fetch_node(config, cache->head);
    while(node != NULL) {
      temp = fetch_node(config, node->next);
      
      cache_free(config, node);
      node = temp;
    }
}
upload_progress_node_t *fetch_last_node(ServerConfig *config) {
  upload_progress_cache_t *cache;
  upload_progress_node_t *node;
  
  cache = fetch_cache(config);
  if(cache->head == NULL) {
    return NULL;
  }
  
  node = fetch_node(config, cache->head);
  while(node->next != NULL) {
    node = fetch_node(config, node->next);
  }
  
  return node;
}
upload_progress_node_t *fetch_first_node(ServerConfig *config) {
  upload_progress_cache_t *cache;
  
  cache = fetch_cache(config);
  if(cache->head == NULL) {
    return NULL;
  }
  
  return fetch_node(config, cache->head);
}
upload_progress_node_t *find_node(request_rec *r, const char *key) {
  upload_progress_node_t *node;

  ServerConfig *config = (ServerConfig*)ap_get_module_config(r->server->module_config, &upload_progress_module);

  node = fetch_first_node(config);
  if(node == NULL) {
    return NULL;
  }
  
  while(node != NULL) {
    if(check_node(config, node, key)) {
      return node;
    }
    node = fetch_node(config, node->next);
  }
  return node;
}
void abstract_scheduled_actor::enqueue(actor* sender, any_tuple const& msg)
{
    enqueue_node(fetch_node(sender, msg));
    //enqueue_node(new queue_node(sender, msg));
}
void abstract_scheduled_actor::enqueue(actor* sender, any_tuple&& msg)
{
    enqueue_node(fetch_node(sender, std::move(msg)));
    //enqueue_node(new queue_node(sender, std::move(msg)));
}