summaryrefslogtreecommitdiff
path: root/dist/serial.py
diff options
context:
space:
mode:
authorKeith Bostic <keith@wiredtiger.com>2013-01-16 20:42:11 +0000
committerKeith Bostic <keith@wiredtiger.com>2013-01-16 20:42:11 +0000
commit9b42e6716f801fd4ae7fbe513c27c99f41f4fddd (patch)
treedcd4e8d03bdda1c3dc0a5eb7fbda24cdb9762814 /dist/serial.py
parent49cff18be23f7e375386775df210766bc23135ef (diff)
downloadmongo-9b42e6716f801fd4ae7fbe513c27c99f41f4fddd.tar.gz
Increment the page's memory before releasing the serialization mutex,
regardless, don't free the memory until after the release. Ref #393.
Diffstat (limited to 'dist/serial.py')
-rw-r--r--dist/serial.py22
1 files changed, 17 insertions, 5 deletions
diff --git a/dist/serial.py b/dist/serial.py
index 1dc257c41b5..89bfcc4b7fe 100644
--- a/dist/serial.py
+++ b/dist/serial.py
@@ -86,7 +86,6 @@ typedef struct {
f.write('\tint ' + l.name + '_taken;\n')
f.write('} __wt_' + entry.name + '_args;\n\n')
- # pack function
f.write('static inline int\n__wt_' + entry.name + '_serial(\n')
o = 'WT_SESSION_IMPL *session'
for l in entry.args:
@@ -118,9 +117,11 @@ typedef struct {
f.write('\targs->' + l.name + ' = ' + l.name + ';\n\n')
f.write('\t__wt_spin_lock(session, &S2C(session)->serial_lock);\n')
f.write('\tret = __wt_' + entry.name + '_serial_func(session, args);\n')
- f.write('\t__wt_spin_unlock(session, &S2C(session)->serial_lock);\n\n')
if sizes:
+ f.write('''
+\t/* Increment in-memory footprint before decrement is possible. */
+''')
f.write('\tincr_mem = 0;\n')
for l in entry.args:
if not l.sized:
@@ -129,13 +130,24 @@ typedef struct {
f.write('\t\tWT_ASSERT(session, ' +
l.name + '_size != 0);\n')
f.write('\t\tincr_mem += ' + l.name + '_size;\n')
- f.write('\t} else\n')
- f.write(
- '\t\t__wt_free(session, args->' + l.name + ');\n')
+ f.write('\t}\n')
f.write('''\tif (incr_mem != 0)
\t\t__wt_cache_page_inmem_incr(session, page, incr_mem);
''')
+ f.write('\t__wt_spin_unlock(session, &S2C(session)->serial_lock);\n')
+
+ if sizes:
+ f.write('''
+\t/* Free any unused memory after releasing serialization mutex. */
+''')
+ for l in entry.args:
+ if not l.sized:
+ continue
+ f.write('\tif (!args->' + l.name + '_taken)\n')
+ f.write(
+ '\t\t__wt_free(session, args->' + l.name + ');\n')
+ f.write('\n')
f.write('\treturn (ret);\n')
f.write('}\n\n')