Since writers are normally only used synchronously (i.e. to write one document at a time), we don't guard modifications to their internal state (e.g. temporarily replacing the string.Builder in WriteNodesAsString) against race conditions. The package global `orgWriter` and corresponding use cases of it (`org.String`, `$node.String`) break that pattern - the writer is potentially used from multiple go routines at the same time. This results in race conditions that manifest as error messages like e.g. could not write output: runtime error: invalid memory address or nil pointer dereference. Using unrendered content. Additionally, since we catch panics in `Document.Write`, the corresponding stack trace is lost and dependents of go-org never know what hit them. As using a writer across simultaneously across go routines is not a standard pattern, we'll sync the use of the global `orgWriter` instead of trying to make the actual writer threadsafe; less code noise for the common use case. |
||
---|---|---|
.. | ||
testdata | ||
block.go | ||
document.go | ||
drawer.go | ||
footnote.go | ||
fuzz.go | ||
headline.go | ||
html_entity.go | ||
html_writer.go | ||
html_writer_test.go | ||
inline.go | ||
keyword.go | ||
list.go | ||
org_writer.go | ||
org_writer_test.go | ||
paragraph.go | ||
table.go | ||
util.go | ||
util_test.go | ||
writer.go |