]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
Clean up packet pool at shut down.
authorVictor Julien <victor@inliniac.net>
Mon, 2 Jul 2012 10:36:47 +0000 (12:36 +0200)
committerVictor Julien <victor@inliniac.net>
Mon, 2 Jul 2012 16:29:43 +0000 (18:29 +0200)
src/suricata.c
src/tm-queuehandlers.c
src/tm-queuehandlers.h
src/tmqh-packetpool.c
src/tmqh-packetpool.h
src/tmqh-ringbuffer.c
src/tmqh-ringbuffer.h

index afb2685e850a337fe16e09205b6d44b0270ea05c..cedc35a48b0e60dbe139fc4f609b297e81247e59 100644 (file)
@@ -1387,7 +1387,6 @@ int main(int argc, char **argv)
     }
     TmqhSetup();
 
-
     CIDRInit();
     SigParsePrepare();
     //PatternMatchPrepare(mpm_ctx, MPM_B2G);
@@ -1651,23 +1650,7 @@ int main(int argc, char **argv)
     }
 #endif /* OS_WIN32 */
 
-    /* pre allocate packets */
-    SCLogDebug("preallocating packets... packet size %" PRIuMAX "", (uintmax_t)SIZE_OF_PACKET);
-    int i = 0;
-    for (i = 0; i < max_pending_packets; i++) {
-        /* XXX pkt alloc function */
-        Packet *p = SCMalloc(SIZE_OF_PACKET);
-        if (p == NULL) {
-            SCLogError(SC_ERR_FATAL, "Fatal error encountered while allocating a packet. Exiting...");
-            exit(EXIT_FAILURE);
-        }
-        PACKET_INITIALIZE(p);
-
-        PacketPoolStorePacket(p);
-    }
-    SCLogInfo("preallocated %"PRIiMAX" packets. Total memory %"PRIuMAX"",
-        max_pending_packets, (uintmax_t)(max_pending_packets*SIZE_OF_PACKET));
-
+    PacketPoolInit(max_pending_packets);
     HostInitConfig(HOST_VERBOSE);
     FlowInitConfig(FLOW_VERBOSE);
 
@@ -1966,9 +1949,9 @@ int main(int argc, char **argv)
     TimeDeinit();
     SCProtoNameDeInit();
     DefragDestroy();
-    TmqhPacketpoolDestroy();
+    PacketPoolDestroy();
     MagicDeinit();
-
+    TmqhCleanup();
     TmModuleRunDeInit();
 
 #ifdef PROFILING
index b61a6c9e599e044c0513284a5b7bcf954c7b19af..f2c62cfc502d607bbe521d0a5b5a1a60dbc0cf70 100644 (file)
@@ -46,6 +46,11 @@ void TmqhSetup (void) {
     TmqhRingBufferRegister();
 }
 
+/** \brief Clean up registration time allocs */
+void TmqhCleanup(void) {
+    TmqhRingBufferDestroy();
+}
+
 Tmqh* TmqhGetQueueHandlerByName(char *name) {
     int i;
 
index 47f540ae51be4d69b1e786f57bd54d596bb660cc..63249799ad7ba5dfe0839246d7a49e518cfa70ab 100644 (file)
@@ -49,6 +49,7 @@ typedef struct Tmqh_ {
 Tmqh tmqh_table[TMQH_SIZE];
 
 void TmqhSetup (void);
+void TmqhCleanup(void);
 Tmqh* TmqhGetQueueHandlerByName(char *name);
 
 #endif /* __TM_QUEUEHANDLERS_H__ */
index 01422d39576c0583801524e9fb848fa8be2b0317..1e5a5cd1368dc6404dce27112d872bdb1eeb8e8a 100644 (file)
@@ -69,9 +69,8 @@ void TmqhPacketpoolRegister (void) {
 }
 
 void TmqhPacketpoolDestroy (void) {
-    if (ringbuffer != NULL) {
-       RingBufferDestroy(ringbuffer);
-    }
+    /* doing this clean up PacketPoolDestroy now,
+     * where we also clean the packets */
 }
 
 int PacketPoolIsEmpty(void) {
@@ -110,6 +109,40 @@ Packet *PacketPoolGetPacket(void) {
     return p;
 }
 
+void PacketPoolInit(intmax_t max_pending_packets) {
+    /* pre allocate packets */
+    SCLogDebug("preallocating packets... packet size %" PRIuMAX "", (uintmax_t)SIZE_OF_PACKET);
+    int i = 0;
+    for (i = 0; i < max_pending_packets; i++) {
+        /* XXX pkt alloc function */
+        Packet *p = SCMalloc(SIZE_OF_PACKET);
+        if (p == NULL) {
+            SCLogError(SC_ERR_FATAL, "Fatal error encountered while allocating a packet. Exiting...");
+            exit(EXIT_FAILURE);
+        }
+        PACKET_INITIALIZE(p);
+
+        PacketPoolStorePacket(p);
+    }
+    SCLogInfo("preallocated %"PRIiMAX" packets. Total memory %"PRIuMAX"",
+            max_pending_packets, (uintmax_t)(max_pending_packets*SIZE_OF_PACKET));
+}
+
+void PacketPoolDestroy(void) {
+    if (ringbuffer == NULL) {
+        return;
+    }
+
+    Packet *p = NULL;
+    while ((p = PacketPoolGetPacket()) != NULL) {
+        PACKET_CLEANUP(p);
+        SCFree(p);
+    }
+
+    RingBufferDestroy(ringbuffer);
+    ringbuffer = NULL;
+}
+
 Packet *TmqhInputPacketpool(ThreadVars *t)
 {
     Packet *p = NULL;
index 04c02e93aeb36af075ae0836a9c16125e957f7c9..b4138324f8f7081018f9a41db91eeeba27f332c5 100644 (file)
@@ -34,4 +34,7 @@ uint16_t PacketPoolSize(void);
 void PacketPoolStorePacket(Packet *);
 void PacketPoolWait(void);
 
+void PacketPoolInit(intmax_t max_pending_packets);
+void PacketPoolDestroy(void);
+
 #endif /* __TMQH_PACKETPOOL_H__ */
index 6008ac28e207a44ce502943973e8bf20a172c823..5108935c4b368d942162c67bfdd6b569f9060e3f 100644 (file)
@@ -75,6 +75,13 @@ void TmqhRingBufferRegister (void) {
     }
 }
 
+void TmqhRingBufferDestroy (void) {
+    int i = 0;
+    for (i = 0; i < 256; i++) {
+        RingBuffer8Destroy(ringbuffers[i]);
+    }
+}
+
 void TmqhInputRingBufferShutdownHandler(ThreadVars *tv) {
     if (tv == NULL || tv->inq == NULL) {
         return;
index 039f17fa9cd46b84535e143e93c44f3f9725d22e..f38fce99713280c021d34d9621b4d5edfb76eea0 100644 (file)
@@ -25,5 +25,6 @@
 #define __TMQH_RINGBUFFER_H__
 
 void TmqhRingBufferRegister (void);
+void TmqhRingBufferDestroy (void);
 
 #endif /* __TMQH_RINGBUFFER_H__ */