Skip to content

Commit 926eaaa

Browse files
authored
Merge pull request #65 from seanwevans/codex/update-lock_mutex-logic-in-pg_os-1.0.sql
Ensure mutex acquisition checks update result
2 parents 5a686fe + 53c8cba commit 926eaaa

2 files changed

Lines changed: 22 additions & 12 deletions

File tree

locks.sql

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,23 @@ CREATE OR REPLACE FUNCTION lock_mutex(thread_id INTEGER, mutex_name TEXT) RETURN
3434
DECLARE
3535
m RECORD;
3636
BEGIN
37-
SELECT * INTO m FROM mutexes WHERE name = mutex_name;
37+
SELECT * INTO m FROM mutexes WHERE name = mutex_name FOR UPDATE;
3838
IF NOT FOUND THEN
3939
RAISE EXCEPTION 'Mutex % not found', mutex_name;
4040
END IF;
4141

4242
IF m.locked_by_thread IS NULL THEN
43-
UPDATE mutexes SET locked_by_thread = thread_id WHERE id = m.id;
44-
UPDATE threads SET waiting_on_mutex = NULL WHERE id = thread_id;
45-
ELSE
46-
-- Thread must wait
47-
UPDATE threads SET state = 'waiting', waiting_on_mutex = mutex_name, updated_at = now() WHERE id = thread_id;
43+
UPDATE mutexes
44+
SET locked_by_thread = thread_id
45+
WHERE id = m.id AND locked_by_thread IS NULL;
46+
IF FOUND THEN
47+
UPDATE threads SET waiting_on_mutex = NULL WHERE id = thread_id;
48+
RETURN;
49+
END IF;
4850
END IF;
51+
52+
-- Thread must wait
53+
UPDATE threads SET state = 'waiting', waiting_on_mutex = mutex_name, updated_at = now() WHERE id = thread_id;
4954
END;
5055
$$ LANGUAGE plpgsql SECURITY DEFINER SET search_path = pg_catalog, pg_temp;
5156
ALTER FUNCTION lock_mutex(INTEGER, TEXT) OWNER TO pg_os_admin;

pg_os--1.0.sql

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -480,18 +480,23 @@ CREATE OR REPLACE FUNCTION lock_mutex(thread_id INTEGER, mutex_name TEXT) RETURN
480480
DECLARE
481481
m RECORD;
482482
BEGIN
483-
SELECT * INTO m FROM mutexes WHERE name = mutex_name;
483+
SELECT * INTO m FROM mutexes WHERE name = mutex_name FOR UPDATE;
484484
IF NOT FOUND THEN
485485
RAISE EXCEPTION 'Mutex % not found', mutex_name;
486486
END IF;
487487

488488
IF m.locked_by_thread IS NULL THEN
489-
UPDATE mutexes SET locked_by_thread = thread_id WHERE id = m.id;
490-
UPDATE threads SET waiting_on_mutex = NULL WHERE id = thread_id;
491-
ELSE
492-
-- Thread must wait
493-
UPDATE threads SET state = 'waiting', waiting_on_mutex = mutex_name, updated_at = now() WHERE id = thread_id;
489+
UPDATE mutexes
490+
SET locked_by_thread = thread_id
491+
WHERE id = m.id AND locked_by_thread IS NULL;
492+
IF FOUND THEN
493+
UPDATE threads SET waiting_on_mutex = NULL WHERE id = thread_id;
494+
RETURN;
495+
END IF;
494496
END IF;
497+
498+
-- Thread must wait
499+
UPDATE threads SET state = 'waiting', waiting_on_mutex = mutex_name, updated_at = now() WHERE id = thread_id;
495500
END;
496501
$$ LANGUAGE plpgsql SECURITY DEFINER SET search_path = pg_catalog, pg_temp;
497502
ALTER FUNCTION lock_mutex(INTEGER, TEXT) OWNER TO pg_os_admin;

0 commit comments

Comments
 (0)