A few months ago, I was writing a Go module for using librosie when I ran into a problem that appeared to be related to Go/cgo stack allocation. That turned out to be a red herring (no offense to herrings of any color), and we now have a working Go library for Rosie!

What was the actual problem?

I don’t know! It seems that the problem was in a memory access to a stack-allocated structure, though I have not had the time to investigate it further. Here’s what I know:

  • The problem manifested when a Go program with one goroutine (main) that was using librosie triggered a garbage collection. It also appeared when creating an additional goroutine that called librosie.
  • The error reported was from morestack.
  • Forcing the main goroutine to stay on its initial OS thread made the problem go away.

At the time, in December 2017, librosie was compiling with -Wall and no warnings, and was tested with valgrind for any misuse of memory, with none reported.

After some investigation and a variety of inconclusive experiments, I put the problem on the back burner and continued with some refactoring of and minor improvements to librosie. That’s when I accidentally solved the problem.

One day when I had some time to return to the problem, I found it had been resolved. This commit has a change to caploop() which appears to contain the solution. This commit replaced a set of simple macros used to manipulate a stack (in a C array) with a set of functions that do the same thing.

Both the macros and the functions were run with valgrind and no inappropriate memory accesses were found. Yet, the version with the macros causes the Go stack error, while the version with functions does not.

One day I will look further into this, because I would like to understand exactly what the issue was. If you have any insights or good guesses, please comment on Reddit.

The Go client for librosie

With the Go stack issue resolved, we now have a working Go module for Rosie! It’s pretty simple right now, exposing most of Rosie’s functionality but lacking some convenience functions.

The librosie Go library may be found on Gitlab along with a test program that uses it. Additional functions for convenient use of rosie.go are planned, as indicated by the comments in the file. Also, some new Rosie features are not yet supported, like the ability to map pattern names to colors for easy-to-read output for humans. We will add those soon.

If you are a Go programmer and want to contribute to rosie.go, to make it more usable or more Go-like, we welcome your input (especially pull requests)!

Discussion on reddit

Please post comments to the Rosie subreddit.


Follow us on Twitter for announcements about the RPL approach to #modernpatternmatching.