diff options
author | Keith Bostic <keith@wiredtiger.com> | 2013-01-16 20:42:11 +0000 |
---|---|---|
committer | Keith Bostic <keith@wiredtiger.com> | 2013-01-16 20:42:11 +0000 |
commit | 9b42e6716f801fd4ae7fbe513c27c99f41f4fddd (patch) | |
tree | dcd4e8d03bdda1c3dc0a5eb7fbda24cdb9762814 /dist/serial.py | |
parent | 49cff18be23f7e375386775df210766bc23135ef (diff) | |
download | mongo-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.py | 22 |
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') |