BOOL cg_http_server_start(CgHttpServer *httpServer) { cg_log_debug_l4("Entering...\n"); if (httpServer->acceptThread != NULL) return FALSE; httpServer->acceptThread = cg_thread_new(); cg_thread_setaction(httpServer->acceptThread, cg_http_server_thread); cg_thread_setuserdata(httpServer->acceptThread, httpServer); /**** Thanks for Makela Aapo (10/31/05) ****/ httpServer->clientThreads = cg_threadlist_new(); if (cg_thread_start(httpServer->acceptThread) == FALSE) { cg_thread_delete(httpServer->acceptThread); httpServer->acceptThread = NULL; /**** Thanks for Makela Aapo (10/31/05) ****/ cg_threadlist_delete(httpServer->clientThreads); httpServer->clientThreads = NULL; return FALSE; } cg_log_debug_l4("Leaving...\n"); return TRUE; }
/** * Destroy the given control point * * @param ctrlPoint The control point struct to destroy */ void cg_upnp_controlpoint_delete(CgUpnpControlPoint *ctrlPoint) { cg_log_debug_l4("Entering...\n"); cg_upnp_controlpoint_stop(ctrlPoint); /* Delete cached interfaces */ cg_net_interfacelist_delete(ctrlPoint->ifCache); /* Delete expiration handlers */ cg_thread_delete(ctrlPoint->expThread); cg_mutex_delete(ctrlPoint->expMutex); cg_cond_delete(ctrlPoint->expCond); /* Delete others */ cg_mutex_delete(ctrlPoint->mutex); cg_xml_nodelist_delete(ctrlPoint->deviceRootNodeList); cg_upnp_devicelist_delete(ctrlPoint->deviceList); cg_upnp_ssdp_serverlist_delete(ctrlPoint->ssdpServerList); cg_upnp_ssdpresponse_serverlist_delete(ctrlPoint->ssdpResServerList); cg_http_serverlist_delete(ctrlPoint->httpServerList); cg_string_delete(ctrlPoint->httpEventURI); cg_upnp_eventlistenerlist_delete(ctrlPoint->eventListeners); #ifdef CG_HTTP_USE_PERSISTENT_CONNECTIONS cg_http_persistentconnection_clear(); #endif free(ctrlPoint); cg_log_debug_l4("Leaving...\n"); }
static DWORD WINAPI Win32ThreadProc(LPVOID lpParam) { CgThread *thread = (CgThread *)lpParam; //Theo Beisch: make sure we're runnable //thread->runnableFlag = TRUE; //(moved to start() with Visa Smolander's mod) thread->isRunning = TRUE; #if defined DEBUG_LOCKS memdiags_tlist_addthread(thread); #endif if (thread->action != NULL) { #if defined DEBUG printf ("#real Thr=%X hNd=%X lpP=%X %s start\n",thread,thread->hThread,lpParam , thread->friendlyName); #endif thread->action(thread); } #if defined DEBUG printf ("** REAL ExitThread(0)*\n"); printf ("*2 Thread ret4close 0x%Xh\n",GetCurrentThreadId()); printf ("*3 Thread %X %s \n",thread, thread->friendlyName); #endif thread->isRunning = FALSE; if (thread->deletePending) { cg_thread_delete(thread); } //proper friendly thread exit for WINCE cg_thread_exit(0); //dummy - compiler wants a return statement return 0; }
BOOL cg_upnp_ssdp_server_stop(CgUpnpSSDPServer *server) { cg_log_debug_l4("Entering...\n"); if (server->recvThread != NULL) { cg_thread_stop(server->recvThread); cg_thread_delete(server->recvThread); server->recvThread = NULL; } return TRUE; cg_log_debug_l4("Leaving...\n"); }
BOOL cg_bittorrent_client_stop(CgBittorrentClient *cbc) { if (cbc->httpServer) cg_http_server_stop(cbc->httpServer); if (cbc->acceptThread) { cg_thread_stop(cbc->acceptThread); cg_thread_delete(cbc->acceptThread); cbc->acceptThread = NULL; } if (cbc->clientThreads) { cg_threadlist_stop(cbc->clientThreads); cg_threadlist_delete(cbc->clientThreads); cbc->clientThreads = NULL; } return TRUE; }
BOOL cg_upnp_ssdp_server_start(CgUpnpSSDPServer *server) { if (server->recvThread != NULL) return FALSE; cg_log_debug_l4("Entering...\n"); server->recvThread = cg_thread_new(); cg_thread_setaction(server->recvThread, cg_upnp_ssdp_server_thread); cg_thread_setuserdata(server->recvThread, server); if (cg_thread_start(server->recvThread) == FALSE) { cg_thread_delete(server->recvThread); server->recvThread = NULL; return FALSE; } return TRUE; cg_log_debug_l4("Leaving...\n"); }
BOOL cg_http_server_stop(CgHttpServer *httpServer) { cg_log_debug_l4("Entering...\n"); if (httpServer->acceptThread != NULL) { cg_thread_stop(httpServer->acceptThread); cg_thread_delete(httpServer->acceptThread); httpServer->acceptThread = NULL; } /**** Thanks for Makela Aapo (10/31/05) ****/ if (httpServer->clientThreads != NULL) { cg_threadlist_stop(httpServer->clientThreads); cg_threadlist_delete(httpServer->clientThreads); httpServer->clientThreads = NULL; } cg_log_debug_l4("Leaving...\n"); return TRUE; }
static void cg_http_server_clientthread(CgThread *thread) { CgHttpServerClientData *clientData; CgHttpServer *httpServer; CgSocket *clientSock; void *httpServerUserData; CgHttpRequest *httpReq; char *version = NULL; cg_log_debug_l4("Entering...\n"); clientData = (CgHttpServerClientData *)cg_thread_getuserdata(thread); httpServer = clientData->httpServer; clientSock = clientData->clientSock; httpServerUserData = cg_http_server_getuserdata(httpServer); httpReq = cg_http_request_new(); cg_http_request_setsocket(httpReq, clientSock); /**** Thanks for Makela Aapo (10/31/05) ****/ while (cg_http_request_read(httpReq, clientSock) == TRUE && cg_thread_isrunnable(thread) == TRUE) { /* Check some validity of the request */ version = cg_http_request_getversion(httpReq); if (cg_strcmp(version, CG_HTTP_VER11) == 0) { /* According to HTTP/1.1 spec, we must not tolerate HTTP/1.1 request without HOST-header */ if (cg_http_request_gethost(httpReq) == NULL) { cg_http_request_postbadrequest(httpReq); continue; } } if (httpServer->listener != NULL) { cg_http_request_setuserdata(httpReq, httpServerUserData); httpServer->listener(httpReq); } /* Close connection according to HTTP version and headers */ if (cg_strcmp(version, CG_HTTP_VER10) == 0) { /* Terminate connection after HTTP/1.0 request */ break; } /* We are having HTTP/1.1 or better => terminate, if requested */ if (cg_http_request_iskeepaliveconnection(httpReq) == FALSE) { break; } } cg_log_debug_s("Dropping HTTP client\n"); cg_http_request_delete(httpReq); cg_socket_close(clientSock); cg_socket_delete(clientSock); cg_http_server_clientdata_delete(clientData); cg_thread_setuserdata(thread, NULL); // This code frequently crashes. mutex lock referencing free'd memory. cg_http_server_lock(httpServer); cg_thread_remove(thread); cg_http_server_unlock(httpServer); cg_log_debug_l4("Leaving...\n"); cg_thread_delete(thread); }