diff --git a/kernel/ps4_event_flag.pas b/kernel/ps4_event_flag.pas index dbefa50..d10aa9a 100644 --- a/kernel/ps4_event_flag.pas +++ b/kernel/ps4_event_flag.pas @@ -333,21 +333,23 @@ begin Result:=0; repeat - if (node.ret<>1) then //is signaled - begin - if (pResultPat<>nil) then - begin - pResultPat^:=node.ResultPat; - end; - Result:=node.ret; - Break; - end else - if (Result=EINTR) then - begin - Break; - end; - spin_lock(ef^.lock_list); + if (node.ret<>1) then //is signaled + begin + if (pResultPat<>nil) then + begin + pResultPat^:=node.ResultPat; + end; + Result:=node.ret; + spin_unlock(ef^.lock_list); + Break; + end else + if (Result=EINTR) then + begin + spin_unlock(ef^.lock_list); + Break; + end; + if _test_and_set(ef,bitPattern,waitMode,pResultPat) then begin store_seq_cst(node.ret,0); diff --git a/kernel/ps4_sema.pas b/kernel/ps4_sema.pas index 510886e..9f98f9d 100644 --- a/kernel/ps4_sema.pas +++ b/kernel/ps4_sema.pas @@ -418,17 +418,19 @@ begin repeat - if (node.ret<>1) then //is signaled - begin - Result:=node.ret; - Break; - end else - if (Result=EINTR) then - begin - Break; - end; - spin_lock(sv^.vlock); + if (node.ret<>1) then //is signaled + begin + Result:=node.ret; + spin_unlock(sv^.vlock); + Break; + end else + if (Result=EINTR) then + begin + spin_unlock(sv^.vlock); + Break; + end; + if (sv^.value>=count) then begin Dec(sv^.value,count);