Boost logo

Boost Users :

From: Fei Liu (fei.liu_at_[hidden])
Date: 2007-08-15 15:57:26


#ifndef UTILS_NETWORK_TCP_CONNECTION_HPP
#define UTILS_NETWORK_TCP_CONNECTION_HPP

namespace utils{
    namespace thread{

        template <typename shared_obj_type, typename thread_pool_type,
            typename serverlet_type>
        class tcp_connection{
        private:
            int newsockfd;
            shared_obj_type obj;
            thread_pool_type pool;
            serverlet_type serverlet;

            bool initialized_;
        public:
            tcp_connection() : initialized_ (false) {}
            tcp_connection(int newsockfd, shared_obj_type obj,
thread_pool_type pool, serverlet_type serverlet)
                : newsockfd(newsockfd), obj(obj), pool(pool),
serverlet(serverlet), initialized_(true)
            {
            }
            bool initialized() { return initialized_; }

            bool initialize(int newsockfd, shared_obj_type obj,
thread_pool_type pool, serverlet_type serverlet);
            void operator ()();
        };

        template <typename shared_obj_type, typename thread_pool_type,
typename serverlet_type>
        bool tcp_connection<shared_obj_type, thread_pool_type,
serverlet_type>::initialize
            (int newsockfd, shared_obj_type obj, thread_pool_type pool,
serverlet_type serverlet)
        {
            this->newsockfd = newsockfd;
            this->obj = obj;
            this->pool = pool;
            this->serverlet = serverlet;
            initialized_ = true;
            return initialized_;
        }

        template <typename shared_obj_type, typename thread_pool_type,
typename serverlet_type>
        void tcp_connection<shared_obj_type, thread_pool_type,
serverlet_type>::operator() ()
        {
            //if(initialized_) serverlet_type(newsockfd, obj); <----
causes error
            pool->release();
        }
    }
}

#endif
main.cpp: provides definition of serverlet_type
#include "utils/thread/tcp_server.hpp"
#include "utils/thread/thread_pool.h"
#include <boost/shared_ptr.hpp>

#include <vector>
#include <iostream>

typedef std::vector<int> shared_obj_type;
typedef boost::shared_ptr<boost_thread::thread_pool> thread_pool_type;
typedef void (*serverlet_type)(int, shared_obj_type);

void servlet(int sock, shared_obj_type ){
    std::cout << "got a new socket for a new connection: " << sock <<
std::endl;
}

int main(){

    shared_obj_type x;
    thread_pool_type p( new boost_thread::thread_pool(20) );

    utils::thread::tcp_server<shared_obj_type, thread_pool_type,
serverlet_type> server;
    server.initialize(x, p, servlet, 10000, 5);

    boost::thread s(server);
    s.join();

}

