minor matching speedups.

keep log level name size (namelen) and use it before strcmp().



SVN revision: 45998
This commit is contained in:
Gustavo Sverzut Barbieri 2010-02-09 02:13:55 +00:00
parent 0b2b716214
commit ebed1f20fe
2 changed files with 29 additions and 14 deletions

View File

@ -167,6 +167,7 @@ struct _Eina_Log_Domain
int level; /**< Max level to log */ int level; /**< Max level to log */
const char *domain_str; /**< Formatted string with color to print */ const char *domain_str; /**< Formatted string with color to print */
const char *name; /**< Domain name */ const char *name; /**< Domain name */
unsigned int namelen; /**< strlen(name) */
/* Private */ /* Private */
Eina_Bool deleted:1; /**< Flags deletion of domain, a free slot */ Eina_Bool deleted:1; /**< Flags deletion of domain, a free slot */

View File

@ -344,6 +344,7 @@ struct _Eina_Log_Domain_Level_Pending
{ {
EINA_INLIST; EINA_INLIST;
unsigned int level; unsigned int level;
unsigned int namelen;
char name[]; char name[];
}; };
@ -421,8 +422,8 @@ static pthread_mutex_t _log_mutex = PTHREAD_MUTEX_INITIALIZER;
// List of domains registered // List of domains registered
static Eina_Log_Domain *_log_domains = NULL; static Eina_Log_Domain *_log_domains = NULL;
static int _log_domains_count = 0; static unsigned int _log_domains_count = 0;
static int _log_domains_allocated = 0; static unsigned int _log_domains_allocated = 0;
// Default function for printing on domains // Default function for printing on domains
static Eina_Log_Print_Cb _print_cb = eina_log_print_cb_stderr; static Eina_Log_Print_Cb _print_cb = eina_log_print_cb_stderr;
@ -755,11 +756,13 @@ eina_log_domain_new(Eina_Log_Domain *d, const char *name, const char *color)
d->domain_str = eina_log_domain_str_get(name, NULL); d->domain_str = eina_log_domain_str_get(name, NULL);
d->name = strdup(name); d->name = strdup(name);
d->namelen = strlen(name);
} }
else else
{ {
d->domain_str = NULL; d->domain_str = NULL;
d->name = NULL; d->name = NULL;
d->namelen = 0;
} }
return d; return d;
@ -808,6 +811,7 @@ eina_log_domain_parse_pendings(void)
// Parse name // Parse name
p = malloc(sizeof(Eina_Log_Domain_Level_Pending) + end - start + 1); p = malloc(sizeof(Eina_Log_Domain_Level_Pending) + end - start + 1);
if (!p) break; if (!p) break;
p->namelen = end - start;
memcpy((char *)p->name, start, end - start); memcpy((char *)p->name, start, end - start);
((char *)p->name)[end - start] = '\0'; ((char *)p->name)[end - start] = '\0';
p->level = level; p->level = level;
@ -846,6 +850,7 @@ eina_log_domain_parse_pending_globs(void)
// Parse name // Parse name
p = malloc(sizeof(Eina_Log_Domain_Level_Pending) + end - start + 1); p = malloc(sizeof(Eina_Log_Domain_Level_Pending) + end - start + 1);
if (!p) break; if (!p) break;
p->namelen = 0; /* not that useful */
memcpy((char *)p->name, start, end - start); memcpy((char *)p->name, start, end - start);
((char *)p->name)[end - start] = '\0'; ((char *)p->name)[end - start] = '\0';
p->level = level; p->level = level;
@ -863,7 +868,7 @@ static inline int
eina_log_domain_register_unlocked(const char *name, const char *color) eina_log_domain_register_unlocked(const char *name, const char *color)
{ {
Eina_Log_Domain_Level_Pending *pending = NULL; Eina_Log_Domain_Level_Pending *pending = NULL;
int i; unsigned int i, namelen;
for (i = 0; i < _log_domains_count; i++) for (i = 0; i < _log_domains_count; i++)
{ {
@ -904,10 +909,11 @@ eina_log_domain_register_unlocked(const char *name, const char *color)
_log_domains_count++; _log_domains_count++;
finish_register: finish_register:
namelen = _log_domains[i].namelen;
EINA_INLIST_FOREACH(_pending_list, pending) EINA_INLIST_FOREACH(_pending_list, pending)
{ {
if (!strcmp(pending->name, name)) if ((namelen == pending->namelen) && (strcmp(pending->name, name) == 0))
{ {
_log_domains[i].level = pending->level; _log_domains[i].level = pending->level;
_pending_list = eina_inlist_remove(_pending_list, EINA_INLIST_GET(pending)); _pending_list = eina_inlist_remove(_pending_list, EINA_INLIST_GET(pending));
@ -1522,7 +1528,7 @@ eina_log_domain_unregister_unlocked(int domain)
{ {
Eina_Log_Domain *d; Eina_Log_Domain *d;
if (domain >= _log_domains_count) return; if ((unsigned int)domain >= _log_domains_count) return;
d = &_log_domains[domain]; d = &_log_domains[domain];
eina_log_domain_free(d); eina_log_domain_free(d);
@ -1562,15 +1568,18 @@ EAPI void
eina_log_domain_level_set(const char *domain_name, int level) eina_log_domain_level_set(const char *domain_name, int level)
{ {
Eina_Log_Domain_Level_Pending *pending; Eina_Log_Domain_Level_Pending *pending;
int i, namelen; unsigned int i, namelen;
EINA_SAFETY_ON_NULL_RETURN(domain_name); EINA_SAFETY_ON_NULL_RETURN(domain_name);
namelen = strlen(domain_name);
for (i = 0; i < _log_domains_count; i++) for (i = 0; i < _log_domains_count; i++)
{ {
if (_log_domains[i].deleted) if (_log_domains[i].deleted)
continue; continue;
if (strcmp(_log_domains[i].name, domain_name) != 0) if ((namelen != _log_domains[i].namelen) ||
(strcmp(_log_domains[i].name, domain_name) != 0))
continue; continue;
_log_domains[i].level = level; _log_domains[i].level = level;
@ -1579,18 +1588,19 @@ eina_log_domain_level_set(const char *domain_name, int level)
EINA_INLIST_FOREACH(_pending_list, pending) EINA_INLIST_FOREACH(_pending_list, pending)
{ {
if (!strcmp(pending->name, domain_name)) if ((namelen == pending->namelen) &&
(strcmp(pending->name, domain_name) == 0))
{ {
pending->level = level; pending->level = level;
return; return;
} }
} }
namelen = strlen(domain_name);
pending = malloc(sizeof(Eina_Log_Domain_Level_Pending) + namelen + 1); pending = malloc(sizeof(Eina_Log_Domain_Level_Pending) + namelen + 1);
if (!pending) if (!pending)
return; return;
pending->level = level; pending->level = level;
pending->namelen = namelen;
memcpy(pending->name, domain_name, namelen + 1); memcpy(pending->name, domain_name, namelen + 1);
_pending_list = eina_inlist_append(_pending_list, EINA_INLIST_GET(pending)); _pending_list = eina_inlist_append(_pending_list, EINA_INLIST_GET(pending));
@ -1618,15 +1628,18 @@ EAPI int
eina_log_domain_level_get(const char *domain_name) eina_log_domain_level_get(const char *domain_name)
{ {
Eina_Log_Domain_Level_Pending *pending; Eina_Log_Domain_Level_Pending *pending;
int i; unsigned int i, namelen;
EINA_SAFETY_ON_NULL_RETURN_VAL(domain_name, EINA_LOG_LEVEL_UNKNOWN); EINA_SAFETY_ON_NULL_RETURN_VAL(domain_name, EINA_LOG_LEVEL_UNKNOWN);
namelen = strlen(domain_name);
for (i = 0; i < _log_domains_count; i++) for (i = 0; i < _log_domains_count; i++)
{ {
if (_log_domains[i].deleted) if (_log_domains[i].deleted)
continue; continue;
if (strcmp(_log_domains[i].name, domain_name) != 0) if ((namelen != _log_domains[i].namelen) ||
(strcmp(_log_domains[i].name, domain_name) != 0))
continue; continue;
return _log_domains[i].level; return _log_domains[i].level;
@ -1634,7 +1647,8 @@ eina_log_domain_level_get(const char *domain_name)
EINA_INLIST_FOREACH(_pending_list, pending) EINA_INLIST_FOREACH(_pending_list, pending)
{ {
if (!strcmp(pending->name, domain_name)) if ((namelen == pending->namelen) &&
(strcmp(pending->name, domain_name) == 0))
{ {
return pending->level; return pending->level;
} }
@ -1666,7 +1680,7 @@ EAPI int
eina_log_domain_registered_level_get(int domain) eina_log_domain_registered_level_get(int domain)
{ {
EINA_SAFETY_ON_FALSE_RETURN_VAL(domain >= 0, EINA_LOG_LEVEL_UNKNOWN); EINA_SAFETY_ON_FALSE_RETURN_VAL(domain >= 0, EINA_LOG_LEVEL_UNKNOWN);
EINA_SAFETY_ON_FALSE_RETURN_VAL(domain < _log_domains_count, EINA_SAFETY_ON_FALSE_RETURN_VAL((unsigned int)domain < _log_domains_count,
EINA_LOG_LEVEL_UNKNOWN); EINA_LOG_LEVEL_UNKNOWN);
EINA_SAFETY_ON_TRUE_RETURN_VAL(_log_domains[domain].deleted, EINA_SAFETY_ON_TRUE_RETURN_VAL(_log_domains[domain].deleted,
EINA_LOG_LEVEL_UNKNOWN); EINA_LOG_LEVEL_UNKNOWN);
@ -1775,7 +1789,7 @@ eina_log_print_unlocked(int domain, Eina_Log_Level level, const char *file, cons
Eina_Log_Domain *d; Eina_Log_Domain *d;
#ifdef EINA_SAFETY_CHECKS #ifdef EINA_SAFETY_CHECKS
if (EINA_UNLIKELY(domain >= _log_domains_count) || if (EINA_UNLIKELY((unsigned int)domain >= _log_domains_count) ||
EINA_UNLIKELY(domain < 0)) EINA_UNLIKELY(domain < 0))
{ {
if (file && fnc && fmt) if (file && fnc && fmt)