Skip to content

Commit fb31cf9

Browse files
committed
#bugfix: some android devices socket.select wake up compatible.
1 parent d5816ee commit fb31cf9

File tree

2 files changed

+7
-27
lines changed

2 files changed

+7
-27
lines changed

src/async_tcp_client.cpp

+7-24
Original file line numberDiff line numberDiff line change
@@ -242,12 +242,12 @@ void async_tcp_client::service()
242242

243243

244244
// event loop
245-
// fd_set fdss[3];
245+
fd_set fdss[3];
246246
timeval timeout;
247247

248248
for (; !app_exiting_;)
249249
{
250-
set_descriptors(); // memcpy(&fdss, fdss_, sizeof(fdss_));
250+
::memcpy(&fdss, fdss_, sizeof(fdss_));
251251

252252
// @pitfall: If still have data to read, only wait 1 millseconds.
253253
get_wait_duration(timeout, this->offset_ > 0 ? MAX_BUSY_DELAY : MAX_WAIT_DURATION);
@@ -265,8 +265,6 @@ void async_tcp_client::service()
265265
if (ec == EBADF || !this->impl_.is_open()) {
266266
goto _L_error;
267267
}
268-
269-
clear_descriptors();
270268
continue; // try select again.
271269
}
272270

@@ -309,8 +307,6 @@ void async_tcp_client::service()
309307
}
310308
}
311309

312-
clear_descriptors();
313-
314310
/*if (this->p2p_channel1_.connected_) {
315311
if (!do_write(&p2p_channel1_))
316312
p2p_channel1_.reset();
@@ -386,18 +382,6 @@ void async_tcp_client::handle_error(void)
386382
interrupter_.reset();
387383
}
388384

389-
void async_tcp_client::set_descriptors()
390-
{
391-
FD_SET(this->impl_, &fdss_[read_op]);
392-
FD_SET(this->interrupter_.read_descriptor(), &fdss_[read_op]);
393-
}
394-
395-
void async_tcp_client::clear_descriptors()
396-
{
397-
FD_CLR(this->impl_, &fdss_[read_op]);
398-
FD_CLR(this->interrupter_.read_descriptor(), &fdss_[read_op]);
399-
}
400-
401385
void async_tcp_client::register_descriptor(const socket_native_type fd, int flags)
402386
{
403387
if ((flags & socket_event_read) != 0)
@@ -415,7 +399,8 @@ void async_tcp_client::register_descriptor(const socket_native_type fd, int flag
415399
FD_SET(fd, &(fdss_[except_op]));
416400
}
417401

418-
maxfdp_ = static_cast<int>(fd) + 1;
402+
if(maxfdp_ < static_cast<int>(fd) + 1)
403+
maxfdp_ = static_cast<int>(fd) + 1;
419404
}
420405

421406
void async_tcp_client::unregister_descriptor(const socket_native_type fd, int flags)
@@ -493,10 +478,8 @@ bool async_tcp_client::connect(void)
493478
FD_ZERO(&fdss_[write_op]);
494479
FD_ZERO(&fdss_[except_op]);
495480

496-
INET_LOG("interrupter readfd:%d", interrupter_.read_descriptor());
497-
498-
//register_descriptor(interrupter_.read_descriptor(), socket_event_read);
499-
//register_descriptor(impl_.native_handle(), socket_event_read | socket_event_except);
481+
register_descriptor(interrupter_.read_descriptor(), socket_event_read);
482+
register_descriptor(impl_.native_handle(), socket_event_read);
500483

501484
impl_.set_nonblocking(true);
502485

@@ -508,7 +491,7 @@ bool async_tcp_client::connect(void)
508491

509492
this->impl_.set_optval(SOL_SOCKET, SO_REUSEADDR, 1); // set opt for p2p
510493

511-
INET_LOG("connect server: %s:%u succeed.", address_.c_str(), port_);
494+
INET_LOG("connect server: %s:%u succeed, fd=%d interrupterfd=%d", address_.c_str(), port_, impl_.native_handle(), interrupter_.read_descriptor());
512495

513496
#if 0 // provided as API
514497
auto endp = this->impl_.local_endpoint();

src/async_tcp_client.h

-3
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,6 @@ namespace purelib {
188188

189189
void get_wait_duration(timeval& tv, long long usec);
190190

191-
void set_descriptors();
192-
void clear_descriptors();
193-
194191
void register_descriptor(const socket_native_type fd, int flags);
195192
void unregister_descriptor(const socket_native_type fd, int flags);
196193

0 commit comments

Comments
 (0)