Skip to content
Snippets Groups Projects
context.c 27.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • 	if (context->protocol_init_done)
    		vh = context->vhost_list;
    
    Andy Green's avatar
    Andy Green committed
    	while (vh) {
    
    Andy Green's avatar
    Andy Green committed
    		wsi.vhost = vh;
    
    Andy Green's avatar
    Andy Green committed
    		protocol = vh->protocols;
    
    Andy Green's avatar
    Andy Green committed
    		if (protocol) {
    			n = 0;
    			while (n < vh->count_protocols) {
    				wsi.protocol = protocol;
    
    Andy Green's avatar
    Andy Green committed
    				protocol->callback(&wsi, LWS_CALLBACK_PROTOCOL_DESTROY,
    						   NULL, NULL, 0);
    				protocol++;
    
    Andy Green's avatar
    Andy Green committed
    				n++;
    
    Andy Green's avatar
    Andy Green committed
    			}
    
    Andy Green's avatar
    Andy Green committed
    		}
    
    
    Andy Green's avatar
    Andy Green committed
    		vh = vh->vhost_next;
    	}
    
    Andy Green's avatar
    Andy Green committed
    	for (n = 0; n < context->count_threads; n++) {
    
    Andy Green's avatar
    Andy Green committed
    		pt = &context->pt[n];
    
    		lws_libev_destroyloop(context, n);
    		lws_libuv_destroyloop(context, n);
    
    
    Andy Green's avatar
    Andy Green committed
    		lws_free_set_NULL(context->pt[n].serv_buf);
    
    Andy Green's avatar
    Andy Green committed
    		if (pt->ah_pool)
    			lws_free(pt->ah_pool);
    		if (pt->http_header_data)
    			lws_free(pt->http_header_data);
    
    Andy Green's avatar
    Andy Green committed
    	}
    
    	lws_plat_context_early_destroy(context);
    
    Andy Green's avatar
    Andy Green committed
    
    
    Andy Green's avatar
    Andy Green committed
    	if (context->pt[0].fds)
    
    Andy Green's avatar
    Andy Green committed
    		lws_free_set_NULL(context->pt[0].fds);
    
    Andy Green's avatar
    Andy Green committed
    	if (!LWS_LIBUV_ENABLED(context))
    		lws_context_destroy2(context);
    }
    
    /*
     * call the second one after the event loop has been shut down cleanly
     */
    
    LWS_VISIBLE void
    lws_context_destroy2(struct lws_context *context)
    {
    	const struct lws_protocols *protocol = NULL;
    	struct lws_vhost *vh = NULL, *vh1;
    	int n;
    
    	lwsl_notice("%s: ctx %p\n", __func__, context);
    
    	/*
    	 * free all the per-vhost allocations
    	 */
    
    Andy Green's avatar
    Andy Green committed
    
    	vh = context->vhost_list;
    	while (vh) {
    		protocol = vh->protocols;
    		if (protocol) {
    			n = 0;
    			while (n < vh->count_protocols) {
    				if (vh->protocol_vh_privs &&
    				    vh->protocol_vh_privs[n]) {
    
    Andy Green's avatar
    Andy Green committed
    					// lwsl_notice("   %s: freeing per-vhost protocol data %p\n", __func__, vh->protocol_vh_privs[n]);
    
    Andy Green's avatar
    Andy Green committed
    					lws_free(vh->protocol_vh_privs[n]);
    					vh->protocol_vh_privs[n] = NULL;
    				}
    				protocol++;
    				n++;
    			}
    		}
    		if (vh->protocol_vh_privs)
    			lws_free(vh->protocol_vh_privs);
    		lws_ssl_SSL_CTX_destroy(vh);
    
    		lws_free(vh->same_vh_protocol_list);
    
    Andy Green's avatar
    Andy Green committed
    #ifdef LWS_WITH_PLUGINS
    		if (context->plugin_list)
    			lws_free((void *)vh->protocols);
    
    #else
    		if (vh->options & LWS_SERVER_OPTION_EXPLICIT_VHOSTS)
    			lws_free((void *)vh->protocols);
    #endif
    #ifdef LWS_WITH_PLUGINS
    
    Andy Green's avatar
    Andy Green committed
    #ifndef LWS_NO_EXTENSIONS
    		if (context->plugin_extension_count)
    			lws_free((void *)vh->extensions);
    #endif
    #endif
    
    #ifdef LWS_WITH_ACCESS_LOG
    
    		if (vh->log_fd != (int)LWS_INVALID_FILE)
    
    			close(vh->log_fd);
    #endif
    
    
    Andy Green's avatar
    Andy Green committed
    		vh1 = vh->vhost_next;
    		lws_free(vh);
    		vh = vh1;
    	}
    
    
    Andy Green's avatar
    Andy Green committed
    	lws_ssl_context_destroy(context);
    
    	lws_plat_context_late_destroy(context);
    
    	if (context->external_baggage_free_on_destroy)
    		free(context->external_baggage_free_on_destroy);
    
    
    Andy Green's avatar
    Andy Green committed
    
    
    	lws_free(context);