void format_plugin_clear (format_plugin_t *format, client_t *client) { if (format == NULL) return; if (format->free_plugin) format->free_plugin (format, client); rate_free (format->in_bitrate); rate_free (format->out_bitrate); free (format->charset); if (format->parser && format->parser != client->parser) // a relay client may have a new parser httpp_destroy (format->parser); memset (format, 0, sizeof (format_plugin_t)); }
static void remove_from_fh (fh_node *fh, client_t *client) { thread_mutex_lock (&fh->lock); fh->refcount--; if (fh->clients) { avl_delete (fh->clients, client, NULL); if ((fh->refcount != fh->clients->length && fh->finfo.mount) || ((fh->refcount != fh->clients->length+1) && fh->finfo.mount == NULL)) ERROR3 (" on %s, with ref %d, len %d", fh->finfo.mount, fh->refcount, fh->clients->length); } if (fh->refcount == 0 && fh->finfo.mount) { rate_free (fh->out_bitrate); if ((fh->finfo.flags & FS_FALLBACK) == 0) { fh->out_bitrate = NULL; if (fh->finfo.flags & FS_DELETE) { thread_mutex_unlock (&fh->lock); _delete_fh (fh); return; } DEBUG1 ("setting timeout as no clients on %s", fh->finfo.mount); fh->expire = time(NULL) + 10; } fh->out_bitrate = rate_setup (10000, 1000); } thread_mutex_unlock (&fh->lock); }
static int _delete_fh (void *mapping) { fh_node *fh = mapping; if (fh == &no_file) { ERROR0 ("no file handle free detected"); return 0; } if (fh->refcount) WARN2 ("handle for %s has refcount %d", fh->finfo.mount, fh->refcount); else thread_mutex_destroy (&fh->lock); file_close (&fh->f); if (fh->format) { free (fh->format->mount); format_plugin_clear (fh->format, NULL); free (fh->format); } if (fh->clients) avl_tree_free (fh->clients, NULL); rate_free (fh->out_bitrate); free (fh->finfo.mount); free (fh->finfo.fallback); free (fh); return 1; }
static void remove_from_fh (fh_node *fh, client_t *client) { thread_mutex_lock (&fh->lock); avl_delete (fh->clients, client, NULL); fh->refcount--; if (fh->refcount == 0 && fh->finfo.mount) { rate_free (fh->out_bitrate); fh->out_bitrate = rate_setup (10000, 1000); if ((fh->finfo.flags & FS_FALLBACK) == 0) { if (fh->finfo.flags & FS_DELETE) { thread_mutex_unlock (&fh->lock); _delete_fh (fh); return; } else { DEBUG1 ("setting timeout as no clients on %s", fh->finfo.mount); fh->expire = time(NULL) + 10; } } } thread_mutex_unlock (&fh->lock); }
void global_shutdown(void) { thread_mutex_destroy(&_global_mutex); avl_tree_free(global.source_tree, NULL); rate_free (global.out_bitrate); global.out_bitrate = NULL; #ifdef MY_ALLOC avl_tree_free(global.alloc_tree, free_alloc_node); #endif }
int router_mio_callback(mio_t m, mio_action_t a, mio_fd_t fd, void *data, void *arg) { component_t comp = (component_t) arg; router_t r = (router_t) arg; struct sockaddr_storage sa; socklen_t namelen = sizeof(sa); int port, nbytes; switch(a) { case action_READ: log_debug(ZONE, "read action on fd %d", fd->fd); /* they did something */ comp->last_activity = time(NULL); ioctl(fd->fd, FIONREAD, &nbytes); if(nbytes == 0) { sx_kill(comp->s); return 0; } return sx_can_read(comp->s); case action_WRITE: log_debug(ZONE, "write action on fd %d", fd->fd); /* update activity timestamp */ comp->last_activity = time(NULL); return sx_can_write(comp->s); case action_CLOSE: log_debug(ZONE, "close action on fd %d", fd->fd); r = comp->r; log_write(r->log, LOG_NOTICE, "[%s, port=%d] disconnect", comp->ip, comp->port); /* unbind names */ xhash_walk(comp->routes, _router_route_unbind_walker, (void *) comp); /* deregister component */ xhash_zap(r->components, comp->ipport); xhash_free(comp->routes); if(comp->tq != NULL) /* !!! bounce packets */ jqueue_free(comp->tq); rate_free(comp->rate); jqueue_push(comp->r->dead, (void *) comp->s, 0); free(comp); break; case action_ACCEPT: log_debug(ZONE, "accept action on fd %d", fd->fd); getpeername(fd->fd, (struct sockaddr *) &sa, &namelen); port = j_inet_getport(&sa); log_write(r->log, LOG_NOTICE, "[%s, port=%d] connect", (char *) data, port); if(_router_accept_check(r, fd, (char *) data) != 0) return 1; comp = (component_t) calloc(1, sizeof(struct component_st)); comp->r = r; comp->fd = fd; snprintf(comp->ip, INET6_ADDRSTRLEN, "%s", (char *) data); comp->port = port; snprintf(comp->ipport, INET6_ADDRSTRLEN + 6, "%s:%d", comp->ip, comp->port); comp->s = sx_new(r->sx_env, fd->fd, _router_sx_callback, (void *) comp); mio_app(m, fd, router_mio_callback, (void *) comp); if(r->byte_rate_total != 0) comp->rate = rate_new(r->byte_rate_total, r->byte_rate_seconds, r->byte_rate_wait); comp->routes = xhash_new(51); /* register component */ log_debug(ZONE, "new component (%p) \"%s\"", comp, comp->ipport); xhash_put(r->components, comp->ipport, (void *) comp); #ifdef HAVE_SSL sx_server_init(comp->s, SX_SSL_STARTTLS_OFFER | SX_SASL_OFFER); #else sx_server_init(comp->s, SX_SASL_OFFER); #endif break; } return 0; }