eh_callback_concurrency.dhover×89all
#!/usr/bin/env dub
/+ dub.sdl:
    name "eh_callback_concurrency"
    dependency "sparkles:event-horizon" path="../../../../.."
    platforms "linux"
    buildType "checked" {
        buildOptions "optimize" "inline" "debugInfo"
    }
+/
@system:
import 
(package) core
core
.
(module) core.time

Module containing core time functionality, such as Duration (which represents a duration of time) or MonoTime (which represents a timestamp of the system's monotonic clock).

Various functions take a string (or strings) to represent a unit of time (e.g. convert!("days", "hours")(numDays)). The valid strings to use with such functions are "years", "months", "weeks", "days", "hours", "minutes", "seconds", "msecs" (milliseconds), "usecs" (microseconds), "hnsecs" (hecto-nanoseconds - i.e. 100 ns) or some subset thereof. There are a few functions that also allow "nsecs", but very little actually has precision greater than hnsecs.

Symbol Description
Types
Duration Represents a duration of time of weeks or less (kept internally as hnsecs). (e.g. 22 days or 700 seconds).
TickDuration DEPRECATED Represents a duration of time in system clock ticks, using the highest precision that the system provides.
MonoTime Represents a monotonic timestamp in system clock ticks, using the highest precision that the system provides.
Functions
convert Generic way of converting between two time units.
dur Allows constructing a Duration from the given time units with the given length.
weeks days hours

minutes seconds msecs

usecs hnsecs nsecs | Convenience aliases for dur. | | abs | Returns the absolute value of a duration. |

From Duration
From TickDuration
From units
To Duration
tickDuration.to, std,conv!Duration()
dur!"msecs"(5) or 5.msecs()

| To TickDuration | duration.to, std,conv!TickDuration() |

  • | TickDuration.from!"msecs"(msecs) |

| To units | duration.total!"days" | tickDuration.msecs | convert!("days", "msecs")(msecs) |

Source

core/time.d

@copyrightCopyright 2010 - 2012@licenseBoost License 1.0.@authorsJonathan M Davis and Kato Shoichi
time
: msecs;
import
(package) std
std
.
(module) std.stdio
Category Symbols
File handles _popen File isFileHandle openNetwork stderr stdin stdout
Reading chunks lines readf readfln readln
Writing toFile write writef writefln writeln
Misc KeepTerminator LockType StdioException

Standard I/O functions that extend core.stdc.stdio. core.stdc.stdio is publically imported when importing std.stdio.

There are three layers of I/O:

  1. The lowest layer is the operating system layer. The two main schemes are Windows and Posix.

  2. C's stdio.h which unifies the two operating system schemes.

  3. std.stdio, this module, unifies the various stdio.h implementations into a high level package for D programs.

Source

std/stdio.d

@copyrightCopyright The D Language Foundation 2007-.@licenseBoost License 1.0.@authorsWalter Bright, Andrei Alexandrescu, Alex Rønne Petersen
stdio
:
(alias template) eh_callback_concurrency.writeln = std.stdio.writeln(T...)(T args)

Equivalent to write(args, '\n'). Calling writeln without arguments is valid and just prints a newline to the standard output.

Example

Reads stdin and writes it to stdout with an argument counter.

import std.stdio;

void main()
{
    string line;

    for (size_t count = 0; (line = readln) !is null; count++)
    {
         writeln("Input ", count, ": ", line);
    }
}
@paramargs the items to write to stdout@throwsIn case of an I/O error, throws an StdioException.
writeln
;
import
(package) sparkles
sparkles
.
(package) sparkles.event_horizon
event_horizon
.
(module) sparkles.event_horizon.loop

Tier A — the callback completion core (SPEC §5): submit(op, callback, ctx) over one DbI backend. The loop owns the op-slot slab (buffer pinning, kernel-stable operands, the cancellation state machine) and delivers completions only inside runOnce — the DEFER_TASKRUN contract made structural.

The loop is thread-affine and non-copyable: every member must be called from the owning thread — except Waker.wake() (SPEC §5.6), the one off-thread door, obtained via waker().

loop
:
(struct) sparkles.event_horizon.loop.EventLoop!(UringBackend, Mallocator)
DefaultLoop
;
import
(package) sparkles
sparkles
.
(package) sparkles.event_horizon
event_horizon
.
(module) sparkles.event_horizon.op

Portable operation vocabulary: typed op descriptors, the user_data token discipline, the op-slot slab with its lifetime state machine, and the completion shape (SPEC §4). This module is portable — it imports no backend and never sees an SQE; backend-specific lowering lives in sparkles.event_horizon.backend.*.

op
:
(struct) sparkles.event_horizon.op.Completion

What a tier-A callback receives. Passed by ref: the callback may move(done.buf) to keep the buffer; otherwise the loop recycles it to its origin after the callback returns.

Completion
;
struct
(struct) eh_callback_concurrency.State
State
{ uint
(field) @system uint eh_callback_concurrency.State.completed
completed
; int[2]
(field) @system int[2] eh_callback_concurrency.State.results
results
; }
struct
(struct) eh_callback_concurrency.Child
Child
{
(struct) eh_callback_concurrency.State
State
*
(field) @system eh_callback_concurrency.State* eh_callback_concurrency.Child.owner
owner
;
(alias) object.size_t = ulong
size_t
(field) @system ulong eh_callback_concurrency.Child.index
index
; }
void
void eh_callback_concurrency.completed(void* context, ref sparkles.event_horizon.op.Completion done) nothrow @nogc @system
completed
(void*
(parameter) void* context
context
, ref
(struct) sparkles.event_horizon.op.Completion

What a tier-A callback receives. Passed by ref: the callback may move(done.buf) to keep the buffer; otherwise the loop recycles it to its origin after the callback returns.

Completion
(parameter) sparkles.event_horizon.op.Completion done
done
) nothrow @nogc
{ auto
(local variable) eh_callback_concurrency.Child* child
child
= cast(
(struct) eh_callback_concurrency.Child
Child
*)
(parameter) void* context
context
;
assert(
(parameter) sparkles.event_horizon.op.Completion done
done
.
(field) int sparkles.event_horizon.op.Completion.res

raw result: >= 0 payload or -errno

res
== 0 &&
(parameter) sparkles.event_horizon.op.Completion done
done
.
bool sparkles.event_horizon.op.Completion.isFinal() const pure nothrow @nogc @safe

false while a multishot op will post further completions.

isFinal
);
assert(
(local variable) eh_callback_concurrency.Child* child
child
.
(field) @system eh_callback_concurrency.State* eh_callback_concurrency.Child.owner
owner
.
(field) @system int[2] eh_callback_concurrency.State.results
results
[
(local variable) eh_callback_concurrency.Child* child
child
.
(field) @system ulong eh_callback_concurrency.Child.index
index
] == 0);
(local variable) eh_callback_concurrency.Child* child
child
.
(field) @system eh_callback_concurrency.State* eh_callback_concurrency.Child.owner
owner
.
(field) @system int[2] eh_callback_concurrency.State.results
results
[
(local variable) eh_callback_concurrency.Child* child
child
.
(field) @system ulong eh_callback_concurrency.Child.index
index
] = cast(int)
(local variable) eh_callback_concurrency.Child* child
child
.
(field) @system ulong eh_callback_concurrency.Child.index
index
+ 1;
++
(local variable) eh_callback_concurrency.Child* child
child
.
(field) @system eh_callback_concurrency.State* eh_callback_concurrency.Child.owner
owner
.
(field) @system uint eh_callback_concurrency.State.completed
completed
;
} void
void D main() @system
main
()
{
(struct) sparkles.event_horizon.loop.EventLoop!(UringBackend, Mallocator)
DefaultLoop
(local variable) sparkles.event_horizon.loop.EventLoop!(UringBackend, Mallocator) loop
loop
;
assert(!
(struct) sparkles.event_horizon.loop.EventLoop!(UringBackend, Mallocator)
DefaultLoop
.
expected.Expected!(void, IoError, NoGcHook) sparkles.event_horizon.loop.EventLoop!(sparkles.event_horizon.backend.uring.UringBackend, std.experimental.allocator.mallocator.Mallocator).create(out sparkles.event_horizon.loop.EventLoop!(UringBackend, Mallocator) loop, in sparkles.event_horizon.loop.LoopConfig cfg = LoopConfig(BackendConfig(256u, 0u, cast(ubyte)0u, cast(ubyte)0u), 0u, & defaultFatalHook)) nothrow @nogc @safe

Out-parameter factory (SPEC §9.1: IoResult cannot return a non-copyable owner by value): backend setup → capability probe (the hard-error semantics of SPEC §3.4) → slab allocation. All-or-nothing.

create
(
(local variable) sparkles.event_horizon.loop.EventLoop!(UringBackend, Mallocator) loop
loop
).
noreturn sparkles.event_horizon.loop.defaultFatalHook(in sparkles.base.io.errors.IoError why) nothrow @nogc @trusted

The default FatalHook: raw write(2) of a static message plus the errno, then abort().

hasError
, "no completion backend");
scope(exit)
(local variable) sparkles.event_horizon.loop.EventLoop!(UringBackend, Mallocator) loop
loop
.
void sparkles.event_horizon.loop.EventLoop!(sparkles.event_horizon.backend.uring.UringBackend, std.experimental.allocator.mallocator.Mallocator).destroy() nothrow @nogc @safe

Structured teardown; the scope discipline (M5) guarantees the precondition at higher tiers. An armed waker (SPEC §5.6) is loop infrastructure, not work — destroy disarms it itself. A queued or in-flight cancellation is work: its target is live, so the first precondition already covers the pending set and the reserved slot.

destroy
();
(struct) eh_callback_concurrency.State
State
(local variable) eh_callback_concurrency.State state
state
;
(struct) eh_callback_concurrency.Child
Child
[2]
(local variable) eh_callback_concurrency.Child[2] children
children
= [
(struct) eh_callback_concurrency.Child
Child
(&
(local variable) eh_callback_concurrency.State state
state
, 0),
(struct) eh_callback_concurrency.Child
Child
(&
(local variable) eh_callback_concurrency.State state
state
, 1)];
foreach (ref
(parameter) eh_callback_concurrency.Child child
child
;
(local variable) eh_callback_concurrency.Child[2] children
children
)
assert(
(local variable) sparkles.event_horizon.loop.EventLoop!(UringBackend, Mallocator) loop
loop
.
expected.Expected!(OpHandle, IoError, NoGcHook) sparkles.event_horizon.loop.EventLoop!(sparkles.event_horizon.backend.uring.UringBackend, std.experimental.allocator.mallocator.Mallocator).submitAfter(core.time.Duration rel, void function(void* ctx, ref sparkles.event_horizon.op.Completion done) nothrow @nogc cb, void* ctx = null) nothrow @nogc @safe

Arms a relative timer (in-ring TIMEOUT, SPEC §5.3); the callback fires with res == 0 on expiry.

submitAfter
(10.msecs, &
void eh_callback_concurrency.completed(void* context, ref sparkles.event_horizon.op.Completion done) nothrow @nogc @system
completed
, &
(local variable) eh_callback_concurrency.Child child
child
).
bool expected.Expected!(sparkles.event_horizon.op.OpHandle, sparkles.base.io.errors.IoError, sparkles.base.text.errors.NoGcHook).hasValue!()() const pure nothrow @nogc @property @safe

Checks if Expected has value

hasValue
);
assert(
(local variable) eh_callback_concurrency.State state
state
.
(field) @system uint eh_callback_concurrency.State.completed
completed
== 0 &&
(local variable) sparkles.event_horizon.loop.EventLoop!(UringBackend, Mallocator) loop
loop
.
uint sparkles.event_horizon.loop.EventLoop!(sparkles.event_horizon.backend.uring.UringBackend, std.experimental.allocator.mallocator.Mallocator).inFlight() const pure nothrow @nogc @safe

User and timer ops currently in flight (an armed waker is excluded — infrastructure, not work; SPEC §5.6).

inFlight
== 2);
assert(!
(local variable) sparkles.event_horizon.loop.EventLoop!(UringBackend, Mallocator) loop
loop
.
expected.Expected!(void, IoError, NoGcHook) sparkles.event_horizon.loop.EventLoop!(sparkles.event_horizon.backend.uring.UringBackend, std.experimental.allocator.mallocator.Mallocator).run() nothrow @nogc @safe

Runs until stop() or until drained (no live user/timer ops — an armed waker alone does not keep ``run() alive; SPEC §5.6).

run
().
bool expected.Expected!(void, sparkles.base.io.errors.IoError, sparkles.base.text.errors.NoGcHook).hasError!()() const pure nothrow @nogc @property @safe

Checks if Expected has error

hasError
);
assert(
(local variable) sparkles.event_horizon.loop.EventLoop!(UringBackend, Mallocator) loop
loop
.
uint sparkles.event_horizon.loop.EventLoop!(sparkles.event_horizon.backend.uring.UringBackend, std.experimental.allocator.mallocator.Mallocator).inFlight() const pure nothrow @nogc @safe

User and timer ops currently in flight (an armed waker is excluded — infrastructure, not work; SPEC §5.6).

inFlight
== 0 &&
(local variable) eh_callback_concurrency.State state
state
.
(field) @system uint eh_callback_concurrency.State.completed
completed
== 2);
assert(
(local variable) eh_callback_concurrency.State state
state
.
(field) @system int[2] eh_callback_concurrency.State.results
results
[] == [1, 2]);
// Explicit fan-in, not a structured child scope or CPU parallelism.
void std.stdio.writeln!(string, int)(string __param_0, int __param_1) @safe

Equivalent to write(args, '\n'). Calling writeln without arguments is valid and just prints a newline to the standard output.

Example

Reads stdin and writes it to stdout with an argument counter.

import std.stdio;

void main()
{
    string line;

    for (size_t count = 0; (line = readln) !is null; count++)
    {
         writeln("Input ", count, ": ", line);
    }
}
@paramargs the items to write to stdout@throwsIn case of an I/O error, throws an StdioException.
writeln
("joined: ",
(local variable) eh_callback_concurrency.State state
state
.
(field) @system int[2] eh_callback_concurrency.State.results
results
[0] * 10 +
(local variable) eh_callback_concurrency.State state
state
.
(field) @system int[2] eh_callback_concurrency.State.results
results
[1]);
}