enterCS and exitCS are both used in gc_test checkVisible function. It might be to avoid hitting the TLS used in lockShared / unlockShared ? 

I think GcLock should only expose a public interface, all the rest should be implementation-internal and be put private.