Commit 563cb984 authored by Xavier Thompson's avatar Xavier Thompson

Fix cypclass arguments of def methods being unlocked when already unlocked

parent ff2db658
...@@ -3406,7 +3406,7 @@ class DefNode(FuncDefNode): ...@@ -3406,7 +3406,7 @@ class DefNode(FuncDefNode):
if not arg.name: if not arg.name:
error(arg.pos, "Missing argument name") error(arg.pos, "Missing argument name")
if arg.needs_conversion: if arg.needs_conversion:
arg.entry = env.declare_var(arg.name, arg.type, arg.pos) arg.entry = env.declare_var(arg.name, arg.type, arg.pos, is_converted_arg = 1)
if arg.type.is_pyobject: if arg.type.is_pyobject:
arg.entry.init = "0" arg.entry.init = "0"
else: else:
......
...@@ -2052,7 +2052,8 @@ class LocalScope(Scope): ...@@ -2052,7 +2052,8 @@ class LocalScope(Scope):
def declare_var(self, name, type, pos, def declare_var(self, name, type, pos,
cname = None, visibility = 'private', cname = None, visibility = 'private',
api = 0, in_pxd = 0, is_cdef = 0): api = 0, in_pxd = 0, is_cdef = 0,
is_converted_arg = 0):
name = self.mangle_class_private_name(name) name = self.mangle_class_private_name(name)
# Add an entry for a local variable. # Add an entry for a local variable.
if visibility in ('public', 'readonly'): if visibility in ('public', 'readonly'):
...@@ -2066,6 +2067,13 @@ class LocalScope(Scope): ...@@ -2066,6 +2067,13 @@ class LocalScope(Scope):
entry.in_with_gil_block = self._in_with_gil_block entry.in_with_gil_block = self._in_with_gil_block
self.var_entries.append(entry) self.var_entries.append(entry)
# arguments converted as variables should still be locked as arguments
if is_converted_arg and type.is_cyp_class and type.lock_mode != "nolock":
arg_lock_state = self.declare_tracked(entry)
arg_lock_state.is_rlocked = type.is_const
arg_lock_state.is_wlocked = not type.is_const
return entry return entry
def declare_global(self, name, pos): def declare_global(self, name, pos):
......
...@@ -367,6 +367,10 @@ void RecursiveUpgradeableRWLock::unlock() { ...@@ -367,6 +367,10 @@ void RecursiveUpgradeableRWLock::unlock() {
else if (has_write_lock) { else if (has_write_lock) {
--my_counts.write_count; --my_counts.write_count;
} }
else {
fprintf(stderr, "ERROR: trying to unlock already unlocked CyObject !\n");
return;
}
if (!my_counts.write_count && !my_counts.read_count) { if (!my_counts.write_count && !my_counts.read_count) {
pthread_rwlock_unlock(&this->rw_lock); pthread_rwlock_unlock(&this->rw_lock);
my_counts.thread_id = 0; my_counts.thread_id = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment