ITS#6111 connection_state_closing() -> connection_valid()

This commit is contained in:
Howard Chu 2009-05-14 04:03:23 +00:00
parent 29be892cc1
commit aa9e241581
3 changed files with 21 additions and 21 deletions

View file

@ -53,18 +53,22 @@ static unsigned long conn_nextid = 0;
static const char conn_lost_str[] = "connection lost"; static const char conn_lost_str[] = "connection lost";
/* structure state (protected by connections_mutex) */ /* structure state (protected by connections_mutex) */
#define SLAP_C_UNINITIALIZED 0x00 /* MUST BE ZERO (0) */ enum sc_struct_state {
#define SLAP_C_UNUSED 0x01 SLAP_C_UNINITIALIZED = 0, /* MUST BE ZERO (0) */
#define SLAP_C_USED 0x02 SLAP_C_UNUSED,
#define SLAP_C_PENDING 0x03 SLAP_C_USED,
SLAP_C_PENDING
};
/* connection state (protected by c_mutex ) */ /* connection state (protected by c_mutex ) */
#define SLAP_C_INVALID 0x00 /* MUST BE ZERO (0) */ enum sc_conn_state {
#define SLAP_C_INACTIVE 0x01 /* zero threads */ SLAP_C_INVALID = 0, /* MUST BE ZERO (0) */
#define SLAP_C_ACTIVE 0x02 /* one or more threads */ SLAP_C_INACTIVE, /* zero threads */
#define SLAP_C_BINDING 0x03 /* binding */ SLAP_C_CLOSING, /* closing */
#define SLAP_C_CLOSING 0x04 /* closing */ SLAP_C_ACTIVE, /* one or more threads */
#define SLAP_C_CLIENT 0x05 /* outbound client conn */ SLAP_C_BINDING, /* binding */
SLAP_C_CLIENT /* outbound client conn */
};
const char * const char *
connection_state2str( int state ) connection_state2str( int state )
@ -72,9 +76,9 @@ connection_state2str( int state )
switch( state ) { switch( state ) {
case SLAP_C_INVALID: return "!"; case SLAP_C_INVALID: return "!";
case SLAP_C_INACTIVE: return "|"; case SLAP_C_INACTIVE: return "|";
case SLAP_C_CLOSING: return "C";
case SLAP_C_ACTIVE: return ""; case SLAP_C_ACTIVE: return "";
case SLAP_C_BINDING: return "B"; case SLAP_C_BINDING: return "B";
case SLAP_C_CLOSING: return "C";
case SLAP_C_CLIENT: return "L"; case SLAP_C_CLIENT: return "L";
} }
@ -695,19 +699,15 @@ connection_destroy( Connection *c )
} }
} }
int connection_state_closing( Connection *c ) int connection_valid( Connection *c )
{ {
/* c_mutex must be locked by caller */ /* c_mutex must be locked by caller */
int state;
assert( c != NULL ); assert( c != NULL );
assert( c->c_struct_state == SLAP_C_USED );
state = c->c_conn_state; return c->c_struct_state == SLAP_C_USED &&
c->c_conn_state >= SLAP_C_ACTIVE &&
assert( state != SLAP_C_INVALID ); c->c_conn_state <= SLAP_C_CLIENT;
return state == SLAP_C_CLOSING;
} }
static void connection_abandon( Connection *c ) static void connection_abandon( Connection *c )

View file

@ -759,7 +759,7 @@ LDAP_SLAPD_F (Connection *) connection_init LDAP_P((
LDAP_SLAPD_F (void) connection_closing LDAP_P(( LDAP_SLAPD_F (void) connection_closing LDAP_P((
Connection *c, const char *why )); Connection *c, const char *why ));
LDAP_SLAPD_F (void) connection_hangup LDAP_P(( ber_socket_t fd )); LDAP_SLAPD_F (void) connection_hangup LDAP_P(( ber_socket_t fd ));
LDAP_SLAPD_F (int) connection_state_closing LDAP_P(( Connection *c )); LDAP_SLAPD_F (int) connection_valid LDAP_P(( Connection *c ));
LDAP_SLAPD_F (const char *) connection_state2str LDAP_P(( int state )) LDAP_SLAPD_F (const char *) connection_state2str LDAP_P(( int state ))
LDAP_GCCATTR((const)); LDAP_GCCATTR((const));

View file

@ -145,7 +145,7 @@ static long send_ldap_ber(
/* write only one pdu at a time - wait til it's our turn */ /* write only one pdu at a time - wait til it's our turn */
ldap_pvt_thread_mutex_lock( &conn->c_write1_mutex ); ldap_pvt_thread_mutex_lock( &conn->c_write1_mutex );
if (( op->o_abandon && !op->o_cancel ) || connection_state_closing( conn )) { if (( op->o_abandon && !op->o_cancel ) || !connection_valid( conn )) {
ldap_pvt_thread_mutex_unlock( &conn->c_write1_mutex ); ldap_pvt_thread_mutex_unlock( &conn->c_write1_mutex );
return 0; return 0;
} }