]> git.sur5r.net Git - openldap/blob - servers/slapd/back-monitor/thread.c
b1e05f29d6de1dce20d2c9ae0f72bb8bf37b94d0
[openldap] / servers / slapd / back-monitor / thread.c
1 /* thread.c - deal with thread subsystem */
2 /*
3  * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
4  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
5  */
6 /*
7  * Copyright 2001 The OpenLDAP Foundation, All Rights Reserved.
8  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
9  * 
10  * Copyright 2001, Pierangelo Masarati, All rights reserved. <ando@sys-net.it>
11  * 
12  * This work has beed deveolped for the OpenLDAP Foundation 
13  * in the hope that it may be useful to the Open Source community, 
14  * but WITHOUT ANY WARRANTY.
15  * 
16  * Permission is granted to anyone to use this software for any purpose
17  * on any computer system, and to alter it and redistribute it, subject
18  * to the following restrictions:
19  * 
20  * 1. The author and SysNet s.n.c. are not responsible for the consequences
21  *    of use of this software, no matter how awful, even if they arise from
22  *    flaws in it.
23  * 
24  * 2. The origin of this software must not be misrepresented, either by
25  *    explicit claim or by omission.  Since few users ever read sources,
26  *    credits should appear in the documentation.
27  * 
28  * 3. Altered versions must be plainly marked as such, and must not be
29  *    misrepresented as being the original software.  Since few users
30  *    ever read sources, credits should appear in the documentation.
31  *    SysNet s.n.c. cannot be responsible for the consequences of the
32  *    alterations.
33  * 
34  * 4. This notice may not be removed or altered.
35  */
36
37 #include "portable.h"
38
39 #include <stdio.h>
40
41 #include "slap.h"
42 #include "back-monitor.h"
43
44 /*
45 *  * initializes log subentry
46 *   */
47 int
48 monitor_subsys_thread_init(
49         BackendDB       *be
50 )
51 {
52         struct monitorinfo      *mi;
53         Entry                   *e;
54         struct monitorentrypriv *mp;
55         struct berval           val, *bv[2] = { &val, NULL };
56         static char             buf[1024];
57
58         mi = ( struct monitorinfo * )be->be_private;
59
60         if ( monitor_cache_get( mi, 
61                                 monitor_subsys[SLAPD_MONITOR_THREAD].mss_ndn,
62                                 &e ) ) {
63 #ifdef NEW_LOGGING
64                 LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
65                                         "monitor_subsys_thread_init: "
66                                         "unable to get entry '%s'\n",
67                                         monitor_subsys[SLAPD_MONITOR_THREAD].mss_ndn ));
68 #else
69                 Debug( LDAP_DEBUG_ANY,
70                                 "monitor_subsys_thread_init: "
71                                 "unable to get entry '%s'\n%s%s",
72                                 monitor_subsys[SLAPD_MONITOR_THREAD].mss_ndn,
73                                 "", "" );
74 #endif
75                 return( -1 );
76         }
77
78         /* initialize the thread number */
79         snprintf( buf, sizeof( buf ), "max=%d", connection_pool_max );
80
81         val.bv_val = buf;
82         val.bv_len = strlen( val.bv_val );
83
84         attr_merge( e, monitor_ad_desc, bv );
85
86         monitor_cache_release( mi, e );
87
88         return( 0 );
89 }
90
91 int 
92 monitor_subsys_thread_update( 
93         struct monitorinfo      *mi,
94         Entry                   *e
95 )
96 {
97         Attribute               *a;
98         struct berval           *bv[2], val, **b = NULL;
99         char                    buf[1024];
100
101         bv[0] = &val;
102         bv[1] = NULL;
103
104         snprintf( buf, sizeof( buf ), "backload=%d", 
105                         ldap_pvt_thread_pool_backload( &connection_pool ) );
106
107         if ( ( a = attr_find( e->e_attrs, monitor_ad_desc ) ) != NULL ) {
108
109                 for ( b = a->a_vals; b[0] != NULL; b++ ) {
110                         if ( strncmp( b[0]->bv_val, "backload=", 
111                                         sizeof( "backload=" ) - 1 ) == 0 ) {
112                                 ber_bvfree( b[0] );
113                                 b[0] = ber_bvstrdup( buf );
114                                 break;
115                         }
116                 }
117         }
118
119         if ( b == NULL || b[0] == NULL ) {
120                 val.bv_val = buf;
121                 val.bv_len = strlen( buf );
122                 attr_merge( e, monitor_ad_desc, bv );
123         }
124
125         return( 0 );
126 }
127