gbstrlen() just checked for NULL and called gbshutdownAbort(). Dereferncing NULL on mordern platforms cases a SIGSEGV which is cought by our signal handler and .... gbshutdownAbort() is called. So gbstrlen() was superfluous and complicated static analysis.
Threads were being created and destroyed which can be expensive. The
thread-per-job model has been changed to a job scheduler that manages the job
queues and threads in pools. The submission of a job now specifies start/finish
routines, state, and as precisely what kind of job it is. The job scheduler then
takes care of the rest. it is hidden how many queues and pools there are.
Removed unnecessary #includes. Turned out that includign Mem.h was mostly
equivalent to #include *.* because Mem.h would pull in Xml.h, File.h Hostdb.h
etc. A small step toward making header files and modules self-contained.
With glibc-2.18 it is possible to end up with int32_t typedef'ed as "int" in one
module and "unsigned int" in another, making the use of it nominally
inconsistent, which Flexelint complains about. But using flexelint's -fdc flag
reveals that the C++ template numeric_limits<> relies on "char", "signed char"
and "unsigned char" being three distinct types. glibc-2.18 contains at least
three different typedefs for the integer types, so it is a mess. Best option is
to make include order consistent in our source code.