[Xfce4-commits] r23485 - in xarchiver/branches/xarchiver-psybsd: libxarchiver src
Stephan Arts
stephan at xfce.org
Fri Oct 20 12:37:10 UTC 2006
Author: stephan
Date: 2006-10-20 12:37:07 +0000 (Fri, 20 Oct 2006)
New Revision: 23485
Modified:
xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.c
xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-rar.c
xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-unrar.c
xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-zip.c
xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c
xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h
xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.c
xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.h
xarchiver/branches/xarchiver-psybsd/libxarchiver/libxarchiver.c
xarchiver/branches/xarchiver-psybsd/libxarchiver/mime.c
xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.c
xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.h
xarchiver/branches/xarchiver-psybsd/src/archive_store.c
xarchiver/branches/xarchiver-psybsd/src/main.c
Log:
The library is possibly thread safe
Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.c 2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-gnu-tar.c 2006-10-20 12:37:07 UTC (rev 23485)
@@ -110,28 +110,28 @@
if(program_path)
{
lxa_archive_support_add_mime(archive_support, "application/x-tarz");
- g_free(program_path);
+ LXA_FREE(program_path);
}
/* Check for existence of gzip -- required for x-compressed-tar*/
program_path = g_find_program_in_path("gzip");
if(program_path)
{
lxa_archive_support_add_mime(archive_support, "application/x-compressed-tar");
- g_free(program_path);
+ LXA_FREE(program_path);
}
/* Check for existence of bzip2 -- required for x-bzip-compressed-tar */
program_path = g_find_program_in_path("bzip2");
if(program_path)
{
lxa_archive_support_add_mime(archive_support, "application/x-bzip-compressed-tar");
- g_free(program_path);
+ LXA_FREE(program_path);
}
/* Check for existence of lzop -- required for x-tzo */
program_path = g_find_program_in_path("lzop");
if(program_path)
{
lxa_archive_support_add_mime(archive_support, "application/x-tzo");
- g_free(program_path);
+ LXA_FREE(program_path);
}
archive_support->add = lxa_archive_support_gnu_tar_add;
@@ -273,7 +273,7 @@
{
command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->app_name, " -rf ", archive->path, " ", archive->files, NULL);
lxa_execute(command, archive, NULL, NULL, NULL, NULL);
- g_free(command);
+ LXA_FREE(command);
return 0;
}
archive->tmp_file = g_strconcat(lxa_tmp_dir, "/xarchiver-XXXXXX" , NULL);
@@ -288,7 +288,7 @@
if(!g_strcasecmp((gchar *)archive->mime, "application/x-tzo"))
command = g_strconcat("lzop -dc ", archive->path, NULL);
lxa_execute(command, archive, lxa_archive_support_gnu_tar_decompress_watch, NULL, lxa_archive_support_gnu_tar_decompress_parse_output, NULL);
- g_free(command);
+ LXA_FREE(command);
}
}
return 0;
@@ -360,7 +360,7 @@
{
lxa_execute(command, archive, NULL, NULL, NULL, NULL);
g_debug("Extracting archive '%s' to '%s'\nUsing command '%s'", archive->path, dest_path, command);
- g_free(command);
+ LXA_FREE(command);
}
}
return 0;
@@ -390,7 +390,7 @@
{
command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->app_name, " -f ", archive->path, " --delete ", archive->files, NULL);
lxa_execute(command, archive, NULL, NULL, NULL, NULL);
- g_free(command);
+ LXA_FREE(command);
return 0;
}
archive->tmp_file = g_strconcat(lxa_tmp_dir, "/xarchiver-XXXXXX" , NULL);
@@ -405,7 +405,7 @@
if(!g_strcasecmp((gchar *)archive->mime, "application/x-tzo"))
command = g_strconcat("lzop -dc ", archive->path, NULL);
lxa_execute(command, archive, lxa_archive_support_gnu_tar_decompress_watch, NULL, lxa_archive_support_gnu_tar_decompress_parse_output, NULL);
- g_free(command);
+ LXA_FREE(command);
} else
return 1;
}
@@ -455,7 +455,7 @@
else
command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->app_name, " -tvf " , archive->path, NULL);
lxa_execute(command, archive, NULL, NULL, lxa_archive_support_gnu_tar_refresh_parse_output, NULL);
- g_free(command);
+ LXA_FREE(command);
}
return 0;
}
@@ -584,7 +584,7 @@
entry = lxa_archive_add_file(archive, temp_filename);
lxa_archive_iter_set_propsv(archive, entry, (gconstpointer*)props);
- g_free(line);
+ LXA_FREE(line);
}
}
if(cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL) )
@@ -604,7 +604,7 @@
{
FILE *out_file = NULL;
LXAArchive *archive = data;
- gchar *buf = g_new0(gchar, 1024);
+ gchar *buf = LXA_NEW0(gchar, 1024);
guint read = 0;
GError *error = NULL;
gchar *command = NULL;
@@ -625,7 +625,7 @@
}
fclose(out_file);
}
- g_free(buf);
+ LXA_FREE(buf);
if(cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL) )
{
#ifdef DEBUG
@@ -642,13 +642,13 @@
g_unlink(archive->path);
command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->app_name, " -rf ", archive->tmp_file, " ", archive->files, NULL);
lxa_execute(command, archive, lxa_archive_support_gnu_tar_compress_watch, NULL, NULL, NULL);
- g_free(command);
+ LXA_FREE(command);
break;
case(LXA_ARCHIVESTATUS_REMOVE):
g_unlink(archive->path);
command = g_strconcat(LXA_ARCHIVE_SUPPORT_GNU_TAR(archive->support)->app_name, " -f ", archive->tmp_file, " --delete ", archive->files, NULL);
lxa_execute(command, archive, lxa_archive_support_gnu_tar_compress_watch, NULL, NULL, NULL);
- g_free(command);
+ LXA_FREE(command);
break;
default:
break;
@@ -664,7 +664,7 @@
{
FILE *out_file = NULL;
LXAArchive *archive = data;
- gchar *buf = g_new0(gchar, 1024);
+ gchar *buf = LXA_NEW0(gchar, 1024);
guint read = 0;
GError *error = NULL;
@@ -684,7 +684,7 @@
}
fclose(out_file);
}
- g_free(buf);
+ LXA_FREE(buf);
if(cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL) )
{
#ifdef DEBUG
Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-rar.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-rar.c 2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-rar.c 2006-10-20 12:37:07 UTC (rev 23485)
@@ -101,7 +101,7 @@
if(abs_path)
{
support = g_object_new(LXA_TYPE_ARCHIVE_SUPPORT_RAR, NULL);
- g_free(abs_path);
+ LXA_FREE(abs_path);
}
return LXA_ARCHIVE_SUPPORT(support);
Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-unrar.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-unrar.c 2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-unrar.c 2006-10-20 12:37:07 UTC (rev 23485)
@@ -87,7 +87,7 @@
if(abs_path)
{
support = g_object_new(LXA_TYPE_ARCHIVE_SUPPORT_UNRAR, NULL);
- g_free(abs_path);
+ LXA_FREE(abs_path);
}
return LXA_ARCHIVE_SUPPORT(support);
Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-zip.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-zip.c 2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive-support-zip.c 2006-10-20 12:37:07 UTC (rev 23485)
@@ -307,8 +307,8 @@
if(LXA_ARCHIVE_SUPPORT_ZIP(archive->support)->_view_time)
archive->n_property++;
- archive->property_types = g_new0(GType, archive->n_property);
- archive->property_names = g_new0(gchar *, archive->n_property);
+ archive->property_types = LXA_NEW0(GType, archive->n_property);
+ archive->property_names = LXA_NEW0(gchar *, archive->n_property);
if(LXA_ARCHIVE_SUPPORT_ZIP(archive->support)->_view_length) {
archive->property_types[i] = G_TYPE_UINT64;
@@ -355,7 +355,7 @@
gchar *command = g_strconcat("unzip -lv -qq " , archive->path, NULL);
lxa_execute(command, archive, NULL, NULL, lxa_archive_support_zip_refresh_parse_output, NULL);
- g_free(command);
+ LXA_FREE(command);
}
return 0;
}
@@ -389,7 +389,7 @@
break;
/* length, method , size, ratio, date, time, crc-32, filename*/
- props = g_malloc0(archive->entry_props_size);
+ props = LXA_MALLOC0(archive->entry_props_size);
props_iter = props;
for(n=0; n < strlen(line) && line[n] == ' '; n++);
a = n;
@@ -399,7 +399,7 @@
{
_size = g_strndup(&line[a], n-a);
(*((guint64 *)props_iter)) = g_ascii_strtoull( _size, NULL, 0);
- g_free (_size);
+ LXA_FREE (_size);
props_iter += sizeof(guint64);
}
@@ -421,7 +421,7 @@
{
_size = g_strndup(&line[a], n-a);
(*((guint64 *)props_iter)) = g_ascii_strtoull( _size, NULL, 0);
- g_free (_size);
+ LXA_FREE (_size);
props_iter += sizeof(guint64);
}
@@ -472,8 +472,8 @@
entry = lxa_archive_add_file(archive, temp_filename);
entry->props = props;
- g_free(line);
- g_free(temp_filename);
+ LXA_FREE(line);
+ LXA_FREE(temp_filename);
}
}
if(cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL) )
Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c 2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c 2006-10-20 12:37:07 UTC (rev 23485)
@@ -40,6 +40,18 @@
#define LXA_MIME_DIRECTORY "inode/directory"
#endif
+#ifdef LXA_THREADSAFE
+#define LXA_ARCHIVE_READ_LOCK(lock) g_static_rw_lock_reader_lock(lock)
+#define LXA_ARCHIVE_READ_UNLOCK(lock) g_static_rw_lock_reader_unlock(lock)
+#define LXA_ARCHIVE_WRITE_LOCK(lock) g_static_rw_lock_writer_lock(lock)
+#define LXA_ARCHIVE_WRITE_UNLOCK(lock) g_static_rw_lock_writer_unlock(lock)
+#else
+#define LXA_ARCHIVE_READ_LOCK(lock)
+#define LXA_ARCHIVE_READ_UNLOCK(lock)
+#define LXA_ARCHIVE_WRITE_LOCK(lock)
+#define LXA_ARCHIVE_WRITE_UNLOCK(lock)
+#endif
+
struct _LXAEntry
{
gchar *filename;
@@ -83,6 +95,21 @@
static gpointer
lxa_archive_entry_get_props(LXAArchive *, LXAEntry *);
+static const gchar *
+lxa_archive_iter_get_prop_str(const LXAArchive *, const LXAArchiveIter *, guint);
+static guint
+lxa_archive_iter_get_prop_uint(const LXAArchive *, const LXAArchiveIter *, guint);
+static guint64
+lxa_archive_iter_get_prop_uint64(const LXAArchive *, const LXAArchiveIter *, guint);
+
+static const gchar *
+lxa_archive_iter_get_filename(const LXAArchive *, const LXAArchiveIter *);
+static const gchar *
+lxa_archive_iter_get_mimetype(const LXAArchive *, const LXAArchiveIter *);
+
+static gint
+lxa_entry_filename_compare(LXAEntry *, LXAEntry *);
+
gint
lxa_archive_sort_entry_buffer(LXAEntry *entry1, LXAEntry *entry2)
{
@@ -139,7 +166,10 @@
static void
lxa_archive_init(LXAArchive *archive)
{
- archive->root_entry = g_new0(LXAEntry, 1);
+ archive->root_entry = LXA_NEW0(LXAEntry, 1);
+#ifdef LXA_THREADSAFE
+ g_static_rw_lock_init(&archive->rw_lock);
+#endif /* LXA_THREADSAFE */
}
/** static void
@@ -152,7 +182,7 @@
{
LXAArchive *archive = LXA_ARCHIVE(object);
if(archive->path)
- g_free(archive->path);
+ LXA_FREE(archive->path);
lxa_archive_entry_free(archive, archive->root_entry);
switch(archive->status)
{
@@ -196,6 +226,7 @@
void
lxa_archive_set_status(LXAArchive *archive, LXAArchiveStatus status)
{
+ LXA_ARCHIVE_WRITE_LOCK(&archive->rw_lock);
if(LXA_IS_ARCHIVE(archive))
{
if(archive->status != status)
@@ -205,6 +236,7 @@
g_signal_emit(G_OBJECT(archive), lxa_archive_signals[0], 0, archive);
}
}
+ LXA_ARCHIVE_WRITE_UNLOCK(&archive->rw_lock);
}
gint
@@ -221,6 +253,7 @@
LXAArchiveIter *
lxa_archive_add_file(LXAArchive *archive, const gchar *path)
{
+ LXA_ARCHIVE_WRITE_LOCK(&archive->rw_lock);
guint i = 0;
gchar **path_items = g_strsplit_set(path, "/\n", -1);
LXAArchiveIter *parent = (LXAArchiveIter*)archive->root_entry;
@@ -239,12 +272,12 @@
child = lxa_archive_iter_add_child(archive, parent, basename);
}
- g_free(basename);
+ LXA_FREE(basename);
parent = child;
i++;
}
-
+ LXA_ARCHIVE_WRITE_UNLOCK(&archive->rw_lock);
return child;
}
@@ -257,15 +290,15 @@
if(archive->n_property < size)
{
- new_props = g_new0(GType, size);
- new_names = g_new0(gchar*, size);
+ new_props = LXA_NEW0(GType, size);
+ new_names = LXA_NEW0(gchar*, size);
for(i = 0; i < archive->n_property; ++i)
{
new_props[i] = archive->property_types[i];
new_names[i] = archive->property_names[i];
}
- g_free(archive->property_types);
- g_free(archive->property_names);
+ LXA_FREE(archive->property_types);
+ LXA_FREE(archive->property_names);
archive->property_types = new_props;
archive->property_names = new_names;
archive->n_property = size;
@@ -282,15 +315,15 @@
if(archive->n_property < size)
{
- new_types = g_new0(GType, size);
- new_names = g_new0(gchar*, size);
+ new_types = LXA_NEW0(GType, size);
+ new_names = LXA_NEW0(gchar*, size);
for(i = 0; i < archive->n_property; ++i)
{
new_types[i] = archive->property_types[i];
new_names[i] = archive->property_names[i];
}
- g_free(archive->property_types);
- g_free(archive->property_names);
+ LXA_FREE(archive->property_types);
+ LXA_FREE(archive->property_names);
archive->property_types = new_types;
archive->property_names = new_names;
archive->n_property = size;
@@ -306,19 +339,27 @@
GType
lxa_archive_get_property_type(LXAArchive *archive, guint i)
{
+ LXA_ARCHIVE_READ_LOCK(&archive->rw_lock);
+
#ifdef DEBUG /* n_property + 2, filename and MIME */
g_return_val_if_fail(i < (archive->n_property+LXA_ARCHIVE_PROP_USER), G_TYPE_INVALID);
#endif
+
+ GType retval = G_TYPE_INVALID;
switch(i)
{
case LXA_ARCHIVE_PROP_FILENAME:
- return G_TYPE_STRING;
+ retval = G_TYPE_STRING;
+ break;
case LXA_ARCHIVE_PROP_MIME_TYPE:
- return G_TYPE_STRING;
+ retval = G_TYPE_STRING;
+ break;
default:
- return archive->property_types[i - LXA_ARCHIVE_PROP_USER];
+ retval = archive->property_types[i - LXA_ARCHIVE_PROP_USER];
+ break;
}
- g_return_val_if_reached(G_TYPE_NONE);
+ LXA_ARCHIVE_READ_UNLOCK(&archive->rw_lock);
+ return retval;
}
/*
@@ -329,19 +370,29 @@
const gchar *
lxa_archive_get_property_name(LXAArchive *archive, guint i)
{
+ LXA_ARCHIVE_READ_LOCK(&archive->rw_lock);
+
#ifdef DEBUG /* n_property + 2, filename and MIME */
g_return_val_if_fail(i < (archive->n_property+LXA_ARCHIVE_PROP_USER), NULL);
#endif
+
+ const gchar *retval = NULL;
+
switch(i)
{
case LXA_ARCHIVE_PROP_FILENAME:
- return _("Filename");
+ retval = _("Filename");
+ break;
case LXA_ARCHIVE_PROP_MIME_TYPE:
- return _("Mime type");
+ retval = _("Mime type");
+ break;
default:
- return archive->property_names[i - LXA_ARCHIVE_PROP_USER];
+ retval = archive->property_names[i - LXA_ARCHIVE_PROP_USER];
+ break;
}
- g_return_val_if_reached(NULL);
+
+ LXA_ARCHIVE_READ_UNLOCK(&archive->rw_lock);
+ return retval;
}
/*
@@ -352,15 +403,20 @@
void
lxa_archive_set_property_type(LXAArchive *archive, guint i, GType type, const gchar *name)
{
+ LXA_ARCHIVE_WRITE_LOCK(&archive->rw_lock);
+
#ifdef DEBUG
g_return_if_fail(i >= LXA_ARCHIVE_PROP_USER);
#endif
+
GType *types_iter = lxa_archive_get_property_types(archive, i+1-LXA_ARCHIVE_PROP_USER);
gchar **names_iter = lxa_archive_get_property_names(archive, i+1-LXA_ARCHIVE_PROP_USER);
types_iter[i-LXA_ARCHIVE_PROP_USER] = type;
- g_free(names_iter[i-LXA_ARCHIVE_PROP_USER]);
+ LXA_FREE(names_iter[i-LXA_ARCHIVE_PROP_USER]);
names_iter[i-LXA_ARCHIVE_PROP_USER] = g_strdup(name);
+
+ LXA_ARCHIVE_WRITE_UNLOCK(&archive->rw_lock);
}
/*
@@ -371,6 +427,7 @@
void
lxa_archive_set_property_typesv(LXAArchive *archive, GType *types, const gchar **names)
{
+ LXA_ARCHIVE_WRITE_LOCK(&archive->rw_lock);
guint size = 0;
GType *type_iter = types;
const gchar **name_iter = names;
@@ -387,13 +444,14 @@
while(type_iter && name_iter)
{
*types_iter = *type_iter;
- g_free(*names_iter);
+ LXA_FREE(*names_iter);
*names_iter = g_strdup(*name_iter);
types_iter++;
type_iter++;
names_iter++;
name_iter++;
}
+ LXA_ARCHIVE_WRITE_UNLOCK(&archive->rw_lock);
}
guint
@@ -405,6 +463,8 @@
LXAArchiveIter *
lxa_archive_get_iter(LXAArchive *archive, const gchar *path)
{
+ LXA_ARCHIVE_READ_LOCK(&archive->rw_lock);
+
if(!path)
return (LXAArchiveIter *)archive->root_entry;
@@ -433,6 +493,7 @@
g_strfreev(buf);
+ LXA_ARCHIVE_READ_UNLOCK(&archive->rw_lock);
return entry;
}
@@ -444,7 +505,7 @@
static LXAEntry *
lxa_entry_new(LXAArchive *archive, const gchar *filename)
{
- LXAEntry *entry = g_new0(LXAEntry, 1);
+ LXAEntry *entry = LXA_NEW0(LXAEntry, 1);
const gchar *pos = strchr(filename, '/');
@@ -462,7 +523,7 @@
return entry;
}
-void
+static void
lxa_archive_entry_free(LXAArchive *archive, LXAEntry *entry)
{
gint i = 0;
@@ -482,7 +543,7 @@
for(i = 1; i <= GPOINTER_TO_INT(*entry->children); ++i)
lxa_archive_entry_free(archive, entry->children[i]);
- g_free(entry->children);
+ LXA_FREE(entry->children);
entry->children = NULL;
}
@@ -493,7 +554,7 @@
switch(archive->property_types[i])
{
case(G_TYPE_STRING):
- g_free(*(gchar **)props_iter);
+ LXA_FREE(*(gchar **)props_iter);
props_iter += sizeof(gchar *);
break;
case(G_TYPE_UINT):
@@ -504,14 +565,20 @@
break;
}
}
- g_free(entry->props);
+ LXA_FREE(entry->props);
}
if(entry->mime_info)
lxa_mime_info_unref(entry->mime_info);
- g_free(entry->filename);
- g_free(entry);
+ LXA_FREE(entry->filename);
+ LXA_FREE(entry);
}
+static gint
+lxa_entry_filename_compare(LXAEntry *a, LXAEntry *b)
+{
+ return strcmp(a->filename, b->filename);
+}
+
static LXAEntry *
lxa_entry_get_child(const LXAEntry *entry, const gchar *filename)
{
@@ -538,7 +605,7 @@
cmp = strcmp(_filename, entry->children[begin+pos]->filename);
if(!cmp)
{
- g_free(_filename);
+ LXA_FREE(_filename);
return entry->children[begin+pos];
}
@@ -560,21 +627,21 @@
if(!cmp)
{
- g_free(_filename);
+ LXA_FREE(_filename);
return buffer_iter->entry;
}
if(cmp < 0)
break;
}
- g_free(_filename);
+ LXA_FREE(_filename);
return NULL;
}
static void
lxa_archive_entry_add_child(LXAArchive *archive, LXAEntry *parent, LXAEntry *child)
{
- parent->buffer = lxa_slist_insert_sorted_single(parent->buffer, child);
+ parent->buffer = lxa_slist_insert_sorted_single(parent->buffer, child, (GCompareFunc)lxa_entry_filename_compare);
if(lxa_slist_length(parent->buffer) == LXA_ENTRY_CHILD_BUFFER_SIZE)
lxa_archive_entry_flush_buffer(archive, parent);
@@ -600,7 +667,7 @@
max_children = (n_children + lxa_slist_length(entry->buffer));
- entry->children = g_new(LXAEntry *, max_children+1);
+ entry->children = LXA_NEW(LXAEntry *, max_children+1);
for(buffer_iter = entry->buffer;buffer_iter;buffer_iter = buffer_iter->next)
{
size = n_children + 1 - begin;
@@ -647,7 +714,7 @@
lxa_slist_free(entry->buffer);
entry->buffer = NULL;
- g_free(children_old);
+ LXA_FREE(children_old);
}
static gpointer
@@ -674,7 +741,7 @@
}
}
- entry->props = g_malloc0(size);
+ entry->props = LXA_MALLOC0(size);
}
return entry->props;
@@ -781,7 +848,7 @@
*
* returns filename
*/
-const gchar*
+static const gchar*
lxa_archive_iter_get_filename(const LXAArchive *archive, const LXAArchiveIter *iter)
{
return ((LXAEntry *)iter)->filename;
@@ -793,7 +860,7 @@
*
* returns mime type
*/
-const gchar *
+static const gchar *
lxa_archive_iter_get_mimetype(const LXAArchive *archive, const LXAArchiveIter *iter)
{
return lxa_mime_info_get_name(((LXAEntry *)iter)->mime_info);
@@ -819,6 +886,8 @@
void
lxa_archive_iter_set_prop_str(LXAArchive *archive, LXAArchiveIter *iter, guint i, const gchar *str_val)
{
+ LXA_ARCHIVE_WRITE_LOCK(&archive->rw_lock);
+
gpointer props_iter = NULL;
guint n;
#ifdef DEBUG
@@ -856,10 +925,12 @@
break;
}
}
- g_free(*((gchar **)props_iter));
+ LXA_FREE(*((gchar **)props_iter));
(*((gchar **)props_iter)) = g_strdup(str_val);
break;
}
+
+ LXA_ARCHIVE_WRITE_UNLOCK(&archive->rw_lock);
}
/**
@@ -870,11 +941,13 @@
void
lxa_archive_iter_set_prop_uint(LXAArchive *archive, LXAArchiveIter *iter, guint i, guint int_val)
{
+ LXA_ARCHIVE_WRITE_LOCK(&archive->rw_lock);
+
#ifdef DEBUG
g_return_if_fail(i < (archive->n_property+LXA_ARCHIVE_PROP_USER));
g_return_if_fail(i >= LXA_ARCHIVE_PROP_USER);
g_return_if_fail(archive->property_types[i-LXA_ARCHIVE_PROP_USER] == G_TYPE_UINT);
-#endif
+#endif /* DEBUG */
gpointer props_iter = lxa_archive_entry_get_props(archive, (LXAEntry *)iter);
guint n;
@@ -894,6 +967,8 @@
}
}
(*((guint *)props_iter)) = int_val;
+
+ LXA_ARCHIVE_WRITE_UNLOCK(&archive->rw_lock);
}
/**
@@ -904,11 +979,13 @@
void
lxa_archive_iter_set_prop_uint64(LXAArchive *archive, LXAArchiveIter *iter, guint i, guint64 int64_val)
{
+ LXA_ARCHIVE_WRITE_LOCK(&archive->rw_lock);
+
#ifdef DEBUG
g_return_if_fail(i < (archive->n_property+LXA_ARCHIVE_PROP_USER));
g_return_if_fail(i >= LXA_ARCHIVE_PROP_USER);
g_return_if_fail(archive->property_types[i-LXA_ARCHIVE_PROP_USER] == G_TYPE_UINT64);
-#endif
+#endif /* DEBUG */
gpointer props_iter = lxa_archive_entry_get_props(archive, (LXAEntry *)iter);
guint n;
@@ -928,6 +1005,8 @@
}
}
(*((guint64 *)props_iter)) = int64_val;
+
+ LXA_ARCHIVE_WRITE_UNLOCK(&archive->rw_lock);
}
/**
@@ -960,6 +1039,8 @@
void
lxa_archive_iter_set_props(LXAArchive *archive, LXAArchiveIter *iter, ...)
{
+ LXA_ARCHIVE_WRITE_LOCK(&archive->rw_lock);
+
gpointer props_iter = lxa_archive_entry_get_props(archive, (LXAEntry *)iter);
guint i;
va_list ap;
@@ -986,6 +1067,8 @@
}
va_end(ap);
+
+ LXA_ARCHIVE_WRITE_UNLOCK(&archive->rw_lock);
}
/**
@@ -996,6 +1079,7 @@
void
lxa_archive_iter_set_propsv(LXAArchive *archive, LXAArchiveIter *iter, gconstpointer *props)
{
+ LXA_ARCHIVE_WRITE_LOCK(&archive->rw_lock);
gpointer props_iter = lxa_archive_entry_get_props(archive, (LXAEntry *)iter);
guint i;
@@ -1017,6 +1101,8 @@
break;
}
}
+
+ LXA_ARCHIVE_WRITE_UNLOCK(&archive->rw_lock);
}
/**
@@ -1027,6 +1113,8 @@
gboolean
lxa_archive_iter_get_prop_value(const LXAArchive *archive, const LXAArchiveIter *iter, guint i, GValue *value)
{
+ LXA_ARCHIVE_READ_LOCK(&archive->rw_lock);
+
if(i>=LXA_ARCHIVE_PROP_USER)
g_value_init(value, archive->property_types[i-LXA_ARCHIVE_PROP_USER]);
else
@@ -1044,15 +1132,17 @@
g_value_set_uint64(value, lxa_archive_iter_get_prop_uint64(archive, iter, i));
break;
}
+
+ LXA_ARCHIVE_READ_UNLOCK(&archive->rw_lock);
return TRUE;
}
/**
- * const gchar *
+ * static const gchar *
* lxa_archive_iter_get_prop_str(const LXAArchive *, const LXAArchiveIter *, guint)
*
*/
-const gchar*
+static const gchar*
lxa_archive_iter_get_prop_str(const LXAArchive *archive, const LXAArchiveIter *iter, guint i)
{
const gchar *retval = NULL;
@@ -1099,11 +1189,11 @@
}
/**
- * guint
+ * static guint
* lxa_archive_iter_get_prop_uint(const LXAArchive *, const LXAArchiveIter *, guint)
*
*/
-guint
+static guint
lxa_archive_iter_get_prop_uint(const LXAArchive *archive, const LXAArchiveIter *iter, guint i)
{
gpointer props_iter = ((LXAEntry *)iter)->props;
@@ -1134,11 +1224,11 @@
}
/**
- * guint64
+ * static guint64
* lxa_archive_iter_get_prop_uint64(const LXAArchive *, const LXAArchiveIter *, guint)
*
*/
-guint64
+static guint64
lxa_archive_iter_get_prop_uint64(const LXAArchive *archive, const LXAArchiveIter *iter, guint i)
{
gpointer props_iter = ((LXAEntry *)iter)->props;
Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h 2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h 2006-10-20 12:37:07 UTC (rev 23485)
@@ -73,6 +73,9 @@
GType *property_types;
gchar **property_names;
LXAEntry *root_entry;
+#ifdef G_THREADS_ENABLED
+ GStaticRWLock rw_lock;
+#endif
LXAArchiveStatus status;
LXAArchiveStatus old_status;
GPid child_pid;
@@ -83,7 +86,6 @@
gchar *tmp_file;
gchar *files;
gboolean has_passwd;
- gushort entry_props_size;
};
typedef struct _LXAArchiveClass LXAArchiveClass;
@@ -115,11 +117,6 @@
void lxa_archive_iter_set_props(LXAArchive *, LXAArchiveIter *, ...);
void lxa_archive_iter_set_propsv(LXAArchive *, LXAArchiveIter *, gconstpointer *);
-const gchar *lxa_archive_iter_get_filename(const LXAArchive *, const LXAArchiveIter *);
-const gchar *lxa_archive_iter_get_mimetype(const LXAArchive *, const LXAArchiveIter *);
-const gchar *lxa_archive_iter_get_prop_str(const LXAArchive *, const LXAArchiveIter *, guint);
-guint lxa_archive_iter_get_prop_uint(const LXAArchive *, const LXAArchiveIter *, guint);
-guint64 lxa_archive_iter_get_prop_uint64(const LXAArchive *, const LXAArchiveIter *, guint);
gboolean lxa_archive_iter_get_prop_value(const LXAArchive *, const LXAArchiveIter *, guint, GValue *);
LXAArchiveIter *lxa_archive_add_file(LXAArchive *, const gchar *);
Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.c 2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.c 2006-10-20 12:37:07 UTC (rev 23485)
@@ -17,6 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
+#include <config.h>
#include <glib.h>
#include <glib-object.h>
@@ -26,6 +27,44 @@
#include "internals.h"
+#ifdef LXA_TRACE_ALLOCATION
+
+#define __USE_GNU
+
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+
+static gchar lxa_allocation_file[128];
+
+void lxa_trace_init()
+{
+ snprintf(lxa_allocation_file, 127, "lxa_trace.%d", getpid());
+ fclose( fopen(lxa_allocation_file, "w") );
+}
+
+gpointer lxa_trace_add(const gchar *methode, guint size, gpointer pointer, const gchar *function, const gchar *file, guint line)
+{
+ FILE *fp = fopen(lxa_allocation_file, "a");
+
+ fprintf(fp, "%s:%d %s{ %s(%d) = %p }\n", file, line, function, methode, size, pointer);
+
+ fclose(fp);
+
+ return pointer;
+}
+
+void lxa_trace_del(const gchar *methode, gpointer pointer, const gchar *function, const gchar *file, guint line)
+{
+ FILE *fp = fopen(lxa_allocation_file, "a");
+
+ fprintf(fp, "%s:%d %s{ %s(%p) }\n", file, line, function, methode, pointer);
+
+ fclose(fp);
+}
+
+#endif /* LXA_TRACE_ALLOCATION */
+
void
lxa_default_child_watch_func(GPid pid, gint status, gpointer data)
{
@@ -124,7 +163,7 @@
_concat_str = concat_str;
concat_str = g_strconcat(concat_str, " \"", _filenames->data,"\"", NULL);
_filenames = _filenames->next;
- g_free(_concat_str);
+ LXA_FREE(_concat_str);
}
if(!filenames)
return NULL;
Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.h 2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/internals.h 2006-10-20 12:37:07 UTC (rev 23485)
@@ -16,7 +16,68 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
+#ifdef DEBUG
+#define LXA_TRACE_ALLOCATION 1
+#endif /* DEBUG */
+#ifdef LXA_TRACE_ALLOCATION
+
+void lxa_trace_init();
+gpointer lxa_trace_add(const gchar *methode, guint size, gpointer pointer, const gchar *function, const gchar *file, guint line);
+void lxa_trace_del(const gchar *methode, gpointer pointer, const gchar *function, const gchar *file, guint line);
+
+#define LXA_TRACE_INIT lxa_trace_init()
+
+#define LXA_NEW(type, count) lxa_trace_add("g_new", sizeof(type)*(count), g_new(type, count), __FUNCTION__, __FILE__, __LINE__)
+#define LXA_NEW0(type, count) lxa_trace_add("g_new0", sizeof(type)*(count), g_new0(type, count), __FUNCTION__, __FILE__, __LINE__)
+#define LXA_MALLOC(size) lxa_trace_add("g_malloc", size, g_malloc(size), __FUNCTION__, __FILE__, __LINE__)
+#define LXA_MALLOC0(size) lxa_trace_add("g_malloc0", size, g_malloc0(size), __FUNCTION__, __FILE__, __LINE__)
+#define LXA_FREE(pointer) { lxa_trace_del("g_free", pointer, __FUNCTION__, __FILE__, __LINE__); g_free(pointer); }
+
+#ifdef USE_G_SLICE
+#define LXA_SLICE_NEW(type) g_slice_new(type)
+#define LXA_SLICE_NEW0(type) g_slice_new0(type)
+#define LXA_SLICE_ALLOC(size) g_slice_alloc(size)
+#define LXA_SLICE_ALLOC0(size) g_slice_alloc0(size)
+#define LXA_SLICE_FREE(type, pointer) g_slice_free(type, pointer)
+#define LXA_SLICE_FREE1(size, pointer) g_silce_free1(size, pointer)
+#else
+#define LXA_SLICE_NEW(type) LXA_NEW(type, 1)
+#define LXA_SLICE_NEW0(type) LXA_NEW0(type, 1)
+#define LXA_SLICE_ALLOC(size) LXA_MALLOC(size)
+#define LXA_SLICE_ALLOC0(size) LXA_MALLOC0(size)
+#define LXA_SLICE_FREE(type, pointer) LXA_FREE(pointer)
+#define LXA_SLICE_FREE1(size, pointer) LXA_FREE(pointer)
+#endif /* USE_G_SLICE */
+
+#else /* LXA_TRACE_ALLOCATION */
+
+#define LXA_TRACE_INIT
+
+#define LXA_NEW(type, count) g_new(type, count)
+#define LXA_NEW0(type, count) g_new0(type, count)
+#define LXA_MALLOC(size) g_malloc(size)
+#define LXA_MALLOC0(size) g_malloc0(size)
+#define LXA_FREE(pointer) g_free(pointer)
+
+#ifdef USE_G_SLICE
+#define LXA_SLICE_NEW(type) g_slice_new(type)
+#define LXA_SLICE_NEW0(type) g_slice_new0(type)
+#define LXA_SLICE_ALLOC(size) g_slice_alloc(size)
+#define LXA_SLICE_ALLOC0(size) g_slice_alloc0(size)
+#define LXA_SLICE_FREE(type, pointer) g_slice_free(type, pointer)
+#define LXA_SLICE_FREE1(size, pointer) g_silce_free1(size, pointer)
+#else
+#define LXA_SLICE_NEW(type) LXA_NEW(type, 1)
+#define LXA_SLICE_NEW0(type) LXA_NEW0(type, 1)
+#define LXA_SLICE_ALLOC(size) LXA_MALLOC(size)
+#define LXA_SLICE_ALLOC0(size) LXA_MALLOC0(size)
+#define LXA_SLICE_FREE(type, pointer) LXA_FREE(pointer)
+#define LXA_SLICE_FREE1(size, pointer) LXA_FREE(pointer)
+#endif /* USE_G_SLICE */
+
+#endif /* LXA_TRACE_ALLOCATION */
+
const gchar *lxa_tmp_dir;
GSList *lxa_archive_support_list;
Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/libxarchiver.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/libxarchiver.c 2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/libxarchiver.c 2006-10-20 12:37:07 UTC (rev 23485)
@@ -34,6 +34,8 @@
void
lxa_init()
{
+ LXA_TRACE_INIT;
+
lxa_tmp_dir = g_get_tmp_dir();
lxa_mime_init();
Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/mime.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/mime.c 2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/mime.c 2006-10-20 12:37:07 UTC (rev 23485)
@@ -27,6 +27,8 @@
#endif
#include "mime.h"
+#include "archive.h"
+#include "internals.h"
#ifdef HAVE_THUNAR_VFS
ThunarVfsMimeDatabase *lxa_mime_database;
@@ -66,7 +68,7 @@
#else
#endif /* HAVE_THUNAR_VFS */
- g_free(base);
+ LXA_FREE(base);
return result;
}
@@ -118,7 +120,7 @@
else
g_value_set_string(value, NULL);
#endif
- /* g_free((gchar *)mime_type); */
+ /* LXA_FREE((gchar *)mime_type); */
}
void
Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.c 2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.c 2006-10-20 12:37:07 UTC (rev 23485)
@@ -5,10 +5,11 @@
#include "mime.h"
#include "archive.h"
+#include "internals.h"
#include "slist.h"
LXASList *
-lxa_slist_insert_sorted_single(LXASList *list, LXAEntry *entry)
+lxa_slist_insert_sorted_single(LXASList *list, LXAEntry *entry, GCompareFunc cmp_func)
{
gint cmp = 1;
LXASList *iter = list;
@@ -18,7 +19,7 @@
for(; iter; iter = iter->next)
{
/* archive can be NULL */
- cmp = strcmp(lxa_archive_iter_get_filename(NULL, entry), lxa_archive_iter_get_filename( NULL, (LXAEntry*)iter->entry));
+ cmp = cmp_func(entry, (LXAEntry*)iter->entry);
if(!cmp)
{
@@ -31,7 +32,7 @@
prev_entry = iter;
}
- new_entry = g_new(LXASList, 1);
+ new_entry = LXA_SLICE_NEW(LXASList);
new_entry->next = iter;
new_entry->entry = entry;
@@ -58,7 +59,7 @@
for(; list; list = next)
{
next = list->next;
- g_free(list);
+ LXA_SLICE_FREE(LXASList, list);
}
}
Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.h 2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/slist.h 2006-10-20 12:37:07 UTC (rev 23485)
@@ -9,7 +9,7 @@
};
LXASList *
-lxa_slist_insert_sorted_single(LXASList *list, LXAEntry *entry);
+lxa_slist_insert_sorted_single(LXASList *list, LXAEntry *entry, GCompareFunc);
guint
lxa_slist_length(LXASList *list);
Modified: xarchiver/branches/xarchiver-psybsd/src/archive_store.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/archive_store.c 2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/src/archive_store.c 2006-10-20 12:37:07 UTC (rev 23485)
@@ -19,6 +19,7 @@
#include <config.h>
#include <string.h>
#include <glib.h>
+#include <glib-object.h>
#include <gtk/gtk.h>
#include <libxarchiver/libxarchiver.h>
#include <libxarchiver/mime.h>
@@ -692,6 +693,7 @@
static gint
xa_archive_entry_compare(XAArchiveStore *store, LXAArchiveIter *a, LXAArchiveIter *b)
{
+ /*
gboolean cmp_a = 0;
gboolean cmp_b = 0;
if(store->props._sort_folders_first)
@@ -722,9 +724,9 @@
case G_TYPE_STRING:
switch(store->props._sort_case_sensitive)
{
- case 0: /* case insensitive */
+ case 0: *//* case insensitive *//*
return g_ascii_strcasecmp(lxa_archive_iter_get_prop_str(archive, a, column), lxa_archive_iter_get_prop_str(archive, b, column));
- case 1: /* case sensitive */
+ case 1: *//* case sensitive *//*
return strcmp(lxa_archive_iter_get_prop_str(archive, a, column), lxa_archive_iter_get_prop_str(archive, b, column));
}
case G_TYPE_UINT64:
@@ -732,7 +734,7 @@
case G_TYPE_UINT:
return lxa_archive_iter_get_prop_uint(archive, a, column) - lxa_archive_iter_get_prop_uint(archive, b, column);
}
-
+ */
g_return_val_if_reached(0);
}
@@ -1090,8 +1092,9 @@
{
g_return_val_if_fail(store, NULL);
+ GValue *basename = g_new0(GValue, 1);
gchar *path = NULL;
- const gchar **buf = NULL;
+ gchar **buf = NULL;
GSList *iter = store->current_entry;
gint i = g_slist_length(iter);
gchar *lastfile = NULL;
@@ -1101,13 +1104,15 @@
if(i<=1)
return g_strdup("");
- buf = g_new(const gchar*, i);
+ buf = g_new(gchar*, i);
i--;
buf[i] = NULL;
- namelen = strlen(lxa_archive_iter_get_filename(store->archive, (LXAArchiveIter*)iter->data));
+ lxa_archive_iter_get_prop_value(store->archive, (LXAArchiveIter*)iter->data, LXA_ARCHIVE_PROP_FILENAME, basename);
+ namelen = strlen(g_value_get_string(basename));
lastfile = g_new(gchar, namelen+2);
- strcpy(lastfile, lxa_archive_iter_get_filename(store->archive, (LXAArchiveIter*)iter->data));
+ strcpy(lastfile, g_value_get_string(basename));
+ g_value_unset(basename);
if(lastfile[namelen-1] != '/')
{
lastfile[namelen] = '/';
@@ -1123,22 +1128,23 @@
while(iter->next)
{
--i;
- buf[i] = lxa_archive_iter_get_filename(store->archive, (LXAArchiveIter*)iter->data);
+ lxa_archive_iter_get_prop_value(store->archive, (LXAArchiveIter*)iter->data, LXA_ARCHIVE_PROP_FILENAME, basename);
+ buf[i] = g_value_dup_string(basename);
+ g_value_unset(basename);
iter = iter->next;
}
}
if(buf[0] != lastfile && buf[0][0] == '/')
{
- buf[0] = "";
+ buf[0] = g_strdup("");
}
/* why does glib want buf to be gchar** instead of const gchar** ? */
path = g_strjoinv("/", (gchar**)buf);
- g_free(lastfile);
- g_free(buf);
-
+ g_strfreev(buf);
+ g_free(basename);
return path;
}
@@ -1147,6 +1153,7 @@
{
g_return_val_if_fail(store, NULL);
+ GValue basename;
GSList *iter = store->current_entry;
GSList *path = NULL;
@@ -1156,7 +1163,9 @@
/* we don't want to include de archive rootentry */
while(iter->next)
{
- path = g_slist_prepend(path, g_strdup(lxa_archive_iter_get_filename(store->archive, (LXAArchiveIter*)iter->data)));
+ lxa_archive_iter_get_prop_value(store->archive, (LXAArchiveIter*)iter->data, LXA_ARCHIVE_PROP_FILENAME, &basename);
+ path = g_slist_prepend(path, g_value_dup_string(&basename));
+ g_value_unset(&basename);
iter = iter->next;
}
Modified: xarchiver/branches/xarchiver-psybsd/src/main.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/main.c 2006-10-20 09:50:15 UTC (rev 23484)
+++ xarchiver/branches/xarchiver-psybsd/src/main.c 2006-10-20 12:37:07 UTC (rev 23485)
@@ -121,6 +121,10 @@
textdomain (GETTEXT_PACKAGE);
#endif
+#ifdef G_THREADS_ENABLED
+ g_thread_init(NULL);
+#endif /* G_THREADS_ENABLED */
+
if(!gtk_init_with_args(&argc, &argv, _("[archive name]"), entries, PACKAGE, &cli_error))
{
if ( cli_error != NULL )
More information about the Xfce4-commits
mailing list