digraph g { graph [ nodesep="0.6" ]; 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" ]; } // Owning relationships. { edge [ arrowtail="diamond" ]; your_program:w -> io_object:nw; your_program:se -> io_context:ne; } // Non-owning relationships; { io_object:sw -> io_context:w; } // 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:sw -> operating_system:nw [ label="3" ]; } // Reverse actions. { edge [ arrowhead="none", arrowtail="open" ]; io_context:se -> operating_system:ne [ label="4" ]; io_object:se -> io_context:n [ label="5" ]; your_program:s -> io_object:ne [ label="6" ]; } } }