Skip to content

Commit 82ce758

Browse files
author
Martin Belanger
committed
libnvme: rename !accessors: member annotation to !access:
Rename the member-level annotation prefix from !accessors: to !access: to decouple it from the !generate-accessors struct-level annotation. Until now, the !accessors:<value> member annotation was consumed only by the accessor generator, and its name reflected that — it read as a natural companion to the struct-level !generate-accessors annotation. That one-to-one relationship is about to change. An upcoming !generate-python struct-level annotation will also need to read the same member annotations, both to drive the generated SWIG layer and to validate consistency between the C and Python sides. The annotation is no longer the private concern of the accessor generator. Keeping the name !accessors: would make that relationship confusing: - The visual similarity to !generate-accessors suggests the member annotation is owned by accessor generation, when in fact multiple generators will consume it. - Readers (and future contributors adding more generators) would reasonably — but wrongly — assume the annotation is accessor specific and only relevant when !generate-accessors is set. Renaming to !access: breaks that false association. The new name also reads more naturally as English: char *name; // !access:readonly char *addr; // !access:none vs. char *name; // !accessors:readonly char *addr; // !accessors:none This patch is a pure rename with no behavioural change: - generate-accessors.py: update has_annotation() lookups and the docstring examples - private.h: rename all 47 member annotations - generate-accessors.md: update every example, table row and note; re-pad the affected table rows to preserve column alignment Generator output (accessors.h / accessors.c / accessors.ld) is byte identical before and after this commit. Signed-off-by: Martin Belanger <Martin.Belanger@dell.com> Assisted-by: Claude Opus 4.7 <noreply@anthropic.com>
1 parent d801e1e commit 82ce758

3 files changed

Lines changed: 78 additions & 78 deletions

File tree

libnvme/src/nvme/private.h

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -202,20 +202,20 @@ struct libnvme_path { // !generate-accessors
202202

203203
struct libnvme_stat stat[2]; /* gendisk I/O stat */
204204
unsigned int curr_idx; /* current index into the stat[] */
205-
bool diffstat; // !accessors:none
205+
bool diffstat; // !access:none
206206

207207
struct libnvme_ctrl *c;
208208
struct libnvme_ns *n;
209209

210210
char *name;
211211
char *sysfs_dir;
212-
char *ana_state; // !accessors:none
213-
char *numa_nodes; // !accessors:none
212+
char *ana_state; // !access:none
213+
char *numa_nodes; // !access:none
214214
int grpid;
215-
int queue_depth; // !accessors:none
216-
long multipath_failover_count; // !accessors:none
217-
long command_retry_count; // !accessors:none
218-
long command_error_count; // !accessors:none
215+
int queue_depth; // !access:none
216+
long multipath_failover_count; // !access:none
217+
long command_retry_count; // !access:none
218+
long command_error_count; // !access:none
219219
};
220220

