Changeset 543
- Timestamp:
- 12/27/06 18:28:52 (2 years ago)
- Files:
-
- cherokee/trunk/ChangeLog (modified) (1 diff)
- cherokee/trunk/cherokee/access.c (modified) (1 diff)
- cherokee/trunk/cherokee/common-internal.h (modified) (2 diffs)
- cherokee/trunk/cherokee/resolv_cache.c (modified) (3 diffs)
- cherokee/trunk/cherokee/resolv_cache.h (modified) (2 diffs)
- cherokee/trunk/cherokee/source.c (modified) (4 diffs)
- cherokee/trunk/qa/run-tests.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
cherokee/trunk/ChangeLog
r541 r543 1 2006-12-27 Alvaro Lopez Ortega <alvaro@alobbs.com> 2 3 * cherokee/access.c (cherokee_access_add_domain): Updated to fit 4 the latest resolv cache changes. 5 6 * cherokee/source.c (cherokee_source_connect): Now it uses the 7 resolv cache rather that a plain call to 8 cherokee_socket_gethostbyname(). It speeds up *cgi connections 9 about a 15-20%. 10 11 * cherokee/resolv_cache.h, cherokee/resolv_cache.c: Many changes 12 along the code: fixes and improvements. Added a new method as 13 well. 14 15 * cherokee/common-internal.h (CHEROKEE_RWLOCK_T, 16 CHEROKEE_MUTEX_T): Added new macros. 17 1 18 2006-12-26 Alvaro Lopez Ortega <alvaro@alobbs.com> 2 19 cherokee/trunk/cherokee/access.c
r533 r543 339 339 if (unlikely(ret!=ret_ok)) return ret; 340 340 341 ret = cherokee_resolv_cache_ resolve(resolv, domain, &ip);341 ret = cherokee_resolv_cache_get_ipstr (resolv, domain, &ip); 342 342 if (unlikely(ret!=ret_ok)) return ret; 343 343 cherokee/trunk/cherokee/common-internal.h
r333 r543 83 83 84 84 #ifdef HAVE_PTHREAD 85 # define CHEROKEE_MUTEX_T(n) pthread_mutex_t n 86 # define CHEROKEE_RWLOCK_T(n) pthread_rwlock_t n 87 85 88 # define CHEROKEE_MUTEX_LOCK(m) pthread_mutex_lock(m) 86 89 # define CHEROKEE_MUTEX_UNLOCK(m) pthread_mutex_unlock(m) … … 97 100 # define CHEROKEE_RWLOCK_DESTROY(m) pthread_rwlock_destroy(m) 98 101 #else 102 # define CHEROKEE_MUTEX_T(n) 103 # define CHEROKEE_RWLOCK_T(n) 104 99 105 # define CHEROKEE_MUTEX_LOCK(m) 100 106 # define CHEROKEE_MUTEX_UNLOCK(m) cherokee/trunk/cherokee/resolv_cache.c
r269 r543 37 37 38 38 39 typedef struct { 40 struct in_addr addr; 41 cherokee_buffer_t ip_str; 42 } cherokee_resolv_cache_entry_t; 43 39 44 struct cherokee_resolv_cache { 40 cherokee_table_t table; 41 42 #ifdef HAVE_PTHREAD 43 pthread_rwlock_t lock; 44 #endif 45 cherokee_table_t table; 46 CHEROKEE_RWLOCK_T(lock); 45 47 }; 46 48 47 48 49 static cherokee_resolv_cache_t *__global_resolv = NULL; 49 50 50 51 52 /* Entries 53 */ 54 static ret_t 55 entry_new (cherokee_resolv_cache_entry_t **entry) 56 { 57 CHEROKEE_NEW_STRUCT(n, resolv_cache_entry); 58 59 cherokee_buffer_init (&n->ip_str); 60 memset (&n->addr, 0, sizeof(n->addr)); 61 62 *entry = n; 63 return ret_ok; 64 } 65 66 67 static void 68 entry_free (void *entry) 69 { 70 cherokee_resolv_cache_entry_t *e = entry; 71 72 cherokee_buffer_mrproper (&e->ip_str); 73 free(entry); 74 } 75 76 77 static ret_t 78 entry_fill_up (cherokee_resolv_cache_entry_t *entry, const char *domain) 79 { 80 ret_t ret; 81 char *tmp; 82 83 ret = cherokee_gethostbyname (domain, &entry->addr); 84 if (unlikely (ret != ret_ok)) return ret; 85 86 tmp = inet_ntoa (entry->addr); 87 if (tmp == NULL) return ret; 88 89 cherokee_buffer_add (&entry->ip_str, tmp, strlen(tmp)); 90 return ret_ok; 91 } 92 93 94 95 /* Table 96 */ 51 97 ret_t 52 98 cherokee_resolv_cache_init (cherokee_resolv_cache_t *resolv) 53 99 { 54 ret_t ret; 55 56 ret = cherokee_table_init (&resolv->table); 57 if (unlikely (ret != ret_ok)) return ret; 58 59 CHEROKEE_RWLOCK_INIT (&resolv->lock, NULL); 60 61 return ret_ok; 100 ret_t ret; 101 102 ret = cherokee_table_init (&resolv->table); 103 if (unlikely (ret != ret_ok)) return ret; 104 105 CHEROKEE_RWLOCK_INIT (&resolv->lock, NULL); 106 return ret_ok; 62 107 } 63 108 … … 66 111 cherokee_resolv_cache_mrproper (cherokee_resolv_cache_t *resolv) 67 112 { 68 cherokee_table_mrproper (&resolv->table);69 CHEROKEE_RWLOCK_DESTROY (&resolv->lock);70 71 return ret_ok;113 cherokee_table_mrproper (&resolv->table); 114 CHEROKEE_RWLOCK_DESTROY (&resolv->lock); 115 116 return ret_ok; 72 117 } 73 118 … … 76 121 cherokee_resolv_cache_get_default (cherokee_resolv_cache_t **resolv) 77 122 { 78 if (__global_resolv != NULL) { 79 *resolv = __global_resolv; 80 return ret_ok; 81 } 82 83 *resolv = (cherokee_resolv_cache_t *) malloc (sizeof(cherokee_resolv_cache_t)); 84 return cherokee_resolv_cache_init (*resolv); 123 ret_t ret; 124 cherokee_resolv_cache_t *n; 125 126 if (unlikely (__global_resolv == NULL)) { 127 n = (cherokee_resolv_cache_t *) malloc (sizeof(cherokee_resolv_cache_t)); 128 if (n == NULL) return ret_nomem; 129 130 ret = cherokee_resolv_cache_init (n); 131 if (ret != ret_ok) return ret; 132 133 __global_resolv = n; 134 } 135 136 *resolv = __global_resolv; 137 return ret_ok; 138 } 139 140 141 ret_t 142 cherokee_resolv_cache_clean (cherokee_resolv_cache_t *resolv) 143 { 144 CHEROKEE_RWLOCK_WRITER (&resolv->lock); 145 cherokee_table_clean2 (&resolv->table, entry_free); 146 CHEROKEE_RWLOCK_UNLOCK (&resolv->lock); 147 148 return ret_ok; 85 149 } 86 150 87 151 88 152 static ret_t 89 resolve (const char *domain, const char **ip) 90 { 91 ret_t ret; 92 char *tmp; 93 struct in_addr addr; 94 95 ret = cherokee_gethostbyname (domain, &addr); 96 if (unlikely (ret != ret_ok)) return ret; 97 98 tmp = inet_ntoa (addr); 99 *ip = strdup (tmp); 100 101 return ret_ok; 102 } 103 104 105 ret_t 106 cherokee_resolv_cache_resolve (cherokee_resolv_cache_t *resolv, const char *domain, const char **ip) 107 { 108 ret_t ret; 109 110 /* Look for the name in the cache 111 */ 112 CHEROKEE_RWLOCK_WRITER (&resolv->lock); 113 ret = cherokee_table_get (&resolv->table, (char *)domain, (void **)ip); 114 CHEROKEE_RWLOCK_UNLOCK (&resolv->lock); 115 if (ret == ret_ok) return ret_ok; 116 117 /* Damn it! It isn't there.. 118 */ 119 ret = resolve (domain, ip); 120 if (ret != ret_ok) return ret; 121 122 CHEROKEE_RWLOCK_WRITER (&resolv->lock); 123 ret = cherokee_table_add (&resolv->table, (char *)domain, (void **)*ip); 124 CHEROKEE_RWLOCK_UNLOCK (&resolv->lock); 125 126 return ret; 127 } 128 129 130 ret_t 131 cherokee_resolv_cache_clean (cherokee_resolv_cache_t *resolv) 132 { 133 CHEROKEE_RWLOCK_WRITER (&resolv->lock); 134 cherokee_table_clean2 (&resolv->table, free); 135 CHEROKEE_RWLOCK_UNLOCK (&resolv->lock); 136 137 return ret_ok; 138 } 153 table_add_new_entry (cherokee_resolv_cache_t *resolv, const char *domain, cherokee_resolv_cache_entry_t **entry) 154 { 155 ret_t ret; 156 cherokee_resolv_cache_entry_t *n; 157 158 /* Instance the entry 159 */ 160 ret = entry_new (&n); 161 if (unlikely (ret != ret)) 162 return ret; 163 164 /* Fill it up 165 */ 166 ret = entry_fill_up (n, domain); 167 if (unlikely (ret != ret)) { 168 entry_free (n); 169 return ret; 170 } 171 172 /* Add it to the table 173 */ 174 CHEROKEE_RWLOCK_WRITER (&resolv->lock); 175 ret = cherokee_table_add (&resolv->table, (char *)domain, (void **)n); 176 CHEROKEE_RWLOCK_UNLOCK (&resolv->lock); 177 178 *entry = n; 179 return ret_ok; 180 } 181 182 183 ret_t 184 cherokee_resolv_cache_get_ipstr (cherokee_resolv_cache_t *resolv, const char *domain, const char **ip) 185 { 186 ret_t ret; 187 cherokee_resolv_cache_entry_t *entry = NULL; 188 189 /* Look for the name in the cache 190 */ 191 CHEROKEE_RWLOCK_WRITER (&resolv->lock); 192 ret = cherokee_table_get (&resolv->table, (char *)domain, (void **)&entry); 193 CHEROKEE_RWLOCK_UNLOCK (&resolv->lock); 194 195 if (ret != ret_ok) { 196 /* Bad luck: it wasn't cached 197 */ 198 ret = table_add_new_entry (resolv, domain, &entry); 199 if (ret != ret_ok) return ret; 200 } 201 202 /* Return the ip string 203 */ 204 *ip = entry->ip_str.buf; 205 return ret_ok; 206 } 207 208 209 ret_t 210 cherokee_resolv_cache_get_host (cherokee_resolv_cache_t *resolv, const char *domain, cherokee_socket_t *sock) 211 { 212 ret_t ret; 213 cherokee_resolv_cache_entry_t *entry = NULL; 214 215 /* Look for the name in the cache 216 */ 217 CHEROKEE_RWLOCK_WRITER (&resolv->lock); 218 ret = cherokee_table_get (&resolv->table, (char *)domain, (void **)&entry); 219 CHEROKEE_RWLOCK_UNLOCK (&resolv->lock); 220 221 if (ret != ret_ok) { 222 /* Bad luck: it wasn't cached 223 */ 224 ret = table_add_new_entry (resolv, domain, &entry); 225 if (ret != ret_ok) return ret; 226 } 227 228 /* Copy the address 229 */ 230 memcpy (&SOCKET_SIN_ADDR(sock), &entry->addr, sizeof(entry->addr)); 231 return ret_ok; 232 } cherokee/trunk/cherokee/resolv_cache.h
r122 r543 31 31 32 32 #include <cherokee/common.h> 33 #include <cherokee/socket.h> 33 34 34 35 … … 41 42 ret_t cherokee_resolv_cache_get_default (cherokee_resolv_cache_t **resolv); 42 43 43 ret_t cherokee_resolv_cache_init (cherokee_resolv_cache_t *resolv); 44 ret_t cherokee_resolv_cache_mrproper (cherokee_resolv_cache_t *resolv); 44 ret_t cherokee_resolv_cache_init (cherokee_resolv_cache_t *resolv); 45 ret_t cherokee_resolv_cache_mrproper (cherokee_resolv_cache_t *resolv); 46 ret_t cherokee_resolv_cache_clean (cherokee_resolv_cache_t *resolv); 45 47 46 ret_t cherokee_resolv_cache_resolve (cherokee_resolv_cache_t *resolv, const char *domain, const char **ip); 47 ret_t cherokee_resolv_cache_clean (cherokee_resolv_cache_t *resolv); 48 48 ret_t cherokee_resolv_cache_get_ipstr (cherokee_resolv_cache_t *resolv, const char *domain, const char **ip); 49 ret_t cherokee_resolv_cache_get_host (cherokee_resolv_cache_t *resolv, const char *domain, cherokee_socket_t *sock); 49 50 50 51 CHEROKEE_END_DECLS cherokee/trunk/cherokee/source.c
r529 r543 26 26 #include "source.h" 27 27 #include "config_node.h" 28 #include "resolv_cache.h" 28 29 #include "util.h" 29 30 … … 68 69 cherokee_source_connect (cherokee_source_t *src, cherokee_socket_t *sock) 69 70 { 70 ret_t ret; 71 ret_t ret; 72 cherokee_resolv_cache_t *resolv; 73 74 ret = cherokee_resolv_cache_get_default (&resolv); 75 if (unlikely (ret!=ret_ok)) return ret; 71 76 72 77 /* UNIX socket … … 76 81 if (ret != ret_ok) return ret; 77 82 78 ret = cherokee_ socket_gethostbyname (sock, &src->unix_socket);83 ret = cherokee_resolv_cache_get_host (resolv, src->unix_socket.buf, sock); 79 84 if (ret != ret_ok) return ret; 80 85 … … 87 92 if (ret != ret_ok) return ret; 88 93 89 ret = cherokee_ socket_gethostbyname (sock, &src->host);94 ret = cherokee_resolv_cache_get_host (resolv, src->host.buf, sock); 90 95 if (ret != ret_ok) return ret; 91 96 cherokee/trunk/qa/run-tests.py
r525 r543 184 184 if valgrind: 185 185 # os.execl (VALGRIND_PATH, "valgrind", "--tool=helgrind", server, "-C", cfg_file) 186 # os.execl (VALGRIND_PATH, "valgrind", "--tool=callgrind", server, "-C", cfg_file)187 186 # os.execl (VALGRIND_PATH, "valgrind", "--tool=cachegrind", server, "-C", cfg_file) 188 os.execl (VALGRIND_PATH, "valgrind", "--leak-check=full", "--num-callers=20", "-v", server, "-C", cfg_file)187 # os.execl (VALGRIND_PATH, "valgrind", "--leak-check=full", "--num-callers=20", "-v", server, "-C", cfg_file) 189 188 # os.execl (VALGRIND_PATH, "valgrind", "--leak-check=full", "--num-callers=40", "-v", "--leak-resolution=high", server, "-C", cfg_file) 189 os.execl (VALGRIND_PATH, "valgrind", "--tool=callgrind", "--dump-instr=yes", "--trace-jump=yes", "-v", server, "-C", cfg_file) 190 190 elif strace: 191 191 os.execl (STRACE_PATH, "strace", server, "-C", cfg_file)