Skip to content

Commit 05f823c

Browse files
authored
Merge branch 'main' into codex/rename-function-parameters-in-pg_os-1.0.sql
2 parents 2e5af50 + 04a4769 commit 05f823c

5 files changed

Lines changed: 98 additions & 6 deletions

File tree

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
EXTENSION = pg_os
22
DATA = pg_os--1.0.sql
33
PG_CONFIG ?= pg_config
4-
REGRESS = pg_os_basic create_user lock_file create_process allocate_memory load_unload_module modules check_permission
4+
REGRESS = pg_os_basic create_user lock_file create_process allocate_memory load_unload_module modules check_permission free_all_memory_for_process
55
REGRESS_OPTS = --outputdir=/tmp/pg_os_regress
66
PGXS := $(shell $(PG_CONFIG) --pgxs)
77
include $(PGXS)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
-- test for free_all_memory_for_process
2+
\set ECHO none
3+
SELECT free_all_memory_for_process(1);
4+
free_all_memory_for_process
5+
-----------------------------
6+
7+
(1 row)
8+
9+
SELECT id, allocated, allocated_to FROM memory_segments ORDER BY id;
10+
id | allocated | allocated_to
11+
----+-----------+--------------
12+
1 | f |
13+
2 | f |
14+
3 | t | 2
15+
(3 rows)
16+
17+
SELECT process_id, segment_id FROM process_memory ORDER BY process_id, segment_id;
18+
process_id | segment_id
19+
------------+------------
20+
2 | 3
21+
(1 row)
22+

pg_os--1.0.sql

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -601,7 +601,7 @@ CREATE OR REPLACE FUNCTION handle_signals(user_id INTEGER, process_id INTEGER) R
601601
DECLARE
602602
sig RECORD;
603603
BEGIN
604-
FOR sig IN SELECT * FROM signals WHERE process_id = process_id LOOP
604+
FOR sig IN SELECT * FROM signals WHERE process_id = handle_signals.process_id LOOP
605605
IF sig.signal_type = 'SIGTERM' THEN
606606
PERFORM terminate_process(user_id, process_id);
607607
ELSIF sig.signal_type = 'SIGSTOP' THEN
@@ -1121,9 +1121,18 @@ CREATE OR REPLACE FUNCTION free_all_memory_for_process(process_id INTEGER) RETUR
11211121
DECLARE
11221122
seg_id INTEGER;
11231123
BEGIN
1124-
FOR seg_id IN SELECT segment_id FROM process_memory WHERE process_id = process_id LOOP
1125-
UPDATE memory_segments SET allocated = FALSE, allocated_to = NULL WHERE id = seg_id;
1126-
DELETE FROM process_memory WHERE process_id = process_id AND segment_id = seg_id;
1124+
FOR seg_id IN
1125+
SELECT segment_id
1126+
FROM process_memory
1127+
WHERE process_memory.process_id = free_all_memory_for_process.process_id
1128+
LOOP
1129+
UPDATE memory_segments
1130+
SET allocated = FALSE,
1131+
allocated_to = NULL
1132+
WHERE id = seg_id;
1133+
DELETE FROM process_memory
1134+
WHERE process_memory.process_id = free_all_memory_for_process.process_id
1135+
AND segment_id = seg_id;
11271136
END LOOP;
11281137
END;
11291138
$$ LANGUAGE plpgsql;

signals.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ CREATE OR REPLACE FUNCTION handle_signals(user_id INTEGER, process_id INTEGER) R
2626
DECLARE
2727
sig RECORD;
2828
BEGIN
29-
FOR sig IN SELECT * FROM signals WHERE process_id = process_id LOOP
29+
FOR sig IN SELECT * FROM signals WHERE process_id = handle_signals.process_id LOOP
3030
IF sig.signal_type = 'SIGTERM' THEN
3131
PERFORM terminate_process(user_id, process_id);
3232
ELSIF sig.signal_type = 'SIGSTOP' THEN
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
-- test for free_all_memory_for_process
2+
\set ECHO none
3+
SET client_min_messages TO warning;
4+
5+
-- minimal tables
6+
DROP TABLE IF EXISTS memory_segments CASCADE;
7+
DROP TABLE IF EXISTS process_memory CASCADE;
8+
CREATE TABLE memory_segments (
9+
id SERIAL PRIMARY KEY,
10+
size INTEGER NOT NULL,
11+
allocated BOOLEAN DEFAULT FALSE,
12+
allocated_to INTEGER
13+
);
14+
15+
CREATE TABLE process_memory (
16+
process_id INTEGER,
17+
segment_id INTEGER,
18+
PRIMARY KEY (process_id, segment_id)
19+
);
20+
21+
-- function under test
22+
CREATE OR REPLACE FUNCTION free_all_memory_for_process(process_id INTEGER) RETURNS VOID AS $$
23+
DECLARE
24+
seg_id INTEGER;
25+
BEGIN
26+
FOR seg_id IN
27+
SELECT segment_id
28+
FROM process_memory
29+
WHERE process_memory.process_id = free_all_memory_for_process.process_id
30+
LOOP
31+
UPDATE memory_segments
32+
SET allocated = FALSE,
33+
allocated_to = NULL
34+
WHERE id = seg_id;
35+
DELETE FROM process_memory
36+
WHERE process_memory.process_id = free_all_memory_for_process.process_id
37+
AND segment_id = seg_id;
38+
END LOOP;
39+
END;
40+
$$ LANGUAGE plpgsql;
41+
42+
-- allocate memory to processes 1 and 2
43+
INSERT INTO memory_segments(size, allocated, allocated_to) VALUES
44+
(100, TRUE, 1),
45+
(100, TRUE, 1),
46+
(100, TRUE, 2);
47+
48+
INSERT INTO process_memory(process_id, segment_id) VALUES
49+
(1, 1),
50+
(1, 2),
51+
(2, 3);
52+
53+
\set ECHO queries
54+
\set VERBOSITY terse
55+
56+
-- free all memory for process 1
57+
SELECT free_all_memory_for_process(1);
58+
59+
-- inspect results
60+
SELECT id, allocated, allocated_to FROM memory_segments ORDER BY id;
61+
SELECT process_id, segment_id FROM process_memory ORDER BY process_id, segment_id;

0 commit comments

Comments
 (0)