]> granicus.if.org Git - python/commitdiff
Issue #19741: fix tracemalloc_log_alloc(), handle _Py_HASHTABLE_SET() failure
authorVictor Stinner <victor.stinner@gmail.com>
Sun, 24 Nov 2013 10:28:20 +0000 (11:28 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Sun, 24 Nov 2013 10:28:20 +0000 (11:28 +0100)
Modules/_tracemalloc.c

index 9dd4b19bccd43158e110cad7a2ce23110bdcd75f..5feb3099d5edca59f8f7e4c8fd6ddec75290f02b 100644 (file)
@@ -447,19 +447,28 @@ tracemalloc_log_alloc(void *ptr, size_t size)
 #endif
 
     traceback = traceback_new();
-    if (traceback == NULL)
+    if (traceback == NULL) {
+        /* Memory allocation failed. The error cannot be reported to the
+           caller, because realloc() may already have shrink the memory block
+           and so removed bytes. */
         return;
+    }
 
     trace.size = size;
     trace.traceback = traceback;
 
     TABLES_LOCK();
-    assert(tracemalloc_traced_memory <= PY_SIZE_MAX - size);
-    tracemalloc_traced_memory += size;
-    if (tracemalloc_traced_memory > tracemalloc_max_traced_memory)
-        tracemalloc_max_traced_memory = tracemalloc_traced_memory;
-
-    _Py_HASHTABLE_SET(tracemalloc_traces, ptr, trace);
+    if (_Py_HASHTABLE_SET(tracemalloc_traces, ptr, trace) == 0) {
+        assert(tracemalloc_traced_memory <= PY_SIZE_MAX - size);
+        tracemalloc_traced_memory += size;
+        if (tracemalloc_traced_memory > tracemalloc_max_traced_memory)
+            tracemalloc_max_traced_memory = tracemalloc_traced_memory;
+    }
+    else {
+        /* Hashtabled failed to add a new entry because of a memory allocation
+           failure. Same than above, the error cannot be reported to the
+           caller. */
+    }
     TABLES_UNLOCK();
 }