blob: 3a3e5a55c6319d11a301776ca5adc9a9bf832049 [file] [log] [blame]
from . import CWrapPlugin
from string import Template
class GILRelease(CWrapPlugin):
OPTION_START = [
'PyThreadState *_save = NULL;',
'try {',
]
BEFORE_CALL = 'Py_UNBLOCK_THREADS;'
AFTER_CALL = 'Py_BLOCK_THREADS;'
OPTION_END = [
'} catch (...) {',
'if (_save) {',
'Py_BLOCK_THREADS;',
'}',
'throw;',
'}',
]
def process_option_code_template(self, template, option):
if option.get('with_gil', False):
return template
call_idx = template.index('$call')
template.insert(call_idx, self.BEFORE_CALL)
template.insert(call_idx + 2, self.AFTER_CALL)
return self.OPTION_START + template + self.OPTION_END