Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 24 additions & 9 deletions src/brpc/server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -743,6 +743,12 @@ struct RevertServerStatus {
}
};

struct DummyServerStopper {
~DummyServerStopper() {
StopDummyServer();
}
};

static int get_port_from_fd(int fd) {
struct sockaddr_in addr;
socklen_t size = sizeof(addr);
Expand Down Expand Up @@ -1925,16 +1931,18 @@ void Server::PrintTabsBody(std::ostream& os,
}

static pthread_mutex_t g_dummy_server_mutex = PTHREAD_MUTEX_INITIALIZER;
static Server* g_dummy_server = NULL;
static std::atomic<Server*> g_dummy_server{nullptr};
static DummyServerStopper g_dummy_server_stopper;

int StartDummyServerAt(int port, ProfilerLinker) {
if (port < 0 || port >= 65536) {
LOG(ERROR) << "Invalid port=" << port;
return -1;
}
if (g_dummy_server == NULL) { // (1)

if (g_dummy_server.load(std::memory_order_acquire) == nullptr) {
BAIDU_SCOPED_LOCK(g_dummy_server_mutex);
if (g_dummy_server == NULL) {
if (g_dummy_server.load(std::memory_order_acquire) == nullptr) {
Server* dummy_server = new Server;
dummy_server->set_version(butil::string_printf(
"DummyServerOf(%s)", GetProgramName()));
Expand All @@ -1945,20 +1953,27 @@ int StartDummyServerAt(int port, ProfilerLinker) {
LOG(ERROR) << "Fail to start dummy_server at port=" << port;
return -1;
}
// (1) may see uninitialized dummy_server due to relaxed memory
// fencing, but we only expose a function to test existence
// of g_dummy_server, everything should be fine.
g_dummy_server = dummy_server;

g_dummy_server.store(dummy_server, std::memory_order_release);
return 0;
}
}
LOG(ERROR) << "Already have dummy_server at port="
<< g_dummy_server->listen_address().port;
<< g_dummy_server.load()->listen_address().port;
return -1;
}

int StopDummyServer() {
if (auto p = g_dummy_server.load(std::memory_order_acquire)) {
p->Stop(0);
p->Join();
g_dummy_server = nullptr;
}
return 0;
}

bool IsDummyServerRunning() {
return g_dummy_server != NULL;
return g_dummy_server != nullptr;
}

const Server::MethodProperty*
Expand Down
3 changes: 3 additions & 0 deletions src/brpc/server.h
Original file line number Diff line number Diff line change
Expand Up @@ -813,6 +813,9 @@ bool IsDummyServerRunning();
// Returns 0 on success, -1 otherwise.
int StartDummyServerAt(int port, ProfilerLinker = ProfilerLinker());

// Stop the dummy server.
int StopDummyServer();

} // namespace brpc

#endif // BRPC_SERVER_H
Loading