221221
struct libnvme_ns_head {
@@ -236,12 +236,12 @@ struct libnvme_ns { // !generate-accessors
236236

237237
struct libnvme_stat stat[2]; /* gendisk I/O stat */
238238
unsigned int curr_idx; /* current index into the stat[] */
239-
bool diffstat; // !accessors:none
239+
bool diffstat; // !access:none
240240

241241
struct libnvme_transport_handle *hdl;
242242
__u32 nsid;
243243
char *name;
244-
char *generic_name; // !accessors:none
244+
char *generic_name; // !access:none
245245
char *sysfs_dir;
246246

247247
int lba_shift;
@@ -255,10 +255,10 @@ struct libnvme_ns { // !generate-accessors
255255
unsigned char uuid[NVME_UUID_LEN];
256256
enum nvme_csi csi;
257257

258-
long command_retry_count; // !accessors:none
259-
long command_error_count; // !accessors:none
260-
long requeue_no_usable_path_count; // !accessors:none
261-
long fail_no_available_path_count; // !accessors:none
258+
long command_retry_count; // !access:none
259+
long command_error_count; // !access:none
260+
long requeue_no_usable_path_count; // !access:none
261+
long fail_no_available_path_count; // !access:none
262262
};
263263

264264
struct libnvme_ctrl { // !generate-accessors
@@ -269,38 +269,38 @@ struct libnvme_ctrl { // !generate-accessors
269269

270270
struct libnvme_global_ctx *ctx;
271271
struct libnvme_transport_handle *hdl;
272-
char *name; // !accessors:readonly
273-
char *sysfs_dir; // !accessors:readonly
274-
char *address; // !accessors:none
275-
char *firmware; // !accessors:readonly
276-
char *model; // !accessors:readonly
277-
char *state; // !accessors:none
278-
char *numa_node; // !accessors:readonly
279-
char *queue_count; // !accessors:readonly
280-
char *serial; // !accessors:readonly
281-
char *sqsize; // !accessors:readonly
282-
char *transport; // !accessors:readonly
283-
char *subsysnqn; // !accessors:readonly
284-
char *traddr; // !accessors:readonly
285-
char *trsvcid; // !accessors:readonly
272+
char *name; // !access:readonly
273+
char *sysfs_dir; // !access:readonly
274+
char *address; // !access:none
275+
char *firmware; // !access:readonly
276+
char *model; // !access:readonly
277+
char *state; // !access:none
278+
char *numa_node; // !access:readonly
279+
char *queue_count; // !access:readonly
280+
char *serial; // !access:readonly
281+
char *sqsize; // !access:readonly
282+
char *transport; // !access:readonly
283+
char *subsysnqn; // !access:readonly
284+
char *traddr; // !access:readonly
285+
char *trsvcid; // !access:readonly
286286
char *dhchap_host_key;
287287
char *dhchap_ctrl_key;
288288
char *keyring;
289289
char *tls_key_identity;
290290
char *tls_key;
291-
char *cntrltype; // !accessors:readonly
292-
char *cntlid; // !accessors:readonly
293-
char *dctype; // !accessors:readonly
294-
char *phy_slot; // !accessors:readonly
295-
char *host_traddr; // !accessors:readonly
296-
char *host_iface; // !accessors:readonly
291+
char *cntrltype; // !access:readonly
292+
char *cntlid; // !access:readonly
293+
char *dctype; // !access:readonly
294+
char *phy_slot; // !access:readonly
295+
char *host_traddr; // !access:readonly
296+
char *host_iface; // !access:readonly
297297
bool discovery_ctrl;
298298
bool unique_discovery_ctrl;
299299
bool discovered;
300300
bool persistent;
301-
long command_error_count; // !accessors:none
302-
long reset_count; // !accessors:none
303-
long reconnect_count; // !accessors:none
301+
long command_error_count; // !access:none
302+
long reset_count; // !access:none
303+
long reconnect_count; // !access:none
304304
struct libnvme_fabrics_config cfg;
305305
};
306306

@@ -310,27 +310,27 @@ struct libnvme_subsystem { // !generate-accessors
310310
struct list_head namespaces;
311311
struct libnvme_host *h;
312312

313-
char *name; // !accessors:readonly
314-
char *sysfs_dir; // !accessors:readonly
315-
char *subsysnqn; // !accessors:readonly
316-
char *model; // !accessors:readonly
317-
char *serial; // !accessors:readonly
318-
char *firmware; // !accessors:readonly
319-
char *subsystype; // !accessors:readonly
313+
char *name; // !access:readonly
314+
char *sysfs_dir; // !access:readonly
315+
char *subsysnqn; // !access:readonly
316+
char *model; // !access:readonly
317+
char *serial; // !access:readonly
318+
char *firmware; // !access:readonly
319+
char *subsystype; // !access:readonly
320320
char *application;
321-
char *iopolicy; // !accessors:none
321+
char *iopolicy; // !access:none
322322
};
323323

324324
struct libnvme_host { // !generate-accessors
325325
struct list_node entry;
326326
struct list_head subsystems;
327327
struct libnvme_global_ctx *ctx;
328328

329-
char *hostnqn; // !accessors:readonly
330-
char *hostid; // !accessors:readonly
329+
char *hostnqn; // !access:readonly
330+
char *hostid; // !access:readonly
331331
char *dhchap_host_key;
332332
char *hostsymname;
333-
bool pdc_enabled; // !accessors:none
333+
bool pdc_enabled; // !access:none
334334
bool pdc_enabled_valid; /* set if pdc_enabled doesn't have an undefined
335335
* value */
336336
};

libnvme/tools/generator/generate-accessors.md

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ Place the annotation on a member's declaration line to suppress accessor generat
5959
```c
6060
struct nvme_ctrl { // !generate-accessors
6161
char *name;
62-
char *state; // !accessors:none
63-
char *subsysnqn; // !accessors:none
62+
char *state; // !access:none
63+
char *subsysnqn; // !access:none
6464
};
6565
```
6666

@@ -71,8 +71,8 @@ Place the annotation on a member's declaration line to generate only a getter (n
7171
```c
7272
struct nvme_ctrl { // !generate-accessors
7373
char *name;
74-
char *firmware; // !accessors:readonly
75-
char *model; // !accessors:readonly
74+
char *firmware; // !access:readonly
75+
char *model; // !access:readonly
7676
};
7777
```
7878

@@ -85,7 +85,7 @@ Place the annotation on a member's declaration line to generate only a setter (n
8585
```c
8686
struct nvme_ctrl { // !generate-accessors:readonly
8787
char *name; /* getter only (struct default) */
88-
char *token; // !accessors:writeonly /* setter only override */
88+
char *token; // !access:writeonly /* setter only override */
8989
};
9090
```
9191

@@ -96,8 +96,8 @@ Place the annotation on a member's declaration line to generate both a getter an
9696
```c
9797
struct nvme_ctrl { // !generate-accessors:none
9898
char *name; /* no accessors (struct default) */
99-
char *model; // !accessors:readwrite /* both getter and setter */
100-
char *firmware; // !accessors:readonly /* getter only */
99+
char *model; // !access:readwrite /* both getter and setter */
100+
char *firmware; // !access:readonly /* getter only */
101101
};
102102
```
103103

@@ -140,7 +140,7 @@ struct nvme_ctrl { // !generate-lifecycle
140140
};
141141
```
142142

143-
This annotation has no effect on accessor generation. Combine with `// !accessors:none` if both should be suppressed.
143+
This annotation has no effect on accessor generation. Combine with `// !access:none` if both should be suppressed.
144144

145145
### Member defaults — `default:VALUE`
146146

@@ -168,10 +168,10 @@ The value is emitted verbatim, so any valid C expression — integer literals, m
168168
| `// !generate-accessors:readonly` | struct brace | Include struct, default: getter only |
169169
| `// !generate-accessors:writeonly` | struct brace | Include struct, default: setter only |
170170
| `// !generate-lifecycle` | struct brace | Generate constructor + destructor |
171-
| `// !accessors:none` | member line | Skip this member entirely (accessors only) |
172-
| `// !accessors:readonly` | member line | Generate getter only |
173-
| `// !accessors:writeonly` | member line | Generate setter only |
174-
| `// !accessors:readwrite` | member line | Generate getter and setter |
171+
| `// !access:none` | member line | Skip this member entirely (accessors only) |
172+
| `// !access:readonly` | member line | Generate getter only |
173+
| `// !access:writeonly` | member line | Generate setter only |
174+
| `// !access:readwrite` | member line | Generate getter and setter |
175175
| `// !lifecycle:none` | member line | Exclude member from destructor free logic |
176176
| `// !default:VALUE` | member line | Set field to VALUE in `init_defaults()` |
177177
| `const` qualifier on member | member type | Suppress setter; suppress free in destructor |
@@ -187,8 +187,8 @@ struct person { // !generate-accessors
187187
char *name;
188188
int age;
189189
const char *id; /* const → getter only, no annotation needed */
190-
char *secret; // !accessors:none
191-
char *role; // !accessors:readonly
190+
char *secret; // !access:none
191+
char *role; // !access:readonly
192192
};
193193

194194
struct car { // !generate-accessors
@@ -319,7 +319,7 @@ const char *car_get_vin(const struct car *p);
319319
#endif /* _ACCESSORS_H_ */
320320
```
321321

322-
> **Note:** The `secret` member is absent because of `// !accessors:none` — excluded members leave no trace in the output. The `role` member has only a getter because of `// !accessors:readonly`. The `id` and `vin` members have only getters because they are declared `const`.
322+
> **Note:** The `secret` member is absent because of `// !access:none` — excluded members leave no trace in the output. The `role` member has only a getter because of `// !access:readonly`. The `id` and `vin` members have only getters because they are declared `const`.
323323
324324
### Generated `accessors.c`
325325

@@ -422,7 +422,7 @@ LIBNVME_ACCESSORS_3 {
422422
};
423423
```
424424
425-
> **Note:** Only symbols for members that have accessors generated appear in the linker script. The `secret` member (excluded via `// !accessors:none`) and the write-only `token` example would have no getter entry. The version node name `LIBNVME_ACCESSORS_3` is hardcoded in the generator.
425+
> **Note:** Only symbols for members that have accessors generated appear in the linker script. The `secret` member (excluded via `// !access:none`) and the write-only `token` example would have no getter entry. The version node name `LIBNVME_ACCESSORS_3` is hardcoded in the generator.
426426
427427
------
428428
@@ -437,8 +437,8 @@ struct person { // !generate-accessors !generate-lifecycle
437437
char *name;
438438
int age;
439439
const char *id; /* const → getter only; NOT freed by destructor */
440-
char *secret; // !accessors:none
441-
char *role; // !accessors:readonly
440+
char *secret; // !access:none
441+
char *role; // !access:readonly
442442
};
443443
```
444444

@@ -491,7 +491,7 @@ __public void person_free(struct person *p)
491491

492492
> **Notes:**
493493
> - `id` is `const char *` — the destructor never frees `const` members.
494-
> - `secret` is `// !accessors:none` but is still freed — `lifecycle:none` is the annotation to suppress a free.
494+
> - `secret` is `// !access:none` but is still freed — `lifecycle:none` is the annotation to suppress a free.
495495
> - `age` is `int` — only `char *` and `char **` members are freed.
496496
497497
### Additional entries in `accessors.ld`
@@ -611,10 +611,10 @@ __public void conn_opts_free(struct conn_opts *p)
611611
2. **String arrays** (`char **`) — setters deep-copy NULL-terminated arrays (each element and the container).
612612
3. **Fixed char arrays** (`char foo[N]`) — setters use `snprintf`, always NUL-terminated.
613613
4. **`const` members** — only a getter is generated, no setter (applies regardless of any annotation). `const char *` members are also skipped by the destructor.
614-
5. **`// !accessors:readonly`** — same effect as `const`: getter only.
615-
6. **`// !accessors:writeonly`** — setter only; getter is suppressed.
616-
7. **`// !accessors:readwrite`** — both getter and setter; overrides a restrictive struct-level default.
617-
8. **`// !accessors:none`** — member is completely ignored by the accessor generator. The destructor still frees it unless `// !lifecycle:none` is also present.
614+
5. **`// !access:readonly`** — same effect as `const`: getter only.
615+
6. **`// !access:writeonly`** — setter only; getter is suppressed.
616+
7. **`// !access:readwrite`** — both getter and setter; overrides a restrictive struct-level default.
617+
8. **`// !access:none`** — member is completely ignored by the accessor generator. The destructor still frees it unless `// !lifecycle:none` is also present.
618618
9. **Struct-level mode** — the qualifier on `generate-accessors` sets the default for every member in the struct; per-member annotations override the struct default.
619619
10. **`// !generate-lifecycle`** — generates `foo_new()` (constructor) and `foo_free()` (destructor). Can appear on the same line as `generate-accessors`. A struct needs only one of the two annotations.
620620
11. **`// !lifecycle:none`** — excludes a member from the destructor's free logic. Use this when the struct does not own the pointed-to memory.

libnvme/tools/generator/generate-accessors.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,20 +55,20 @@
5555
strdup) since they are assumed to point to externally owned storage.
5656
5757
Member exclusion — annotate the member declaration line:
58-
char *model; // !accessors:none
58+
char *model; // !access:none
5959
6060
Read-only members (getter only, setter suppressed):
6161
- Members declared with the 'const' qualifier, or
6262
- Annotate the member declaration line:
63-
char *state; // !accessors:readonly
63+
char *state; // !access:readonly
6464
6565
Write-only members (setter only, getter suppressed):
6666
- Annotate the member declaration line:
67-
char *state; // !accessors:writeonly
67+
char *state; // !access:writeonly
6868
6969
Both getter and setter (override a restrictive struct-level default):
7070
- Annotate the member declaration line:
71-
char *state; // !accessors:readwrite
71+
char *state; // !access:readwrite
7272
7373
Example usage:
7474
./generate-accessors.py private.h
@@ -301,14 +301,14 @@ def parse_members(struct_name, raw_body, struct_mode, verbose):
301301
# ----------------------------------------------------------------
302302
# Annotation checks on the raw line — BEFORE stripping comments.
303303
# ----------------------------------------------------------------
304-
if has_annotation(raw_line, 'accessors:none'):
304+
if has_annotation(raw_line, 'access:none'):
305305
continue
306306

307-
if has_annotation(raw_line, 'accessors:readwrite'):
307+
if has_annotation(raw_line, 'access:readwrite'):
308308
member_mode = 'both'
309-
elif has_annotation(raw_line, 'accessors:readonly'):
309+
elif has_annotation(raw_line, 'access:readonly'):
310310
member_mode = 'readonly'
311-
elif has_annotation(raw_line, 'accessors:writeonly'):
311+
elif has_annotation(raw_line, 'access:writeonly'):
312312
member_mode = 'writeonly'
313313
else:
314314
member_mode = struct_mode

0 commit comments

Comments
 (0)