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 Renesas

Revision:
16:16289b6ec82a
Parent:
15:371fbad587ed
Child:
17:6b7076372285
--- 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);
         }
     }
 }