]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
examples/lib: use a main loop to wait for exit
authorJason Ish <jason.ish@oisf.net>
Fri, 4 Oct 2024 22:28:05 +0000 (16:28 -0600)
committerVictor Julien <victor@inliniac.net>
Tue, 1 Apr 2025 08:17:05 +0000 (10:17 +0200)
Instead of immediately entering shutdown, use SuricataMainLoop to wait
for the end of the pcap.

Ticket: #7240

examples/lib/custom/main.c

index b910b328874265101db0e5bec24930a2a11ff3c4..12fb1f6bcbb63beffb1657dea7a035e6d0037892 100644 (file)
@@ -88,6 +88,11 @@ static void *SimpleWorker(void *arg)
     const u_char *packet;
     while ((packet = pcap_next(fp, &pkthdr)) != NULL) {
 
+        /* Have we been asked to stop? */
+        if (suricata_ctl_flags & SURICATA_STOP) {
+            goto done;
+        }
+
         Packet *p = PacketGetFromQueueOrAlloc();
         if (unlikely(p == NULL)) {
             /* Memory allocation error. */
@@ -125,8 +130,17 @@ static void *SimpleWorker(void *arg)
 done:
     pcap_close(fp);
 
-    /* Cleanup. */
-    SCRunModeLibDestroyWorker(tv);
+    /* Stop the engine. */
+    EngineStop();
+
+    /* Cleanup.
+     *
+     * Note that there is some thread synchronization between this
+     * function and SuricataShutdown such that they must be run
+     * concurrently at this time before either will exit. */
+    SCTmThreadsSlotPktAcqLoopFinish(tv);
+
+    SCLogNotice("Worker thread exiting");
     pthread_exit(NULL);
 }
 
@@ -211,7 +225,17 @@ int main(int argc, char **argv)
 
     SuricataPostInit();
 
+    /* Run the main loop, this just waits for the worker thread to
+     * call EngineStop signalling Suricata that it is done reading the
+     * pcap. */
+    SuricataMainLoop();
+
     /* Shutdown engine. */
+    SCLogNotice("Shutting down");
+
+    /* Note that there is some thread synchronization between this
+     * function and SCTmThreadsSlotPktAcqLoopFinish that require them
+     * to be run concurrently at this time. */
     SuricataShutdown();
     GlobalsDestroy();