Commit c9ca519c authored by Howard Chu's avatar Howard Chu Committed by Quanah Gibson-Mount
Browse files

ITS#7167 only poll sockets for write as needed

parent 5432ce3b
......@@ -624,6 +624,7 @@ LDAP_F (void) ldap_free_select_info( void *sip );
LDAP_F (void) ldap_mark_select_write( LDAP *ld, Sockbuf *sb );
LDAP_F (void) ldap_mark_select_read( LDAP *ld, Sockbuf *sb );
LDAP_F (void) ldap_mark_select_clear( LDAP *ld, Sockbuf *sb );
LDAP_F (void) ldap_clear_select_write( LDAP *ld, Sockbuf *sb );
LDAP_F (int) ldap_is_read_ready( LDAP *ld, Sockbuf *sb );
LDAP_F (int) ldap_is_write_ready( LDAP *ld, Sockbuf *sb );
......
......@@ -344,7 +344,6 @@ ldap_init_fd(
/* Add the connection to the *LDAP's select pool */
ldap_mark_select_read( ld, conn->lconn_sb );
ldap_mark_select_write( ld, conn->lconn_sb );
*ldp = ld;
return LDAP_SUCCESS;
......@@ -502,7 +501,6 @@ ldap_open_internal_connection( LDAP **ldp, ber_socket_t *fdp )
/* Add the connection to the *LDAP's select pool */
ldap_mark_select_read( ld, c->lconn_sb );
ldap_mark_select_write( ld, c->lconn_sb );
/* Make this connection an LDAP V3 protocol connection */
rc = LDAP_VERSION3;
......
......@@ -966,6 +966,32 @@ ldap_mark_select_clear( LDAP *ld, Sockbuf *sb )
#endif
}
void
ldap_clear_select_write( LDAP *ld, Sockbuf *sb )
{
struct selectinfo *sip;
ber_socket_t sd;
sip = (struct selectinfo *)ld->ld_selectinfo;
ber_sockbuf_ctrl( sb, LBER_SB_OPT_GET_FD, &sd );
#ifdef HAVE_POLL
/* for UNIX poll(2) */
{
int i;
for(i=0; i < sip->si_maxfd; i++) {
if( sip->si_fds[i].fd == sd ) {
sip->si_fds[i].events &= ~POLL_WRITE;
}
}
}
#else
/* for UNIX select(2) */
FD_CLR( sd, &sip->si_writefds );
#endif
}
int
ldap_is_write_ready( LDAP *ld, Sockbuf *sb )
......
......@@ -202,6 +202,7 @@ ldap_int_flush_request(
/* sent -- waiting for a response */
ldap_mark_select_read( ld, lc->lconn_sb );
ldap_clear_select_write( ld, lc->lconn_sb );
}
return 0;
}
......
......@@ -302,7 +302,7 @@ wait4msg(
if ( ber_sockbuf_ctrl( lc->lconn_sb,
LBER_SB_OPT_DATA_READY, NULL ) )
{
lc_ready = 1;
lc_ready = 2; /* ready at ber level, not socket level */
break;
}
}
......@@ -373,8 +373,8 @@ wait4msg(
}
}
LDAP_MUTEX_UNLOCK( &ld->ld_req_mutex );
/* Quit looping if no one handled any events */
if (!serviced)
/* Quit looping if no one handled any socket events */
if (!serviced && lc_ready == 1)
rc = -1;
}
LDAP_MUTEX_UNLOCK( &ld->ld_conn_mutex );
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment