On 06/15/2016 09:18 PM, Rajalakshmi Iyer wrote:
Thanks everyone.

I have been able to compile a C++ module fine. But I am primarily trying to figure out if it's safe to use features like STL containers or Boost libraries within an Nginx module.

In my project, I used STL. it works fine.

I am asking this because if I try to allocate an std::string within say the module context, I see a segmentation fault. I assume it's because of the Nginx pool mechanism?


Not sure what is "say the module context", and how you allocate std::string on Nginx pool. I believe there
are following combinations of "allocating std::string" and Nginx-pool usage.

   1).  does not use pool at all, statement like:

std::string *p = new std::string("haha"); // instance allocated from heap
         std::string s("haha") // instance allocated from stack.


2) use pool to allocate std::string instance, but use heap to allocate data: like following

the instance is allocate on pool via placement new, but the data is allocated from heap.

        void *p = ngx_palloc(enough size)
        std::string *s = new(p) std::string("haha")

it is fine so long as string instance's life time is not longer than pool

3). if you want to allocate data on top of ngx pool (for efficiency reasons), it is bit involved.
         first, you need to define an allocation class like this
http://www.mcs.anl.gov/OpenAD/OpenADFortTkExtendedDox/mempool__allocator_8h_source.html
(NOTE that the MEM_POOL is similar to Nginx pool in many ways). and feed to allocator
         to construction.

           e.g. typedef mempool_allocator<node_type> my_allocator;
                  tyepdef std::vector<node_type, my_alloctor> my_vector_t;

                  ngx_pool_t* the_ngx_pool = ....

                  my_vector_t vect(myalloctor(the_ngx_pool))

               so the element will allocate from the nginx pool.


_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel

Reply via email to