Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
ingo Voss
OpenLDAP
Commits
5936f97e
Commit
5936f97e
authored
May 27, 1999
by
Kurt Zeilenga
Browse files
Make connection_first/next/done reentrant.
parent
984a98a8
Changes
3
Hide whitespace changes
Inline
Side-by-side
servers/slapd/connection.c
View file @
5936f97e
...
...
@@ -16,20 +16,19 @@
/* protected by connections_mutex */
static
ldap_pvt_thread_mutex_t
connections_mutex
;
static
Connection
*
connections
=
NULL
;
static
int
conn_index
=
-
1
;
static
long
conn_nextid
=
0
;
/* structure state (protected by connections_mutex) */
#define SLAP_C_UNINITIALIZED 0x0
/* MUST BE ZERO (0) */
#define SLAP_C_UNUSED 0x1
#define SLAP_C_USED 0x2
#define SLAP_C_UNINITIALIZED 0x0
0
/* MUST BE ZERO (0) */
#define SLAP_C_UNUSED 0x
0
1
#define SLAP_C_USED 0x
0
2
/* connection state (protected by c_mutex ) */
#define SLAP_C_INVALID 0x0
/* MUST BE ZERO (0) */
#define SLAP_C_INACTIVE 0x1
/* zero threads */
#define SLAP_C_ACTIVE 0x
2
/* one or more threads */
#define SLAP_C_BINDING 0x3
/* binding */
#define SLAP_C_CLOSING 0x4
/* closing */
#define SLAP_C_INVALID 0x0
0
/* MUST BE ZERO (0) */
#define SLAP_C_INACTIVE 0x
0
1
/* zero threads */
#define SLAP_C_ACTIVE 0x
02
/* one or more threads */
#define SLAP_C_BINDING 0x
0
3
/* binding */
#define SLAP_C_CLOSING 0x
0
4
/* closing */
void
slapd_remove
(
int
s
);
static
Connection
*
connection_get
(
int
s
);
...
...
@@ -50,8 +49,6 @@ struct co_arg {
*/
int
connections_init
(
void
)
{
int
i
;
assert
(
connections
==
NULL
);
if
(
connections
!=
NULL
)
{
...
...
@@ -72,6 +69,9 @@ int connections_init(void)
return
-
1
;
}
assert
(
connections
[
0
].
c_struct_state
==
SLAP_C_UNINITIALIZED
);
assert
(
connections
[
dtblsize
-
1
].
c_struct_state
==
SLAP_C_UNINITIALIZED
);
/*
* per entry initialization of the Connection array initialization
* will be done by connection_init()
...
...
@@ -137,6 +137,8 @@ int connections_shutdown(void)
static
Connection
*
connection_get
(
int
s
)
{
/* connections_mutex should be locked by caller */
Connection
*
c
=
NULL
;
assert
(
connections
!=
NULL
);
...
...
@@ -366,7 +368,8 @@ connection_destroy( Connection *c )
int
connection_state_closing
(
Connection
*
c
)
{
/* connection must be locked by caller */
/* c_mutex must be locked by caller */
int
state
;
assert
(
c
!=
NULL
);
assert
(
c
->
c_struct_state
==
SLAP_C_USED
);
...
...
@@ -385,6 +388,8 @@ void connection_closing( Connection *c )
assert
(
c
->
c_struct_state
==
SLAP_C_USED
);
assert
(
c
->
c_conn_state
!=
SLAP_C_INVALID
);
/* c_mutex must be locked by caller */
if
(
c
->
c_conn_state
!=
SLAP_C_CLOSING
)
{
Operation
*
o
;
...
...
@@ -428,7 +433,7 @@ static void connection_close( Connection *c )
assert
(
c
->
c_struct_state
==
SLAP_C_USED
);
assert
(
c
->
c_conn_state
==
SLAP_C_CLOSING
);
/* note: connections_mutex should be locked by caller */
/* note: connections_mutex
and c_mutex
should be locked by caller */
if
(
c
->
c_ops
!=
NULL
)
{
Debug
(
LDAP_DEBUG_TRACE
,
...
...
@@ -458,23 +463,23 @@ long connections_nextid(void)
return
id
;
}
Connection
*
connection_first
(
void
)
Connection
*
connection_first
(
int
*
index
)
{
assert
(
connections
!=
NULL
);
assert
(
index
!=
NULL
);
ldap_pvt_thread_mutex_lock
(
&
connections_mutex
);
assert
(
conn_index
==
-
1
);
conn_index
=
0
;
*
index
=
0
;
return
connection_next
(
NULL
);
return
connection_next
(
NULL
,
index
);
}
Connection
*
connection_next
(
Connection
*
c
)
Connection
*
connection_next
(
Connection
*
c
,
int
*
index
)
{
assert
(
connections
!=
NULL
);
assert
(
conn_
index
!=
-
1
);
assert
(
conn_
index
<=
dtblsize
);
assert
(
index
!=
NULL
);
assert
(
*
index
<=
dtblsize
);
if
(
c
!=
NULL
)
{
ldap_pvt_thread_mutex_unlock
(
&
c
->
c_mutex
);
...
...
@@ -482,9 +487,9 @@ Connection* connection_next(Connection *c)
c
=
NULL
;
for
(;
conn_
index
<
dtblsize
;
conn_
index
++
)
{
if
(
connections
[
conn_
index
].
c_struct_state
==
SLAP_C_UNINITIALIZED
)
{
assert
(
connections
[
conn_
index
].
c_conn_state
==
SLAP_C_INVALID
);
for
(;
*
index
<
dtblsize
;
(
*
index
)
++
)
{
if
(
connections
[
*
index
].
c_struct_state
==
SLAP_C_UNINITIALIZED
)
{
assert
(
connections
[
*
index
].
c_conn_state
==
SLAP_C_INVALID
);
#ifndef HAVE_WINSOCK
continue
;
#else
...
...
@@ -492,14 +497,14 @@ Connection* connection_next(Connection *c)
#endif
}
if
(
connections
[
conn_
index
].
c_struct_state
==
SLAP_C_USED
)
{
assert
(
connections
[
conn_
index
].
c_conn_state
!=
SLAP_C_INVALID
);
c
=
&
connections
[
conn_
index
++
];
if
(
connections
[
*
index
].
c_struct_state
==
SLAP_C_USED
)
{
assert
(
connections
[
*
index
].
c_conn_state
!=
SLAP_C_INVALID
);
c
=
&
connections
[
(
*
index
)
++
];
break
;
}
assert
(
connections
[
conn_
index
].
c_struct_state
==
SLAP_C_UNUSED
);
assert
(
connections
[
conn_
index
].
c_conn_state
==
SLAP_C_INVALID
);
assert
(
connections
[
*
index
].
c_struct_state
==
SLAP_C_UNUSED
);
assert
(
connections
[
*
index
].
c_conn_state
==
SLAP_C_INVALID
);
}
if
(
c
!=
NULL
)
{
...
...
@@ -509,17 +514,14 @@ Connection* connection_next(Connection *c)
return
c
;
}
void
connection_done
(
Connection
*
c
)
void
connection_done
(
Connection
*
c
)
{
assert
(
connections
!=
NULL
);
assert
(
conn_index
!=
-
1
);
assert
(
conn_index
<=
dtblsize
);
if
(
c
!=
NULL
)
{
ldap_pvt_thread_mutex_unlock
(
&
c
->
c_mutex
);
}
conn_index
=
-
1
;
ldap_pvt_thread_mutex_unlock
(
&
connections_mutex
);
}
...
...
servers/slapd/monitor.c
View file @
5936f97e
...
...
@@ -37,6 +37,7 @@ monitor_info( Connection *conn, Operation *op )
int
i
;
char
buf2
[
22
]
Connection
*
c
;
int
connindex
;
#endif
time_t
currenttime
;
...
...
@@ -71,7 +72,10 @@ monitor_info( Connection *conn, Operation *op )
#ifdef LDAP_COUNTERS
/* loop through the connections */
for
(
c
=
connection_first
()
;
c
!=
NULL
;
c
=
connection_next
(
c
)
)
{
for
(
c
=
connection_first
(
&
connindex
);
c
!=
NULL
;
c
=
connection_next
(
c
,
&
connindex
))
{
nconns
++
;
if
(
c
->
c_writewaiter
)
{
nwritewaiters
++
;
...
...
servers/slapd/proto-slap.h
View file @
5936f97e
...
...
@@ -129,8 +129,8 @@ int connection_read LDAP_P((int s));
long
connections_nextid
(
void
);
Connection
*
connection_first
LDAP_P
((
void
));
Connection
*
connection_next
LDAP_P
((
Connection
*
));
Connection
*
connection_first
LDAP_P
((
int
*
));
Connection
*
connection_next
LDAP_P
((
Connection
*
,
int
*
));
void
connection_done
LDAP_P
((
Connection
*
));
/*
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment