-
-
Notifications
You must be signed in to change notification settings - Fork 2
Fix non-recursive mutex issue on Linux #11
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -169,7 +169,13 @@ typedef pthread_t irl_thread_t; | |
|
|
||
| static inline int irl_mutex_init(irl_mutex_t *m) | ||
| { | ||
| return pthread_mutex_init(m, NULL); | ||
| pthread_mutexattr_t attr; | ||
| if (pthread_mutexattr_init(&attr) != 0) | ||
| return pthread_mutex_init(m, NULL); | ||
| pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); | ||
| int ret = pthread_mutex_init(m, &attr); | ||
|
Comment on lines
+173
to
+176
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🩺 Stability & Availability | 🟠 Major | 🏗️ Heavy lift 🧩 Analysis chain🏁 Script executed: #!/bin/sh
set -eu
rg -n -C6 -P '\b(pthread_mutexattr_(init|settype|destroy)|pthread_mutex_init|irl_mutex_init)\s*\(' \
--glob '*.{c,h}' . || trueRepository: irlserver/obs-irl-source Length of output: 4596 🏁 Script executed: #!/bin/sh
set -eu
printf '%s\n' '--- include/irl-threading.h ---'
sed -n '1,210p' include/irl-threading.h
printf '%s\n' '--- all irl_mutex_init call sites and nearby cleanup ---'
rg -n -C8 '\birl_mutex_init\s*\(' --glob '*.{c,h}' .
printf '%s\n' '--- threading and platform definitions ---'
rg -n -C4 'pthread-shim|w32-pthreads|PTHREAD_MUTEX_RECURSIVE|_WIN32|irl-threading\.h|pthread\.h' \
--glob '*.{c,h,cmake,txt,md,yml,yaml}' . || trueRepository: irlserver/obs-irl-source Length of output: 19239 🏁 Script executed: #!/bin/sh
set -eu
printf '%s\n' '--- POSIX helper remainder ---'
sed -n '160,280p' include/irl-threading.h
printf '%s\n' '--- audio buffer initialization and destruction ---'
sed -n '130,230p' src/audio-buffer.c
rg -n -C10 'audio_buffer_(init|destroy)|irl_mutex_destroy\s*\(' \
src include --glob '*.{c,h}'
printf '%s\n' '--- source creation and destruction ---'
rg -n -C18 'irl_source_create|irl_source_destroy|irl_mutex_destroy\s*\(' \
src include --glob '*.{c,h}'
printf '%s\n' '--- repository pthread policy/check ---'
sed -n '85,110p' CLAUDE.md
fd -i 'verify-plugin.sh' .
if fd -i 'verify-plugin.sh' . | grep -q .; then
verify_script="$(fd -i 'verify-plugin.sh' . | head -n1)"
sed -n '1,220p' "$verify_script"
fiRepository: irlserver/obs-irl-source Length of output: 38719 🏁 Script executed: python3 - <<'PY'
from pathlib import Path
import re
threading = Path("include/irl-threading.h").read_text()
source = Path("src/irl-source.c").read_text()
audio = Path("src/audio-buffer.c").read_text()
start = threading.index("static inline int irl_mutex_init(irl_mutex_t *m)")
end = threading.index("\n}\n\nstatic inline void irl_mutex_destroy", start)
init = threading[start:end + 2]
checks = {
"POSIX backend has an attr-init fallback": "return pthread_mutex_init(m, NULL);" in init,
"POSIX backend ignores settype result": bool(
re.search(r"(?m)^\s*pthread_mutexattr_settype\s*\(", init)
),
"POSIX backend initializes with the attribute": "pthread_mutex_init(m, &attr)" in init,
"source creation ignores mutex-init results": bool(
re.search(r"(?m)^\s*irl_mutex_init\([^;]+\);", source)
),
"audio buffer initialization ignores mutex-init result": bool(
re.search(r"(?m)^\s*irl_mutex_init\([^;]+\);", audio)
),
"source destruction always destroys source mutexes": (
"irl_mutex_destroy(&ctx->audio_state_lock);" in source and
"irl_mutex_destroy(&ctx->video_queue_lock);" in source
),
}
for name, result in checks.items():
print(f"{'PASS' if result else 'FAIL'}: {name}")
if not all(checks.values()):
raise SystemExit(1)
PYRepository: irlserver/obs-irl-source Length of output: 467 🏁 Script executed: python3 - <<'PY'
from pathlib import Path
import re
threading = Path("include/irl-threading.h").read_text()
source = Path("src/irl-source.c").read_text()
audio = Path("src/audio-buffer.c").read_text()
definitions = list(re.finditer(
r"static inline int irl_mutex_init\(irl_mutex_t \*m\)\s*\{.*?\n\}",
threading,
re.S,
))
if len(definitions) != 2:
raise SystemExit(f"expected two irl_mutex_init definitions, found {len(definitions)}")
posix_init = definitions[1].group(0)
checks = {
"POSIX backend has an attr-init fallback":
"return pthread_mutex_init(m, NULL);" in posix_init,
"POSIX backend ignores settype result":
bool(re.search(r"(?m)^\s*pthread_mutexattr_settype\s*\(", posix_init)),
"POSIX backend initializes with the attribute":
"pthread_mutex_init(m, &attr)" in posix_init,
"source creation ignores mutex-init results":
bool(re.search(r"(?m)^\s*irl_mutex_init\([^;]+\);", source)),
"audio buffer initialization ignores mutex-init result":
bool(re.search(r"(?m)^\s*irl_mutex_init\([^;]+\);", audio)),
}
for name, result in checks.items():
print(f"{'PASS' if result else 'FAIL'}: {name}")
if not all(checks.values()):
raise SystemExit(1)
PYRepository: irlserver/obs-irl-source Length of output: 411 Preserve recursive mutex initialization. If 🧰 Tools🪛 Clang (14.0.6)[error] 175-175: use of undeclared identifier 'PTHREAD_MUTEX_RECURSIVE'; did you mean 'PTHREAD_MUTEX_RECURSIVE_NP'? (clang-diagnostic-error) 🤖 Prompt for AI Agents |
||
| pthread_mutexattr_destroy(&attr); | ||
| return ret; | ||
| } | ||
|
|
||
| static inline void irl_mutex_destroy(irl_mutex_t *m) | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
Repository: irlserver/obs-irl-source
Length of output: 611
🏁 Script executed:
Repository: irlserver/obs-irl-source
Length of output: 50380
🏁 Script executed:
Repository: irlserver/obs-irl-source
Length of output: 16882
Define the POSIX feature-test macro before including
<pthread.h>.PTHREAD_MUTEX_RECURSIVEis hidden without the required feature-test macro in C11 mode. Add the project-wide definition or use a guarded platform mapping. Do not replace it unconditionally withPTHREAD_MUTEX_RECURSIVE_NP; macOS is also supported.🧰 Tools
🪛 Clang (14.0.6)
[error] 175-175: use of undeclared identifier 'PTHREAD_MUTEX_RECURSIVE'; did you mean 'PTHREAD_MUTEX_RECURSIVE_NP'?
(clang-diagnostic-error)
🤖 Prompt for AI Agents
Source: Linters/SAST tools