nginx/ngx-rust

Safe wrappers for generic collections

Opened this issue · 0 comments

In NGINX we have several "generic" collections (in the most C style of generic, with void * or pointer aliasing):

  • ngx_array_t, an array of known-size void * pointers
  • ngx_list_t, a sequence of arrays of void *
  • ngx_queue_t, an intrusive doubly linked list.
  • ngx_rbtree_t, a red-black tree. This structure is used both as intrusive (ngx_event_t.timer of type ngx_rbtree_node_t) and via ngx_rbtree_node_t.data of type void *.
  • ngx_hash_t, a hash table.

All of those should be representable as strictly typed objects, e.g. Array<NgxStr>, List<TableElement>, Hash<HttpHeader> and have the necessary iteration, random access and modification methods. This way we could limit unsafety to the initialization of a collection wrapper.

There's a crate that is useful for implementing such wrappers, foreign-types. It's not necessary, as for Array<T> we can directly cast ngx_array_t.elts.add(i) to *mut T with almost the same level of (un)safety, but it makes certain steps easier and reduces boilerplate code.