digraph g { graph [ nodesep="0.2" ]; edge [ fontname="Helvetica", fontsize=10, labelfontname="Helvetica", labelfontsize=10 ]; node [ fontname="Helvetica", fontsize=10, shape=box ]; edge [ arrowhead="open" ] // Program elements. { operating_system [ label="Operating System", shape=ellipse ]; io_context [ label="io_context" ]; io_object [ label="I/O Object\ne.g. socket" ]; your_program [ label="Your Program" ]; your_completion_handler [ label="Your Completion Handler" ]; } // Owning relationships. { edge [ arrowtail="diamond" ]; your_program:e -> your_completion_handler:n; your_program:w -> io_object:nw; your_program:se -> io_context:ne; } // Non-owning relationships; { io_object:sw -> io_context:w; } // Visible actions. { edge [ style="dashed", color="#808080" ]; // Forward actions. { your_program:sw -> io_object:n [ label="1" ]; io_object:s -> io_context:nw [ label="2" ]; io_context:s -> operating_system:n [ label="3" ]; } } // Invisible actions. { edge [ style="invis" ]; // Forward actions. { your_program:s -> io_context:n [ label="5" ]; } // Reverse actions. { edge [ arrowhead="none", arrowtail="open" ]; //io_context:s -> operating_system:n [ label="4" ]; your_completion_handler:s -> io_context:e [ label="6" ]; } } }