X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fconnection.c;h=766ca439bf0ce53f5c10611bfe00a655a4ff1c87;hb=f8fb4aca7668c722f41941be719203aa8c298e12;hp=96236b04b0eb6393aa14e4f5d9e45efc99d56ed6;hpb=2f3399265caf72d81ba192a86d63a7a96b0c837b;p=openldap diff --git a/servers/slapd/connection.c b/servers/slapd/connection.c index 96236b04b0..766ca439bf 100644 --- a/servers/slapd/connection.c +++ b/servers/slapd/connection.c @@ -1,6 +1,6 @@ /* $OpenLDAP$ */ /* - * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ @@ -417,7 +417,8 @@ long connection_init( c->c_dn.bv_len = 0; c->c_ndn.bv_val = NULL; c->c_ndn.bv_len = 0; - c->c_cdn = NULL; + c->c_cdn.bv_val = NULL; + c->c_cdn.bv_len = 0; c->c_groups = NULL; c->c_listener_url = NULL; @@ -425,8 +426,8 @@ long connection_init( c->c_peer_name = NULL; c->c_sock_name = NULL; - c->c_ops = NULL; - c->c_pending_ops = NULL; + LDAP_STAILQ_INIT(&c->c_ops); + LDAP_STAILQ_INIT(&c->c_pending_ops); c->c_sasl_bind_mech = NULL; c->c_sasl_context = NULL; @@ -455,14 +456,14 @@ long connection_init( assert( c->c_authmech == NULL ); assert( c->c_dn.bv_val == NULL ); assert( c->c_ndn.bv_val == NULL ); - assert( c->c_cdn == NULL ); + assert( c->c_cdn.bv_val == NULL ); assert( c->c_groups == NULL ); assert( c->c_listener_url == NULL ); assert( c->c_peer_domain == NULL ); assert( c->c_peer_name == NULL ); assert( c->c_sock_name == NULL ); - assert( c->c_ops == NULL ); - assert( c->c_pending_ops == NULL ); + assert( LDAP_STAILQ_EMPTY(&c->c_ops) ); + assert( LDAP_STAILQ_EMPTY(&c->c_pending_ops) ); assert( c->c_sasl_bind_mech == NULL ); assert( c->c_sasl_context == NULL ); assert( c->c_sasl_extra == NULL ); @@ -504,6 +505,8 @@ long connection_init( #endif ber_sockbuf_add_io( c->c_sb, &ber_sockbuf_io_udp, LBER_SBIOD_LEVEL_PROVIDER, (void *)&s ); + ber_sockbuf_add_io( c->c_sb, &ber_sockbuf_io_readahead, + LBER_SBIOD_LEVEL_PROVIDER, NULL ); } else #endif { @@ -514,8 +517,6 @@ long connection_init( ber_sockbuf_add_io( c->c_sb, &ber_sockbuf_io_tcp, LBER_SBIOD_LEVEL_PROVIDER, (void *)&s ); } - ber_sockbuf_add_io( c->c_sb, &ber_sockbuf_io_readahead, - LBER_SBIOD_LEVEL_PROVIDER, NULL ); #ifdef LDAP_DEBUG ber_sockbuf_add_io( c->c_sb, &ber_sockbuf_io_debug, @@ -591,10 +592,11 @@ void connection2anonymous( Connection *c ) } c->c_ndn.bv_len = 0; - if(c->c_cdn != NULL) { - free(c->c_cdn); - c->c_cdn = NULL; + if(c->c_cdn.bv_val != NULL) { + free(c->c_cdn.bv_val); + c->c_cdn.bv_val = NULL; } + c->c_cdn.bv_len = 0; c->c_authc_backend = NULL; c->c_authz_backend = NULL; @@ -621,7 +623,7 @@ connection_destroy( Connection *c ) assert( c != NULL ); assert( c->c_struct_state != SLAP_C_UNUSED ); assert( c->c_conn_state != SLAP_C_INVALID ); - assert( c->c_ops == NULL ); + assert( LDAP_STAILQ_EMPTY(&c->c_ops) ); backend_connection_destroy(c); @@ -720,17 +722,16 @@ static void connection_abandon( Connection *c ) Operation *o; - for( o = c->c_ops; o != NULL; o = o->o_next ) { + LDAP_STAILQ_FOREACH(o, &c->c_ops, o_next) { ldap_pvt_thread_mutex_lock( &o->o_abandonmutex ); o->o_abandon = 1; ldap_pvt_thread_mutex_unlock( &o->o_abandonmutex ); } /* remove pending operations */ - for( o = slap_op_pop( &c->c_pending_ops ); - o != NULL; - o = slap_op_pop( &c->c_pending_ops ) ) - { + while ( (o = LDAP_STAILQ_FIRST( &c->c_pending_ops )) != NULL) { + LDAP_STAILQ_REMOVE_HEAD( &c->c_pending_ops, o_next ); + LDAP_STAILQ_NEXT(o, o_next) = NULL; slap_op_free( o ); } } @@ -784,7 +785,7 @@ static void connection_close( Connection *c ) /* note: connections_mutex and c_mutex should be locked by caller */ ber_sockbuf_ctrl( c->c_sb, LBER_SB_OPT_GET_FD, &sd ); - if( c->c_ops != NULL ) { + if( !LDAP_STAILQ_EMPTY(&c->c_ops) ) { #ifdef NEW_LOGGING LDAP_LOG(( "connection", LDAP_LEVEL_DETAIL1, "connection_close: conn %d deferring sd %d\n", @@ -987,7 +988,8 @@ operations_error: conn->c_n_ops_executing--; conn->c_n_ops_completed++; - slap_op_remove( &conn->c_ops, arg->co_op ); + LDAP_STAILQ_REMOVE( &conn->c_ops, arg->co_op, slap_op, o_next); + LDAP_STAILQ_NEXT(arg->co_op, o_next) = NULL; slap_op_free( arg->co_op ); arg->co_op = NULL; arg->co_conn = NULL; @@ -1351,7 +1353,7 @@ connection_input( Debug( LDAP_DEBUG_ANY, "deferring operation\n", 0, 0, 0 ); #endif conn->c_n_ops_pending++; - slap_op_add( &conn->c_pending_ops, op ); + LDAP_STAILQ_INSERT_TAIL( &conn->c_pending_ops, op, o_next ); } else { conn->c_n_ops_executing++; @@ -1434,10 +1436,9 @@ connection_resched( Connection *conn ) return 0; } - for( op = slap_op_pop( &conn->c_pending_ops ); - op != NULL; - op = slap_op_pop( &conn->c_pending_ops ) ) - { + while ((op = LDAP_STAILQ_FIRST( &conn->c_pending_ops )) != NULL) { + LDAP_STAILQ_REMOVE_HEAD( &conn->c_pending_ops, o_next ); + LDAP_STAILQ_NEXT(op, o_next) = NULL; /* pending operations should not be marked for abandonment */ assert(!op->o_abandon); @@ -1484,7 +1485,7 @@ static int connection_op_activate( Connection *conn, Operation *op ) } arg->co_op->o_connid = conn->c_connid; - slap_op_add( &conn->c_ops, arg->co_op ); + LDAP_STAILQ_INSERT_TAIL( &conn->c_ops, arg->co_op, o_next ); status = ldap_pvt_thread_pool_submit( &connection_pool, connection_operation, (void *) arg ); @@ -1587,9 +1588,8 @@ int connection_internal_open( Connection **conn, LDAP **ldp, const char *id ) op->o_protocol = LDAP_VERSION3; (*conn) = connection_get( fd[1] ); - (*conn)->c_ops = op; - (*conn)->c_conn_state = SLAP_C_ACTIVE; - + LDAP_STAILQ_INSERT_HEAD( &(*conn)->c_ops, op, o_next); + (*conn)->c_conn_state = SLAP_C_ACTIVE; /* Create the client side of the connection */ rc = ldap_open_internal_connection( ldp, &(fd[0]) ); @@ -1607,9 +1607,10 @@ int connection_internal_open( Connection **conn, LDAP **ldp, const char *id ) void connection_internal_close( Connection *conn ) { - Operation *op = conn->c_ops; + Operation *op = LDAP_STAILQ_FIRST(&conn->c_ops); - slap_op_remove( &conn->c_ops, op ); + LDAP_STAILQ_REMOVE_HEAD(&conn->c_ops, o_next); + LDAP_STAILQ_NEXT(op, o_next) = NULL; slap_op_free( op ); connection_closing( conn ); connection_close( conn );