Ticket #5956: phusion_optional_stack_size.patch

File phusion_optional_stack_size.patch, 7.1 KB (added by blentz@…, 11 years ago)

Initial implementation of optional stack_size argument for thread::start_thread

  • boost/thread/detail/thread.hpp

    diff --git a/boost/thread/detail/thread.hpp b/boost/thread/detail/thread.hpp
    index 26224ba..3db4b88 100644
    a b namespace boost  
    117117       
    118118        detail::thread_data_ptr thread_info;
    119119
    120         void start_thread();
    121        
    122120        explicit thread(detail::thread_data_ptr data);
    123121
    124122        detail::thread_data_ptr get_thread_info BOOST_PREVENT_MACRO_SUBSTITUTION () const;
    namespace boost  
    147145
    148146#endif
    149147        struct dummy;
     148       
     149    protected:
     150        template <class F>
     151        void set_thread_main_function(F f)
     152        {
     153            thread_info = make_thread_info(f);
     154        }
     155       
     156        void start_thread(unsigned int stack_size = 0);
     157       
    150158    public:
    151159#if BOOST_WORKAROUND(__SUNPRO_CC, < 0x5100)
    152160        thread(const volatile thread&);
    153161#endif
    154162        thread();
    155         ~thread();
     163        virtual ~thread();
    156164
    157165#ifndef BOOST_NO_RVALUE_REFERENCES
    158166#ifdef BOOST_MSVC
    namespace boost  
    164172        }
    165173#else
    166174        template <class F>
    167         thread(F&& f):
     175        thread(F&& f, unsigned int stack_size = 0):
    168176            thread_info(make_thread_info(static_cast<F&&>(f)))
    169177        {
    170             start_thread();
     178            start_thread(stack_size);
    171179        }
    172180#endif
    173181
    namespace boost  
    191199#else
    192200#ifdef BOOST_NO_SFINAE
    193201        template <class F>
    194         explicit thread(F f):
     202        explicit thread(F f, unsigned int stack_size = 0):
    195203            thread_info(make_thread_info(f))
    196204        {
    197             start_thread();
     205            start_thread(stack_size);
    198206        }
    199207#else
    200208        template <class F>
    201         explicit thread(F f,typename disable_if<boost::is_convertible<F&,detail::thread_move_t<F> >, dummy* >::type=0):
     209        explicit thread(F f,typename disable_if<boost::is_convertible<F&,detail::thread_move_t<F> >, dummy* >::type=0, unsigned int stack_size = 0):
    202210            thread_info(make_thread_info(f))
    203211        {
    204             start_thread();
     212            start_thread(stack_size);
    205213        }
    206214#endif
    207215       
    208216        template <class F>
    209         explicit thread(detail::thread_move_t<F> f):
     217        explicit thread(detail::thread_move_t<F> f, unsigned int stack_size = 0):
    210218            thread_info(make_thread_info(f))
    211219        {
    212             start_thread();
     220            start_thread(stack_size);
    213221        }
    214222
    215223        thread(detail::thread_move_t<thread> x)
    namespace boost  
    246254#endif
    247255
    248256        template <class F,class A1>
    249         thread(F f,A1 a1):
     257        thread(F f,A1 a1, unsigned int stack_size = 0):
    250258            thread_info(make_thread_info(boost::bind(boost::type<void>(),f,a1)))
    251259        {
    252             start_thread();
     260            start_thread(stack_size);
    253261        }
    254262        template <class F,class A1,class A2>
    255         thread(F f,A1 a1,A2 a2):
     263        thread(F f,A1 a1,A2 a2, unsigned int stack_size = 0):
    256264            thread_info(make_thread_info(boost::bind(boost::type<void>(),f,a1,a2)))
    257265        {
    258             start_thread();
     266            start_thread(stack_size);
    259267        }
    260268
    261269        template <class F,class A1,class A2,class A3>
    262         thread(F f,A1 a1,A2 a2,A3 a3):
     270        thread(F f,A1 a1,A2 a2,A3 a3, unsigned int stack_size = 0):
    263271            thread_info(make_thread_info(boost::bind(boost::type<void>(),f,a1,a2,a3)))
    264272        {
    265             start_thread();
     273            start_thread(stack_size);
    266274        }
    267275
    268276        template <class F,class A1,class A2,class A3,class A4>
    269         thread(F f,A1 a1,A2 a2,A3 a3,A4 a4):
     277        thread(F f,A1 a1,A2 a2,A3 a3,A4 a4, unsigned int stack_size = 0):
    270278            thread_info(make_thread_info(boost::bind(boost::type<void>(),f,a1,a2,a3,a4)))
    271279        {
    272             start_thread();
     280            start_thread(stack_size);
    273281        }
    274282
    275283        template <class F,class A1,class A2,class A3,class A4,class A5>
    276         thread(F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5):
     284        thread(F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5, unsigned int stack_size = 0):
    277285            thread_info(make_thread_info(boost::bind(boost::type<void>(),f,a1,a2,a3,a4,a5)))
    278286        {
    279             start_thread();
     287            start_thread(stack_size);
    280288        }
    281289
    282290        template <class F,class A1,class A2,class A3,class A4,class A5,class A6>
    283         thread(F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6):
     291        thread(F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6, unsigned int stack_size = 0):
    284292            thread_info(make_thread_info(boost::bind(boost::type<void>(),f,a1,a2,a3,a4,a5,a6)))
    285293        {
    286             start_thread();
     294            start_thread(stack_size);
    287295        }
    288296
    289297        template <class F,class A1,class A2,class A3,class A4,class A5,class A6,class A7>
    290         thread(F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7):
     298        thread(F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7, unsigned int stack_size = 0):
    291299            thread_info(make_thread_info(boost::bind(boost::type<void>(),f,a1,a2,a3,a4,a5,a6,a7)))
    292300        {
    293             start_thread();
     301            start_thread(stack_size);
    294302        }
    295303
    296304        template <class F,class A1,class A2,class A3,class A4,class A5,class A6,class A7,class A8>
    297         thread(F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8):
     305        thread(F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8, unsigned int stack_size = 0):
    298306            thread_info(make_thread_info(boost::bind(boost::type<void>(),f,a1,a2,a3,a4,a5,a6,a7,a8)))
    299307        {
    300             start_thread();
     308            start_thread(stack_size);
    301309        }
    302310
    303311        template <class F,class A1,class A2,class A3,class A4,class A5,class A6,class A7,class A8,class A9>
    304         thread(F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9):
     312        thread(F f,A1 a1,A2 a2,A3 a3,A4 a4,A5 a5,A6 a6,A7 a7,A8 a8,A9 a9, unsigned int stack_size = 0):
    305313            thread_info(make_thread_info(boost::bind(boost::type<void>(),f,a1,a2,a3,a4,a5,a6,a7,a8,a9)))
    306314        {
    307             start_thread();
     315            start_thread(stack_size);
    308316        }
    309317
    310318        void swap(thread& x)
  • libs/thread/src/pthread/thread.cpp

    diff --git a/libs/thread/src/pthread/thread.cpp b/libs/thread/src/pthread/thread.cpp
    index 4ff40a9..7571c9a 100644
    a b namespace boost  
    180180    thread::thread()
    181181    {}
    182182
    183     void thread::start_thread()
     183    void thread::start_thread(unsigned int stack_size)
    184184    {
     185        /* FIXME: Linux-only. Breaks Win32. */
    185186        thread_info->self=thread_info;
    186         int const res = pthread_create(&thread_info->thread_handle, 0, &thread_proxy, thread_info.get());
     187        pthread_attr_t attr;
     188        int res = pthread_attr_init(&attr);
     189        if (res != 0) {
     190            throw thread_resource_error();
     191        }
     192        if (stack_size > 0) {
     193            res = pthread_attr_setstacksize(&attr, stack_size);
     194            if (res != 0) {
     195                pthread_attr_destroy(&attr);
     196                throw thread_resource_error();
     197            }
     198        }
     199
     200        res = pthread_create(&thread_info->thread_handle, &attr, &thread_proxy, thread_info.get());
     201        pthread_attr_destroy(&attr);
    187202        if (res != 0)
    188203        {
    189204            thread_info->self.reset();