@ -49,84 +49,6 @@
namespace grpc {
Server : : Server ( ThreadPoolInterface * thread_pool , bool thread_pool_owned ,
ServerCredentials * creds )
: started_ ( false ) ,
shutdown_ ( false ) ,
num_running_cb_ ( 0 ) ,
thread_pool_ ( thread_pool ) ,
thread_pool_owned_ ( thread_pool_owned ) ,
secure_ ( creds ! = nullptr ) {
if ( creds ) {
server_ =
grpc_secure_server_create ( creds - > GetRawCreds ( ) , cq_ . cq ( ) , nullptr ) ;
} else {
server_ = grpc_server_create ( cq_ . cq ( ) , nullptr ) ;
}
}
Server : : Server ( ) {
// Should not be called.
GPR_ASSERT ( false ) ;
}
Server : : ~ Server ( ) {
std : : unique_lock < std : : mutex > lock ( mu_ ) ;
if ( started_ & & ! shutdown_ ) {
lock . unlock ( ) ;
Shutdown ( ) ;
} else {
lock . unlock ( ) ;
}
grpc_server_destroy ( server_ ) ;
if ( thread_pool_owned_ ) {
delete thread_pool_ ;
}
}
bool Server : : RegisterService ( RpcService * service ) {
for ( int i = 0 ; i < service - > GetMethodCount ( ) ; + + i ) {
RpcServiceMethod * method = service - > GetMethod ( i ) ;
void * tag =
grpc_server_register_method ( server_ , method - > name ( ) , nullptr , cq_ . cq ( ) ) ;
if ( ! tag ) {
gpr_log ( GPR_DEBUG , " Attempt to register %s multiple times " ,
method - > name ( ) ) ;
return false ;
}
sync_methods_ . emplace_back ( method , tag ) ;
}
return true ;
}
bool Server : : RegisterAsyncService ( AsynchronousService * service ) {
GPR_ASSERT ( service - > dispatch_impl_ = = nullptr & &
" Can only register an asynchronous service against one server. " ) ;
service - > dispatch_impl_ = this ;
service - > request_args_ = new void * [ service - > method_count_ ] ;
for ( size_t i = 0 ; i < service - > method_count_ ; + + i ) {
void * tag =
grpc_server_register_method ( server_ , service - > method_names_ [ i ] , nullptr ,
service - > completion_queue ( ) - > cq ( ) ) ;
if ( ! tag ) {
gpr_log ( GPR_DEBUG , " Attempt to register %s multiple times " ,
service - > method_names_ [ i ] ) ;
return false ;
}
service - > request_args_ [ i ] = tag ;
}
return true ;
}
int Server : : AddPort ( const grpc : : string & addr ) {
GPR_ASSERT ( ! started_ ) ;
if ( secure_ ) {
return grpc_server_add_secure_http2_port ( server_ , addr . c_str ( ) ) ;
} else {
return grpc_server_add_http2_port ( server_ , addr . c_str ( ) ) ;
}
}
class Server : : SyncRequest final : public CompletionQueueTag {
public :
SyncRequest ( RpcServiceMethod * method , void * tag )
@ -243,6 +165,84 @@ class Server::SyncRequest final : public CompletionQueueTag {
grpc_completion_queue * cq_ ;
} ;
Server : : Server ( ThreadPoolInterface * thread_pool , bool thread_pool_owned ,
ServerCredentials * creds )
: started_ ( false ) ,
shutdown_ ( false ) ,
num_running_cb_ ( 0 ) ,
thread_pool_ ( thread_pool ) ,
thread_pool_owned_ ( thread_pool_owned ) ,
secure_ ( creds ! = nullptr ) {
if ( creds ) {
server_ =
grpc_secure_server_create ( creds - > GetRawCreds ( ) , cq_ . cq ( ) , nullptr ) ;
} else {
server_ = grpc_server_create ( cq_ . cq ( ) , nullptr ) ;
}
}
Server : : Server ( ) {
// Should not be called.
GPR_ASSERT ( false ) ;
}
Server : : ~ Server ( ) {
std : : unique_lock < std : : mutex > lock ( mu_ ) ;
if ( started_ & & ! shutdown_ ) {
lock . unlock ( ) ;
Shutdown ( ) ;
} else {
lock . unlock ( ) ;
}
grpc_server_destroy ( server_ ) ;
if ( thread_pool_owned_ ) {
delete thread_pool_ ;
}
}
bool Server : : RegisterService ( RpcService * service ) {
for ( int i = 0 ; i < service - > GetMethodCount ( ) ; + + i ) {
RpcServiceMethod * method = service - > GetMethod ( i ) ;
void * tag =
grpc_server_register_method ( server_ , method - > name ( ) , nullptr , cq_ . cq ( ) ) ;
if ( ! tag ) {
gpr_log ( GPR_DEBUG , " Attempt to register %s multiple times " ,
method - > name ( ) ) ;
return false ;
}
sync_methods_ . emplace_back ( method , tag ) ;
}
return true ;
}
bool Server : : RegisterAsyncService ( AsynchronousService * service ) {
GPR_ASSERT ( service - > dispatch_impl_ = = nullptr & &
" Can only register an asynchronous service against one server. " ) ;
service - > dispatch_impl_ = this ;
service - > request_args_ = new void * [ service - > method_count_ ] ;
for ( size_t i = 0 ; i < service - > method_count_ ; + + i ) {
void * tag =
grpc_server_register_method ( server_ , service - > method_names_ [ i ] , nullptr ,
service - > completion_queue ( ) - > cq ( ) ) ;
if ( ! tag ) {
gpr_log ( GPR_DEBUG , " Attempt to register %s multiple times " ,
service - > method_names_ [ i ] ) ;
return false ;
}
service - > request_args_ [ i ] = tag ;
}
return true ;
}
int Server : : AddPort ( const grpc : : string & addr ) {
GPR_ASSERT ( ! started_ ) ;
if ( secure_ ) {
return grpc_server_add_secure_http2_port ( server_ , addr . c_str ( ) ) ;
} else {
return grpc_server_add_http2_port ( server_ , addr . c_str ( ) ) ;
}
}
bool Server : : Start ( ) {
GPR_ASSERT ( ! started_ ) ;
started_ = true ;