HttpServer Library for "mbed-os" which added a snapshot handler.
Dependents: GR-PEACH-webcam GR-Boards_WebCamera GR-Boards_WebCamera GR-Boards_WebCamera
Fork of HttpServer_snapshot by
Diff: HTTPServer.h
- Revision:
- 16:16289b6ec82a
- Parent:
- 15:371fbad587ed
- Child:
- 17:6b7076372285
diff -r 371fbad587ed -r 16289b6ec82a HTTPServer.h --- a/HTTPServer.h Fri Jun 23 11:34:54 2017 +0000 +++ b/HTTPServer.h Thu Apr 11 09:24:27 2019 +0000 @@ -155,86 +155,59 @@ return ; } -#define THREAD_MAX 1 +#define THREAD_MAX 3 #if (THREAD_MAX > 1) static Thread *threads[THREAD_MAX]; -static Thread *xthread; +static bool soket_rady[THREAD_MAX]; +static TCPSocket clients[THREAD_MAX]; -static void HTTPServerChild (TCPSocket* client) +static void HTTPServerChild (void* param) { - http_server_debug_print("HTTPServerChiled Start......\r\n"); + TCPSocket* client = &clients[(int)param]; + bool* p_rady = &soket_rady[(int)param]; - for (;;) { - http_server_debug_print("(HTTPServer.h<HTTPServerChild>)Connection\r\n"); + while (1) { + Thread::signal_wait(1); dispatchRequest(client); - http_server_debug_print("(HTTPServer.h<HTTPServerChild>)Close\r\n"); client->close(); - Thread::signal_wait(1); - } -} - -static void HTTPServerCloser (TCPSocket *client) -{ - for (;;) { - client->close(); - http_server_debug_print("Close\r\n"); - Thread::signal_wait(1); + *p_rady = true; } } void HTTPServerStart(NetworkInterface *net, int port = 80, osPriority priority = osPriorityNormal) { - int i, t = 0; - TCPSocket clients[THREAD_MAX]; - TCPSocket xclient; + int i; - for (i = 0; i < THREAD_MAX; i ++) { - threads[i] = NULL; + for (i = 0; i < THREAD_MAX; i++) { + soket_rady[i] = true; + threads[i] = new Thread(priority, 1024 * 3); + threads[i]->start(callback(HTTPServerChild, (void *)i)); } - xthread = NULL; TCPServer server(net); server.bind(port); server.listen(); http_server_debug_print("Wait for new connection...\r\n"); - for (;;) { - http_server_debug_print("**Start Loop** \r\n"); - if (t >= 0) { - if(server.accept(&clients[t])==0) { - // fork child process - if (threads[t]) { - threads[t]->signal_set(1); - } else { - threads[t] = new Thread(priority, 1024 * 3); - threads[t]->start(callback(HTTPServerChild, &clients[t])); + while (1) { + while (1) { + for (i = 0; i < THREAD_MAX; i++) { + if (soket_rady[i] != false) { + break; } - http_server_debug_print("Forked %d\r\n", t); - } else { - Thread::wait(10); } - } else { - if(server.accept(&xclient)==0) { - // closer process - if (xthread) { - xthread->signal_set(1); - } else { - xthread = new Thread(priority); - xthread->start(callback(HTTPServerCloser, &xclient)); - } - http_server_debug_print("Connection full\r\n"); - } else { - Thread::wait(10); + if (i < THREAD_MAX) { + break; } + ThisThread::sleep_for(5); } - t = -1; - for (i = 0; i < THREAD_MAX; i ++) { - if ((threads[i] == NULL) - || ((threads[i]->get_state() == Thread::WaitingAnd))) { - if (t < 0) t = i; // next empty thread - } + http_server_debug_print("**Start Loop** \r\n"); + if(server.accept(&clients[i])==0) { + // fork child process + soket_rady[i] = false; + threads[i]->signal_set(1); } } }