|
1 | 1 | #!/usr/bin/perl
|
2 | 2 | #
|
3 |
| -# Generate lwlocknames.h and lwlocknames.c from lwlocknames.txt |
| 3 | +# Generate lwlocknames.h from lwlocklist.h |
4 | 4 | # Copyright (c) 2000-2024, PostgreSQL Global Development Group
|
5 | 5 |
|
6 | 6 | use strict;
|
|
14 | 14 |
|
15 | 15 | GetOptions('outdir:s' => \$output_path);
|
16 | 16 |
|
17 |
| -open my $lwlocknames, '<', $ARGV[0] or die; |
| 17 | +open my $lwlocklist, '<', $ARGV[0] or die; |
18 | 18 | open my $wait_event_names, '<', $ARGV[1] or die;
|
19 | 19 |
|
20 | 20 | # Include PID in suffix in case parallel make runs this multiple times.
|
21 | 21 | my $htmp = "$output_path/lwlocknames.h.tmp$$";
|
22 |
| -my $ctmp = "$output_path/lwlocknames.c.tmp$$"; |
23 | 22 | open my $h, '>', $htmp or die "Could not open $htmp: $!";
|
24 |
| -open my $c, '>', $ctmp or die "Could not open $ctmp: $!"; |
25 | 23 |
|
26 | 24 | my $autogen =
|
27 |
| - "/* autogenerated from src/backend/storage/lmgr/lwlocknames.txt, do not edit */\n"; |
| 25 | + "/* autogenerated from src/include/storage/lwlocklist.h, do not edit */\n"; |
28 | 26 | print $h $autogen;
|
29 | 27 | print $h "/* there is deliberately not an #ifndef LWLOCKNAMES_H here */\n\n";
|
30 |
| -print $c $autogen, "\n"; |
31 | 28 |
|
32 |
| -print $c "const char *const IndividualLWLockNames[] = {"; |
33 | 29 |
|
34 | 30 | #
|
35 | 31 | # First, record the predefined LWLocks listed in wait_event_names.txt. We'll
|
36 |
| -# cross-check those with the ones in lwlocknames.txt. |
| 32 | +# cross-check those with the ones in lwlocklist.h. |
37 | 33 | #
|
38 | 34 | my @wait_event_lwlocks;
|
39 | 35 | my $record_lwlocks = 0;
|
|
61 | 57 |
|
62 | 58 | # Record the LWLock.
|
63 | 59 | (my $waiteventname, my $waitevendocsentence) = split(/\t/, $_);
|
64 |
| - push(@wait_event_lwlocks, $waiteventname . "Lock"); |
| 60 | + push(@wait_event_lwlocks, $waiteventname); |
65 | 61 | }
|
66 | 62 |
|
| 63 | +my $in_comment = 0; |
67 | 64 | my $i = 0;
|
68 |
| -while (<$lwlocknames>) |
| 65 | +while (<$lwlocklist>) |
69 | 66 | {
|
70 | 67 | chomp;
|
71 | 68 |
|
72 |
| - # Skip comments |
73 |
| - next if /^#/; |
| 69 | + # Skip single-line C comments and empty lines |
| 70 | + next if m{^\s*/\*.*\*/$}; |
74 | 71 | next if /^\s*$/;
|
75 | 72 |
|
76 |
| - die "unable to parse lwlocknames.txt" |
77 |
| - unless /^(\w+)\s+(\d+)$/; |
| 73 | + # skip multiline C comments |
| 74 | + if ($in_comment == 1) |
| 75 | + { |
| 76 | + $in_comment = 0 if m{\*/}; |
| 77 | + next; |
| 78 | + } |
| 79 | + elsif (m{^\s*/\*}) |
| 80 | + { |
| 81 | + $in_comment = 1; |
| 82 | + next; |
| 83 | + } |
78 | 84 |
|
79 |
| - (my $lockname, my $lockidx) = ($1, $2); |
| 85 | + die "unable to parse lwlocklist.h line \"$_\"" |
| 86 | + unless /^PG_LWLOCK\((\d+),\s+(\w+)\)$/; |
80 | 87 |
|
81 |
| - my $trimmedlockname = $lockname; |
82 |
| - $trimmedlockname =~ s/Lock$//; |
83 |
| - die "lock names must end with 'Lock'" if $trimmedlockname eq $lockname; |
| 88 | + (my $lockidx, my $lockname) = ($1, $2); |
84 | 89 |
|
85 |
| - die "lwlocknames.txt not in order" if $lockidx < $lastlockidx; |
86 |
| - die "lwlocknames.txt has duplicates" if $lockidx == $lastlockidx; |
| 90 | + die "lwlocklist.h not in order" if $lockidx < $lastlockidx; |
| 91 | + die "lwlocklist.h has duplicates" if $lockidx == $lastlockidx; |
87 | 92 |
|
88 |
| - die "$lockname defined in lwlocknames.txt but missing from " |
| 93 | + die "$lockname defined in lwlocklist.h but missing from " |
89 | 94 | . "wait_event_names.txt"
|
90 | 95 | if $i >= scalar @wait_event_lwlocks;
|
91 | 96 | die "lists of predefined LWLocks do not match (first mismatch at "
|
92 | 97 | . "$wait_event_lwlocks[$i] in wait_event_names.txt and $lockname in "
|
93 |
| - . "lwlocknames.txt)" |
| 98 | + . "lwlocklist.h)" |
94 | 99 | if $wait_event_lwlocks[$i] ne $lockname;
|
95 | 100 | $i++;
|
96 | 101 |
|
97 | 102 | while ($lastlockidx < $lockidx - 1)
|
98 | 103 | {
|
99 | 104 | ++$lastlockidx;
|
100 |
| - printf $c "%s \"<unassigned:%d>\"", $continue, $lastlockidx; |
101 | 105 | $continue = ",\n";
|
102 | 106 | }
|
103 |
| - printf $c "%s \"%s\"", $continue, $trimmedlockname; |
104 | 107 | $lastlockidx = $lockidx;
|
105 | 108 | $continue = ",\n";
|
106 | 109 |
|
107 |
| - print $h "#define $lockname (&MainLWLockArray[$lockidx].lock)\n"; |
| 110 | + print $h "#define ${lockname}Lock (&MainLWLockArray[$lockidx].lock)\n"; |
108 | 111 | }
|
109 | 112 |
|
110 | 113 | die
|
111 | 114 | "$wait_event_lwlocks[$i] defined in wait_event_names.txt but missing from "
|
112 |
| - . "lwlocknames.txt" |
| 115 | + . "lwlocklist.h" |
113 | 116 | if $i < scalar @wait_event_lwlocks;
|
114 | 117 |
|
115 |
| -printf $c "\n};\n"; |
116 | 118 | print $h "\n";
|
117 | 119 | printf $h "#define NUM_INDIVIDUAL_LWLOCKS %s\n", $lastlockidx + 1;
|
118 | 120 |
|
119 | 121 | close $h;
|
120 |
| -close $c; |
121 | 122 |
|
122 | 123 | rename($htmp, "$output_path/lwlocknames.h")
|
123 | 124 | || die "rename: $htmp to $output_path/lwlocknames.h: $!";
|
124 |
| -rename($ctmp, "$output_path/lwlocknames.c") || die "rename: $ctmp: $!"; |
125 | 125 |
|
126 |
| -close $lwlocknames; |
| 126 | +close $lwlocklist; |
0 commit comments