33 static pthread_mutex_t
mutex = PTHREAD_MUTEX_INITIALIZER;
38 * ((
char *) str - 1) = 0;
39 free ((
char *) str - 5);
48 pthread_mutex_lock (&
mutex);
53 if ((copy = g_hash_table_lookup (
table, str)))
55 void * mem = copy - 5;
56 (* (int32_t *) mem) ++;
60 void * mem = malloc (6 + strlen (str));
61 (* (int32_t *) mem) = 1;
63 copy = (
char *) mem + 5;
67 g_hash_table_insert (
table, copy, copy);
70 pthread_mutex_unlock (&
mutex);
79 pthread_mutex_lock (&
mutex);
83 (* (int32_t *) mem) ++;
85 pthread_mutex_unlock (&
mutex);
94 pthread_mutex_lock (&
mutex);
98 if (! -- (* (int32_t *) mem))
99 g_hash_table_remove (
table, str);
101 pthread_mutex_unlock (&
mutex);
106 if (memchr (str, 0, len))
110 memcpy (buf, str, len);
120 va_start (args, format);
121 int len = vsnprintf (
NULL, 0, format, args);
126 va_start (args, format);
127 vsnprintf (buf,
sizeof buf, format, args);
135 fprintf (stderr,
"String not in pool: %s\n", str);
139 static void str_leaked (
void * key,
void * str,
void * unused)
141 fprintf (stderr,
"String not freed: %s\n", (
char *) str);
150 g_hash_table_destroy (
table);
EXPORT char * str_ref(char *str)
EXPORT char * str_printf(const char *format,...)
EXPORT void str_unref(char *str)
static void str_destroy(void *str)
static GHashTable * table
EXPORT char * str_nget(const char *str, int len)
static pthread_mutex_t mutex
EXPORT void strpool_shutdown(void)
EXPORT char * str_get(const char *str)
EXPORT void strpool_abort(char *str)
static void str_leaked(void *key, void *str, void *unused)