@gjsify/sab-native 0.4.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,430 @@
1
+ <?xml version="1.0"?>
2
+ <!-- GjsifySabNative-1.0.gir generated by valac 0.56.19, do not modify. -->
3
+ <repository version="1.2" xmlns="http://www.gtk.org/introspection/core/1.0" xmlns:c="http://www.gtk.org/introspection/c/1.0" xmlns:doc="http://www.gtk.org/introspection/doc/1.0" xmlns:glib="http://www.gtk.org/introspection/glib/1.0">
4
+ <include name="GObject" version="2.0"/>
5
+ <include name="GLib" version="2.0"/>
6
+ <package name="gjsifysabnative"/>
7
+ <c:include name="gjsifysabnative.h"/>
8
+ <c:include name="sab-helpers.h"/>
9
+ <doc:format name="unknown"/>
10
+ <namespace name="GjsifySabNative" version="1.0" shared-library="libgjsifysabnative.so" c:prefix="GjsifySabNative" c:identifier-prefixes="GjsifySabNative" c:symbol-prefixes="gjsify_sab_native">
11
+ <class name="SharedBuffer" c:type="GjsifySabNativeSharedBuffer" c:symbol-prefix="shared_buffer" glib:type-name="GjsifySabNativeSharedBuffer" glib:get-type="gjsify_sab_native_shared_buffer_get_type" glib:type-struct="SharedBufferClass" parent="GObject.Object">
12
+ <field name="parent_instance" readable="0" private="1">
13
+ <type name="GObject.Object" c:type="GObject"/>
14
+ </field>
15
+ <field name="priv" readable="0" private="1">
16
+ <type name="SharedBufferPrivate" c:type="GjsifySabNativeSharedBufferPrivate*"/>
17
+ </field>
18
+ <function name="create" c:identifier="gjsify_sab_native_shared_buffer_create">
19
+ <return-value transfer-ownership="full" nullable="1">
20
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
21
+ </return-value>
22
+ <parameters>
23
+ <parameter name="size" transfer-ownership="none">
24
+ <type name="gulong" c:type="gsize"/>
25
+ </parameter>
26
+ </parameters>
27
+ </function>
28
+ <function name="from_fd" c:identifier="gjsify_sab_native_shared_buffer_from_fd">
29
+ <return-value transfer-ownership="full" nullable="1">
30
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
31
+ </return-value>
32
+ <parameters>
33
+ <parameter name="fd" transfer-ownership="none">
34
+ <type name="gint" c:type="gint"/>
35
+ </parameter>
36
+ <parameter name="size" transfer-ownership="none">
37
+ <type name="gulong" c:type="gsize"/>
38
+ </parameter>
39
+ </parameters>
40
+ </function>
41
+ <method name="get_u8" c:identifier="gjsify_sab_native_shared_buffer_get_u8">
42
+ <return-value transfer-ownership="full">
43
+ <type name="guint8" c:type="guint8"/>
44
+ </return-value>
45
+ <parameters>
46
+ <instance-parameter name="self" transfer-ownership="none">
47
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
48
+ </instance-parameter>
49
+ <parameter name="offset" transfer-ownership="none">
50
+ <type name="gulong" c:type="gsize"/>
51
+ </parameter>
52
+ </parameters>
53
+ </method>
54
+ <method name="set_u8" c:identifier="gjsify_sab_native_shared_buffer_set_u8">
55
+ <return-value transfer-ownership="full">
56
+ <type name="none" c:type="void"/>
57
+ </return-value>
58
+ <parameters>
59
+ <instance-parameter name="self" transfer-ownership="none">
60
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
61
+ </instance-parameter>
62
+ <parameter name="offset" transfer-ownership="none">
63
+ <type name="gulong" c:type="gsize"/>
64
+ </parameter>
65
+ <parameter name="v" transfer-ownership="none">
66
+ <type name="guint8" c:type="guint8"/>
67
+ </parameter>
68
+ </parameters>
69
+ </method>
70
+ <method name="get_u32_le" c:identifier="gjsify_sab_native_shared_buffer_get_u32_le">
71
+ <return-value transfer-ownership="full">
72
+ <type name="guint32" c:type="guint32"/>
73
+ </return-value>
74
+ <parameters>
75
+ <instance-parameter name="self" transfer-ownership="none">
76
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
77
+ </instance-parameter>
78
+ <parameter name="offset" transfer-ownership="none">
79
+ <type name="gulong" c:type="gsize"/>
80
+ </parameter>
81
+ </parameters>
82
+ </method>
83
+ <method name="set_u32_le" c:identifier="gjsify_sab_native_shared_buffer_set_u32_le">
84
+ <return-value transfer-ownership="full">
85
+ <type name="none" c:type="void"/>
86
+ </return-value>
87
+ <parameters>
88
+ <instance-parameter name="self" transfer-ownership="none">
89
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
90
+ </instance-parameter>
91
+ <parameter name="offset" transfer-ownership="none">
92
+ <type name="gulong" c:type="gsize"/>
93
+ </parameter>
94
+ <parameter name="v" transfer-ownership="none">
95
+ <type name="guint32" c:type="guint32"/>
96
+ </parameter>
97
+ </parameters>
98
+ </method>
99
+ <method name="get_i32_le" c:identifier="gjsify_sab_native_shared_buffer_get_i32_le">
100
+ <return-value transfer-ownership="full">
101
+ <type name="gint32" c:type="gint32"/>
102
+ </return-value>
103
+ <parameters>
104
+ <instance-parameter name="self" transfer-ownership="none">
105
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
106
+ </instance-parameter>
107
+ <parameter name="offset" transfer-ownership="none">
108
+ <type name="gulong" c:type="gsize"/>
109
+ </parameter>
110
+ </parameters>
111
+ </method>
112
+ <method name="set_i32_le" c:identifier="gjsify_sab_native_shared_buffer_set_i32_le">
113
+ <return-value transfer-ownership="full">
114
+ <type name="none" c:type="void"/>
115
+ </return-value>
116
+ <parameters>
117
+ <instance-parameter name="self" transfer-ownership="none">
118
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
119
+ </instance-parameter>
120
+ <parameter name="offset" transfer-ownership="none">
121
+ <type name="gulong" c:type="gsize"/>
122
+ </parameter>
123
+ <parameter name="v" transfer-ownership="none">
124
+ <type name="gint32" c:type="gint32"/>
125
+ </parameter>
126
+ </parameters>
127
+ </method>
128
+ <method name="get_u64_le" c:identifier="gjsify_sab_native_shared_buffer_get_u64_le">
129
+ <return-value transfer-ownership="full">
130
+ <type name="guint64" c:type="guint64"/>
131
+ </return-value>
132
+ <parameters>
133
+ <instance-parameter name="self" transfer-ownership="none">
134
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
135
+ </instance-parameter>
136
+ <parameter name="offset" transfer-ownership="none">
137
+ <type name="gulong" c:type="gsize"/>
138
+ </parameter>
139
+ </parameters>
140
+ </method>
141
+ <method name="set_u64_le" c:identifier="gjsify_sab_native_shared_buffer_set_u64_le">
142
+ <return-value transfer-ownership="full">
143
+ <type name="none" c:type="void"/>
144
+ </return-value>
145
+ <parameters>
146
+ <instance-parameter name="self" transfer-ownership="none">
147
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
148
+ </instance-parameter>
149
+ <parameter name="offset" transfer-ownership="none">
150
+ <type name="gulong" c:type="gsize"/>
151
+ </parameter>
152
+ <parameter name="v" transfer-ownership="none">
153
+ <type name="guint64" c:type="guint64"/>
154
+ </parameter>
155
+ </parameters>
156
+ </method>
157
+ <method name="read_bytes" c:identifier="gjsify_sab_native_shared_buffer_read_bytes">
158
+ <return-value transfer-ownership="full">
159
+ <type name="GLib.Bytes" c:type="GBytes*"/>
160
+ </return-value>
161
+ <parameters>
162
+ <instance-parameter name="self" transfer-ownership="none">
163
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
164
+ </instance-parameter>
165
+ <parameter name="offset" transfer-ownership="none">
166
+ <type name="gulong" c:type="gsize"/>
167
+ </parameter>
168
+ <parameter name="length" transfer-ownership="none">
169
+ <type name="gulong" c:type="gsize"/>
170
+ </parameter>
171
+ </parameters>
172
+ </method>
173
+ <method name="write_bytes" c:identifier="gjsify_sab_native_shared_buffer_write_bytes">
174
+ <return-value transfer-ownership="full">
175
+ <type name="none" c:type="void"/>
176
+ </return-value>
177
+ <parameters>
178
+ <instance-parameter name="self" transfer-ownership="none">
179
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
180
+ </instance-parameter>
181
+ <parameter name="offset" transfer-ownership="none">
182
+ <type name="gulong" c:type="gsize"/>
183
+ </parameter>
184
+ <parameter name="data" transfer-ownership="none">
185
+ <type name="GLib.Bytes" c:type="GBytes*"/>
186
+ </parameter>
187
+ </parameters>
188
+ </method>
189
+ <method name="atomic_add_i32" c:identifier="gjsify_sab_native_shared_buffer_atomic_add_i32">
190
+ <return-value transfer-ownership="full">
191
+ <type name="gint32" c:type="gint32"/>
192
+ </return-value>
193
+ <parameters>
194
+ <instance-parameter name="self" transfer-ownership="none">
195
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
196
+ </instance-parameter>
197
+ <parameter name="offset" transfer-ownership="none">
198
+ <type name="gulong" c:type="gsize"/>
199
+ </parameter>
200
+ <parameter name="v" transfer-ownership="none">
201
+ <type name="gint32" c:type="gint32"/>
202
+ </parameter>
203
+ </parameters>
204
+ </method>
205
+ <method name="atomic_sub_i32" c:identifier="gjsify_sab_native_shared_buffer_atomic_sub_i32">
206
+ <return-value transfer-ownership="full">
207
+ <type name="gint32" c:type="gint32"/>
208
+ </return-value>
209
+ <parameters>
210
+ <instance-parameter name="self" transfer-ownership="none">
211
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
212
+ </instance-parameter>
213
+ <parameter name="offset" transfer-ownership="none">
214
+ <type name="gulong" c:type="gsize"/>
215
+ </parameter>
216
+ <parameter name="v" transfer-ownership="none">
217
+ <type name="gint32" c:type="gint32"/>
218
+ </parameter>
219
+ </parameters>
220
+ </method>
221
+ <method name="atomic_load_i32" c:identifier="gjsify_sab_native_shared_buffer_atomic_load_i32">
222
+ <return-value transfer-ownership="full">
223
+ <type name="gint32" c:type="gint32"/>
224
+ </return-value>
225
+ <parameters>
226
+ <instance-parameter name="self" transfer-ownership="none">
227
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
228
+ </instance-parameter>
229
+ <parameter name="offset" transfer-ownership="none">
230
+ <type name="gulong" c:type="gsize"/>
231
+ </parameter>
232
+ </parameters>
233
+ </method>
234
+ <method name="atomic_store_i32" c:identifier="gjsify_sab_native_shared_buffer_atomic_store_i32">
235
+ <return-value transfer-ownership="full">
236
+ <type name="none" c:type="void"/>
237
+ </return-value>
238
+ <parameters>
239
+ <instance-parameter name="self" transfer-ownership="none">
240
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
241
+ </instance-parameter>
242
+ <parameter name="offset" transfer-ownership="none">
243
+ <type name="gulong" c:type="gsize"/>
244
+ </parameter>
245
+ <parameter name="v" transfer-ownership="none">
246
+ <type name="gint32" c:type="gint32"/>
247
+ </parameter>
248
+ </parameters>
249
+ </method>
250
+ <method name="atomic_xchg_i32" c:identifier="gjsify_sab_native_shared_buffer_atomic_xchg_i32">
251
+ <return-value transfer-ownership="full">
252
+ <type name="gint32" c:type="gint32"/>
253
+ </return-value>
254
+ <parameters>
255
+ <instance-parameter name="self" transfer-ownership="none">
256
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
257
+ </instance-parameter>
258
+ <parameter name="offset" transfer-ownership="none">
259
+ <type name="gulong" c:type="gsize"/>
260
+ </parameter>
261
+ <parameter name="v" transfer-ownership="none">
262
+ <type name="gint32" c:type="gint32"/>
263
+ </parameter>
264
+ </parameters>
265
+ </method>
266
+ <method name="atomic_cmpxchg_i32" c:identifier="gjsify_sab_native_shared_buffer_atomic_cmpxchg_i32">
267
+ <return-value transfer-ownership="full">
268
+ <type name="gint32" c:type="gint32"/>
269
+ </return-value>
270
+ <parameters>
271
+ <instance-parameter name="self" transfer-ownership="none">
272
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
273
+ </instance-parameter>
274
+ <parameter name="offset" transfer-ownership="none">
275
+ <type name="gulong" c:type="gsize"/>
276
+ </parameter>
277
+ <parameter name="expected" transfer-ownership="none">
278
+ <type name="gint32" c:type="gint32"/>
279
+ </parameter>
280
+ <parameter name="desired" transfer-ownership="none">
281
+ <type name="gint32" c:type="gint32"/>
282
+ </parameter>
283
+ </parameters>
284
+ </method>
285
+ <method name="futex_wait" c:identifier="gjsify_sab_native_shared_buffer_futex_wait">
286
+ <return-value transfer-ownership="full">
287
+ <type name="gint" c:type="gint"/>
288
+ </return-value>
289
+ <parameters>
290
+ <instance-parameter name="self" transfer-ownership="none">
291
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
292
+ </instance-parameter>
293
+ <parameter name="offset" transfer-ownership="none">
294
+ <type name="gulong" c:type="gsize"/>
295
+ </parameter>
296
+ <parameter name="expected" transfer-ownership="none">
297
+ <type name="gint32" c:type="gint32"/>
298
+ </parameter>
299
+ <parameter name="timeout_ms" transfer-ownership="none">
300
+ <type name="gint64" c:type="gint64"/>
301
+ </parameter>
302
+ </parameters>
303
+ </method>
304
+ <method name="futex_wake" c:identifier="gjsify_sab_native_shared_buffer_futex_wake">
305
+ <return-value transfer-ownership="full">
306
+ <type name="gint" c:type="gint"/>
307
+ </return-value>
308
+ <parameters>
309
+ <instance-parameter name="self" transfer-ownership="none">
310
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
311
+ </instance-parameter>
312
+ <parameter name="offset" transfer-ownership="none">
313
+ <type name="gulong" c:type="gsize"/>
314
+ </parameter>
315
+ <parameter name="count" transfer-ownership="none">
316
+ <type name="gint" c:type="gint"/>
317
+ </parameter>
318
+ </parameters>
319
+ </method>
320
+ <constructor name="new" c:identifier="gjsify_sab_native_shared_buffer_new">
321
+ <return-value transfer-ownership="full">
322
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
323
+ </return-value>
324
+ </constructor>
325
+ <property name="fd">
326
+ <type name="gint" c:type="gint"/>
327
+ </property>
328
+ <method name="get_fd" c:identifier="gjsify_sab_native_shared_buffer_get_fd">
329
+ <return-value transfer-ownership="none">
330
+ <type name="gint" c:type="gint"/>
331
+ </return-value>
332
+ <parameters>
333
+ <instance-parameter name="self" transfer-ownership="none">
334
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
335
+ </instance-parameter>
336
+ </parameters>
337
+ </method>
338
+ <property name="byte-length">
339
+ <type name="gulong" c:type="gsize"/>
340
+ </property>
341
+ <method name="get_byte_length" c:identifier="gjsify_sab_native_shared_buffer_get_byte_length">
342
+ <return-value transfer-ownership="none">
343
+ <type name="gulong" c:type="gsize"/>
344
+ </return-value>
345
+ <parameters>
346
+ <instance-parameter name="self" transfer-ownership="none">
347
+ <type name="GjsifySabNative.SharedBuffer" c:type="GjsifySabNativeSharedBuffer*"/>
348
+ </instance-parameter>
349
+ </parameters>
350
+ </method>
351
+ </class>
352
+ <record name="SharedBufferClass" c:type="GjsifySabNativeSharedBufferClass" glib:is-gtype-struct-for="SharedBuffer">
353
+ <field name="parent_class" readable="0" private="1">
354
+ <type name="GObject.ObjectClass" c:type="GObjectClass"/>
355
+ </field>
356
+ </record>
357
+ <record name="SharedBufferPrivate" c:type="GjsifySabNativeSharedBufferPrivate" disguised="1"/>
358
+ <class name="FdChannel" c:type="GjsifySabNativeFdChannel" c:symbol-prefix="fd_channel" glib:type-name="GjsifySabNativeFdChannel" glib:get-type="gjsify_sab_native_fd_channel_get_type" glib:type-struct="FdChannelClass" parent="GObject.Object">
359
+ <field name="parent_instance" readable="0" private="1">
360
+ <type name="GObject.Object" c:type="GObject"/>
361
+ </field>
362
+ <field name="priv" readable="0" private="1">
363
+ <type name="FdChannelPrivate" c:type="GjsifySabNativeFdChannelPrivate*"/>
364
+ </field>
365
+ <function name="make_pair" c:identifier="gjsify_sab_native_fd_channel_make_pair">
366
+ <return-value transfer-ownership="full">
367
+ <type name="gboolean" c:type="gboolean"/>
368
+ </return-value>
369
+ <parameters>
370
+ <parameter name="parent_fd" direction="out" transfer-ownership="full">
371
+ <type name="gint" c:type="gint*"/>
372
+ </parameter>
373
+ <parameter name="child_fd" direction="out" transfer-ownership="full">
374
+ <type name="gint" c:type="gint*"/>
375
+ </parameter>
376
+ </parameters>
377
+ </function>
378
+ <function name="send_fd" c:identifier="gjsify_sab_native_fd_channel_send_fd">
379
+ <return-value transfer-ownership="full">
380
+ <type name="gboolean" c:type="gboolean"/>
381
+ </return-value>
382
+ <parameters>
383
+ <parameter name="socket_fd" transfer-ownership="none">
384
+ <type name="gint" c:type="gint"/>
385
+ </parameter>
386
+ <parameter name="fd_to_send" transfer-ownership="none">
387
+ <type name="gint" c:type="gint"/>
388
+ </parameter>
389
+ <parameter name="tag" transfer-ownership="none">
390
+ <type name="guint32" c:type="guint32"/>
391
+ </parameter>
392
+ </parameters>
393
+ </function>
394
+ <function name="recv_fd" c:identifier="gjsify_sab_native_fd_channel_recv_fd">
395
+ <return-value transfer-ownership="full">
396
+ <type name="gint" c:type="gint"/>
397
+ </return-value>
398
+ <parameters>
399
+ <parameter name="socket_fd" transfer-ownership="none">
400
+ <type name="gint" c:type="gint"/>
401
+ </parameter>
402
+ <parameter name="tag" direction="out" transfer-ownership="full">
403
+ <type name="guint32" c:type="guint32*"/>
404
+ </parameter>
405
+ </parameters>
406
+ </function>
407
+ <function name="close_fd" c:identifier="gjsify_sab_native_fd_channel_close_fd">
408
+ <return-value transfer-ownership="full">
409
+ <type name="gboolean" c:type="gboolean"/>
410
+ </return-value>
411
+ <parameters>
412
+ <parameter name="fd" transfer-ownership="none">
413
+ <type name="gint" c:type="gint"/>
414
+ </parameter>
415
+ </parameters>
416
+ </function>
417
+ <constructor name="new" c:identifier="gjsify_sab_native_fd_channel_new">
418
+ <return-value transfer-ownership="full">
419
+ <type name="GjsifySabNative.FdChannel" c:type="GjsifySabNativeFdChannel*"/>
420
+ </return-value>
421
+ </constructor>
422
+ </class>
423
+ <record name="FdChannelClass" c:type="GjsifySabNativeFdChannelClass" glib:is-gtype-struct-for="FdChannel">
424
+ <field name="parent_class" readable="0" private="1">
425
+ <type name="GObject.ObjectClass" c:type="GObjectClass"/>
426
+ </field>
427
+ </record>
428
+ <record name="FdChannelPrivate" c:type="GjsifySabNativeFdChannelPrivate" disguised="1"/>
429
+ </namespace>
430
+ </repository>
@@ -0,0 +1,101 @@
1
+ /*
2
+ * FdChannel — Unix-domain socketpair + SCM_RIGHTS fd-transfer helper.
3
+ *
4
+ * Used by @gjsify/worker_threads to attach the fd of a SharedBuffer to a
5
+ * postMessage() call. Workflow:
6
+ *
7
+ * 1. Before spawning the child Worker, the parent calls
8
+ * `FdChannel.make_pair()` — returns (parent_fd, child_fd).
9
+ * 2. `Gio.SubprocessLauncher.take_fd(child_fd, 3)` makes the child end
10
+ * inherit at fd 3 in the worker process. Parent retains parent_fd.
11
+ * 3. For each postMessage() that contains SharedBuffer instances, the
12
+ * parent calls `FdChannel.send_fd(parent_fd, sb.fd, tag)` for each
13
+ * buffer, then writes a JSON message with placeholders
14
+ * `{__sab: <tag>, size: N}` over stdin.
15
+ * 4. The child runs `FdChannel.recv_fd(socket_fd=3, out tag)` in a loop
16
+ * and maintains a Map<tag, fd> that the bootstrap consults when it
17
+ * sees placeholders in incoming JSON messages.
18
+ *
19
+ * Socket type: SOCK_SEQPACKET so each fd-transfer is one atomic message,
20
+ * never split across recvmsg calls. SOCK_CLOEXEC on both ends so the
21
+ * child's `gjs` inherits the fd but the grand-child of any nested
22
+ * subprocess doesn't.
23
+ *
24
+ * The tag is a 4-byte big-endian integer (caller-allocated sequence
25
+ * number). 4 G fd-transfers per worker lifetime — plenty.
26
+ */
27
+
28
+ namespace GjsifySabNative {
29
+
30
+ /* C externs — defined in sab-helpers.c. */
31
+
32
+ [CCode (cname = "gjsify_sab_socketpair",
33
+ cheader_filename = "sab-helpers.h")]
34
+ private extern bool _socketpair (out int parent_fd, out int child_fd);
35
+
36
+ [CCode (cname = "gjsify_sab_send_fd",
37
+ cheader_filename = "sab-helpers.h")]
38
+ private extern bool _send_fd (int socket_fd, int fd_to_send, uint32 tag);
39
+
40
+ [CCode (cname = "gjsify_sab_recv_fd",
41
+ cheader_filename = "sab-helpers.h")]
42
+ private extern int _recv_fd (int socket_fd, out uint32 tag);
43
+
44
+ [CCode (cname = "gjsify_sab_close_fd",
45
+ cheader_filename = "sab-helpers.h")]
46
+ private extern bool _close_fd (int fd);
47
+
48
+ /* ── Public static API ──────────────────────────────────────────────── */
49
+
50
+ public class FdChannel : GLib.Object {
51
+
52
+ /**
53
+ * Create an AF_UNIX/SOCK_SEQPACKET socketpair. Both fds have
54
+ * SOCK_CLOEXEC set.
55
+ *
56
+ * Caller MUST close both fds eventually:
57
+ * - parent_fd: typically closed in `Worker.terminate()` / dispose.
58
+ * - child_fd: closed by `Gio.SubprocessLauncher.take_fd()` when
59
+ * ownership transfers to the spawned child.
60
+ *
61
+ * Returns false on socketpair() failure (errno preserved).
62
+ */
63
+ public static bool make_pair (out int parent_fd, out int child_fd) {
64
+ return _socketpair (out parent_fd, out child_fd);
65
+ }
66
+
67
+ /**
68
+ * Send a single fd over a previously-paired SOCK_SEQPACKET socket
69
+ * via SCM_RIGHTS. The payload is a 4-byte big-endian tag so the
70
+ * receiver can map back to the JSON-side placeholder.
71
+ *
72
+ * Returns false on sendmsg() failure (errno preserved).
73
+ */
74
+ public static bool send_fd (int socket_fd, int fd_to_send, uint32 tag) {
75
+ return _send_fd (socket_fd, fd_to_send, tag);
76
+ }
77
+
78
+ /**
79
+ * Receive one fd from the paired socket. Blocks until a message
80
+ * arrives, the peer closes (orderly EOF, returns 0), or an error
81
+ * occurs.
82
+ *
83
+ * Returns:
84
+ * > 0 received fd; @tag is set to the sender's tag value
85
+ * = 0 orderly EOF (peer closed the socket); @tag undefined
86
+ * < 0 error; errno preserved; @tag undefined
87
+ */
88
+ public static int recv_fd (int socket_fd, out uint32 tag) {
89
+ return _recv_fd (socket_fd, out tag);
90
+ }
91
+
92
+ /**
93
+ * Wrap close(2) so JS callers don't have to pull in GioUnix just for
94
+ * a one-shot fd close on cleanup. Returns true on success or if the
95
+ * fd was already closed (EBADF — caller's intent satisfied either way).
96
+ */
97
+ public static bool close_fd (int fd) {
98
+ return _close_fd (fd);
99
+ }
100
+ }
101
+ }