| 2722 | } |
| 2723 | |
| 2724 | int Socket::GetPooledSocket(SocketUniquePtr* pooled_socket) { |
| 2725 | if (pooled_socket == NULL) { |
| 2726 | LOG(ERROR) << "pooled_socket is NULL"; |
| 2727 | return -1; |
| 2728 | } |
| 2729 | SharedPart* main_sp = GetOrNewSharedPart(); |
| 2730 | if (main_sp == NULL) { |
| 2731 | LOG(ERROR) << "_shared_part is NULL"; |
| 2732 | return -1; |
| 2733 | } |
| 2734 | // Create socket_pool optimistically. |
| 2735 | SocketPool* socket_pool = main_sp->socket_pool.load(butil::memory_order_consume); |
| 2736 | if (socket_pool == NULL) { |
| 2737 | SocketOptions opt; |
| 2738 | opt.remote_side = remote_side(); |
| 2739 | opt.local_side = butil::EndPoint(local_side().ip, 0); |
| 2740 | opt.user = user(); |
| 2741 | opt.on_edge_triggered_events = _on_edge_triggered_events; |
| 2742 | opt.need_on_edge_trigger = _need_on_edge_trigger; |
| 2743 | opt.initial_ssl_ctx = _ssl_ctx; |
| 2744 | opt.keytable_pool = _keytable_pool; |
| 2745 | opt.app_connect = _app_connect; |
| 2746 | opt.socket_mode = _socket_mode; |
| 2747 | socket_pool = new SocketPool(opt); |
| 2748 | SocketPool* expected = NULL; |
| 2749 | if (!main_sp->socket_pool.compare_exchange_strong( |
| 2750 | expected, socket_pool, butil::memory_order_acq_rel)) { |
| 2751 | delete socket_pool; |
| 2752 | CHECK(expected); |
| 2753 | socket_pool = expected; |
| 2754 | } |
| 2755 | } |
| 2756 | if (socket_pool->GetSocket(pooled_socket) != 0) { |
| 2757 | return -1; |
| 2758 | } |
| 2759 | (*pooled_socket)->ShareStats(this); |
| 2760 | CHECK((*pooled_socket)->parsing_context() == NULL) |
| 2761 | << "context=" << (*pooled_socket)->parsing_context() |
| 2762 | << " is not NULL when " << *(*pooled_socket) << " is got from" |
| 2763 | " SocketPool, the protocol implementation is buggy"; |
| 2764 | return 0; |
| 2765 | } |
| 2766 | |
| 2767 | int Socket::ReturnToPool() { |
| 2768 | SharedPart* sp = _shared_part.exchange(NULL, butil::memory_order_acquire); |