/root/cpp-utils-header-lib/include/utils/thread/tcp_connection.hpp: In
member function `void utils::thread::tcp_connection<shared_obj_type,
thread_pool_type, serverlet_type>::operator()() [with shared_obj_type =
shared_obj_type, thread_pool_type = thread_pool_type, serverlet_type =
void (*)(int, shared_obj_type)]':
/usr/include/boost/function/function_template.hpp:155: instantiated
from `static void
boost::detail::function::void_function_obj_invoker0<FunctionObj,
R>::invoke(boost::detail::function::function_buffer&) [with FunctionObj
= utils::thread::tcp_connection<shared_obj_type, thread_pool_type, void
(*)(int, shared_obj_type)>, R = void]'
/usr/include/boost/function/function_template.hpp:368: instantiated
from `void boost::detail::function::basic_vtable0<R,
Allocator>::init(FunctionObj, boost::detail::function::function_obj_tag)
[with FunctionObj = utils::thread::tcp_connection<shared_obj_type,
thread_pool_type, void (*)(int, shared_obj_type)>, R = void, Allocator =
std::allocator<boost::function_base>]'
/usr/include/boost/function/function_template.hpp:298: instantiated
from `void boost::detail::function::basic_vtable0<R, Allocator>::init(F)
[with F = utils::thread::tcp_connection<shared_obj_type,
thread_pool_type, void (*)(int, shared_obj_type)>, R = void, Allocator =
std::allocator<boost::function_base>]'
/usr/include/boost/function/function_template.hpp:277: instantiated
from `boost::detail::function::basic_vtable0<R,
Allocator>::basic_vtable0(F) [with F =
utils::thread::tcp_connection<shared_obj_type, thread_pool_type, void
(*)(int, shared_obj_type)>, R = void, Allocator =
std::allocator<boost::function_base>]'
/usr/include/boost/function/function_template.hpp:655: instantiated
from `void boost::function0<R, Allocator>::assign_to(Functor) [with
Functor = utils::thread::tcp_connection<shared_obj_type,
thread_pool_type, void (*)(int, shared_obj_type)>, R = void, Allocator =
std::allocator<boost::function_base>]'
/usr/include/boost/function/function_template.hpp:513: instantiated
from `boost::function0<R, Allocator>::function0(Functor, typename
boost::enable_if_c< boost::type_traits::ice_not<
boost::is_integral<Functor>::value>::value, int>::type) [with Functor =
utils::thread::tcp_connection<shared_obj_type, thread_pool_type, void
(*)(int, shared_obj_type)>, R = void, Allocator =
std::allocator<boost::function_base>]'
/root/cpp-utils-header-lib/include/utils/thread/tcp_server.hpp:107:
instantiated from `void utils::thread::tcp_server<shared_obj_type,
thread_pool_type, serverlet_type, accept_fail_policy>::operator()()
[with shared_obj_type = shared_obj_type, thread_pool_type =
thread_pool_type, serverlet_type = void (*)(int, shared_obj_type),
accept_fail_policy = utils::thread::default_accept_fail_policy]'
/usr/include/boost/function/function_template.hpp:155: instantiated
from `static void
boost::detail::function::void_function_obj_invoker0<FunctionObj,
R>::invoke(boost::detail::function::function_buffer&) [with FunctionObj
= utils::thread::tcp_server<shared_obj_type, thread_pool_type, void
(*)(int, shared_obj_type), utils::thread::default_accept_fail_policy>, R
= void]'
/usr/include/boost/function/function_template.hpp:368: instantiated
from `void boost::detail::function::basic_vtable0<R,
Allocator>::init(FunctionObj, boost::detail::function::function_obj_tag)
[with FunctionObj = utils::thread::tcp_server<shared_obj_type,
thread_pool_type, void (*)(int, shared_obj_type),
utils::thread::default_accept_fail_policy>, R = void, Allocator =
std::allocator<boost::function_base>]'
/usr/include/boost/function/function_template.hpp:298: instantiated
from `void boost::detail::function::basic_vtable0<R, Allocator>::init(F)
[with F = utils::thread::tcp_server<shared_obj_type, thread_pool_type,
void (*)(int, shared_obj_type),
utils::thread::default_accept_fail_policy>, R = void, Allocator =
std::allocator<boost::function_base>]'
/usr/include/boost/function/function_template.hpp:277: instantiated
from `boost::detail::function::basic_vtable0<R,
Allocator>::basic_vtable0(F) [with F =
utils::thread::tcp_server<shared_obj_type, thread_pool_type, void
(*)(int, shared_obj_type), utils::thread::default_accept_fail_policy>, R
= void, Allocator = std::allocator<boost::function_base>]'
/usr/include/boost/function/function_template.hpp:655: instantiated
from `void boost::function0<R, Allocator>::assign_to(Functor) [with
Functor = utils::thread::tcp_server<shared_obj_type, thread_pool_type,
void (*)(int, shared_obj_type),
utils::thread::default_accept_fail_policy>, R = void, Allocator =
std::allocator<boost::function_base>]'
/usr/include/boost/function/function_template.hpp:513: instantiated
from `boost::function0<R, Allocator>::function0(Functor, typename
boost::enable_if_c< boost::type_traits::ice_not<
boost::is_integral<Functor>::value>::value, int>::type) [with Functor =
utils::thread::tcp_server<shared_obj_type, thread_pool_type, void
(*)(int, shared_obj_type), utils::thread::default_accept_fail_policy>, R
= void, Allocator = std::allocator<boost::function_base>]'
tests/boost_tcp_server_test.cpp:24: instantiated from here
/root/cpp-utils-header-lib/include/utils/thread/tcp_connection.hpp:61:
error: functional cast expression list treated as compound expression
/root/cpp-utils-header-lib/include/utils/thread/tcp_connection.hpp:61:
warning: left-hand operand of comma has no effect
/root/cpp-utils-header-lib/include/utils/thread/tcp_connection.hpp:61:
error: cannot convert
`((void)((utils::thread::tcp_connection<shared_obj_type,
thread_pool_type, void (*)(int,
shared_obj_type)>*)this)->utils::thread::tcp_connection<shared_obj_type,
thread_pool_type, void (*)(int, shared_obj_type)>::newsockfd,
((utils::thread::tcp_connection<shared_obj_type, thread_pool_type, void
(*)(int,
shared_obj_type)>*)this)->utils::thread::tcp_connection<shared_obj_type,
thread_pool_type, void (*)(int, shared_obj_type)>::obj)' from type
`shared_obj_type' to type `void (*)(int, shared_obj_type)'


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net