  Transactional data structure libraries (TDSL) combine the ease-of-programming
of transactions with the high performance and scalability of custom-tailored
concurrent data structures. They can be very efficient thanks to their ability
to exploit data structure semantics in order to reduce overhead, aborts, and
wasted work compared to general-purpose software transactional memory. However,
TDSLs were not previously used for complex use-cases involving long
transactions and a variety of data structures.
  In this paper, we boost the performance and usability of a TDSL, towards
allowing it to support complex applications. A key idea is nesting. Nested
transactions create checkpoints within a longer transaction, so as to limit the
scope of abort, without changing the semantics of the original transaction. We
build a Java TDSL with built-in support for nested transactions over a number
of data structures. We conduct a case study of a complex network intrusion
detection system that invests a significant amount of work to process each
packet. Our study shows that our library outperforms publicly available STMs
twofold without nesting, and by up to 16x when nesting is used.
