diff options
author | Not Zed <NotZed@Ximian.com> | 2003-04-23 09:34:03 +0800 |
---|---|---|
committer | Michael Zucci <zucchi@src.gnome.org> | 2003-04-23 09:34:03 +0800 |
commit | 41e808deca2ad8654b6f8528ae3492013951fcbd (patch) | |
tree | 352295bf10079041170d50b585f5bb44ecf0ad61 /camel/tests | |
parent | 36875999d7315e9f36eb9d9b8f657a0bd38a0751 (diff) | |
download | gsoc2013-evolution-41e808deca2ad8654b6f8528ae3492013951fcbd.tar gsoc2013-evolution-41e808deca2ad8654b6f8528ae3492013951fcbd.tar.gz gsoc2013-evolution-41e808deca2ad8654b6f8528ae3492013951fcbd.tar.bz2 gsoc2013-evolution-41e808deca2ad8654b6f8528ae3492013951fcbd.tar.lz gsoc2013-evolution-41e808deca2ad8654b6f8528ae3492013951fcbd.tar.xz gsoc2013-evolution-41e808deca2ad8654b6f8528ae3492013951fcbd.tar.zst gsoc2013-evolution-41e808deca2ad8654b6f8528ae3492013951fcbd.zip |
** Should fix #41629, #41448, et al.
2003-04-22 Not Zed <NotZed@Ximian.com>
** Should fix #41629, #41448, et al.
* tests/folder/test10.c: a new torture test for object bag
creation/unreffing.
* camel-url.c (camel_url_copy): new function to copy a url.
* camel-object.c (camel_object_bag_new): add arguments for key
copy and key free functions. Fixed all callers.
(camel_object_bag_destroy): fix a memleak, free the bag key.
(camel_object_bag_get, camel_object_bag_reserve)
(camel_object_bag_abort, save_bag, save_object): Make the key a
void type, rather than char *.
(camel_object_bag_add): As above, and also copy the key.
(camel_object_bag_remove_unlocked): free the key using
bag->free_key.
* camel-session.c (register_provider)
(camel_session_destroy_provider, get_service): Changed to use an
object bag instead of a hash table for the service 'cache'.
(service_cache_remove): Removed, no longer required.
svn path=/trunk/; revision=20930
Diffstat (limited to 'camel/tests')
-rw-r--r-- | camel/tests/folder/Makefile.am | 6 | ||||
-rw-r--r-- | camel/tests/folder/README | 1 | ||||
-rw-r--r-- | camel/tests/folder/test10.c | 115 |
3 files changed, 120 insertions, 2 deletions
diff --git a/camel/tests/folder/Makefile.am b/camel/tests/folder/Makefile.am index c178d5fdb0..e49fd92a87 100644 --- a/camel/tests/folder/Makefile.am +++ b/camel/tests/folder/Makefile.am @@ -19,8 +19,10 @@ LDADD = \ check_PROGRAMS = \ test1 test2 test3 \ test4 test5 test6 \ - test7 test8 test9 + test7 test8 test9 \ + test10 TESTS = test1 test2 test3 \ test4 test5 test6 \ - test7 test8 test9 + test7 test8 test9 \ + test10 diff --git a/camel/tests/folder/README b/camel/tests/folder/README index 4fed421413..3ab64ecd1c 100644 --- a/camel/tests/folder/README +++ b/camel/tests/folder/README @@ -9,3 +9,4 @@ test7 basic folder operations, NNTP test8 multithreaded folder torture test, local test9 filtering +test10 multithreaded folder/store object bag torture test diff --git a/camel/tests/folder/test10.c b/camel/tests/folder/test10.c new file mode 100644 index 0000000000..6ae9d9856d --- /dev/null +++ b/camel/tests/folder/test10.c @@ -0,0 +1,115 @@ +/* threaded folder testing */ + +#include <string.h> + +#include "camel-test.h" +#include "folders.h" +#include "messages.h" +#include "session.h" + +#include <camel/camel-exception.h> +#include <camel/camel-service.h> +#include <camel/camel-store.h> + +#define MAX_LOOP (10000) +#define MAX_THREADS (5) + +#define d(x) + +#ifndef ENABLE_THREADS +int main(int argc, char **argv) +{ + printf("Test %s is only compiled with threads enabled\n", argv[0]); + return 77; +} +#else + +#include <pthread.h> + + +#define ARRAY_LEN(x) (sizeof(x)/sizeof(x[0])) + +static char *local_providers[] = { + "mbox", + "mh", + "maildir" +}; + +static char *path; +static CamelSession *session; +static int testid; + +static void * +worker(void *d) +{ + int i; + CamelException *ex = camel_exception_new(); + CamelStore *store; + CamelFolder *folder; + + for (i=0;i<MAX_LOOP;i++) { + store = camel_session_get_store(session, path, ex); + camel_exception_clear(ex); + folder = camel_store_get_folder(store, "testbox", CAMEL_STORE_FOLDER_CREATE, ex); + camel_exception_clear(ex); + if (testid == 0) { + camel_object_unref(folder); + camel_object_unref(store); + } else { + camel_object_unref(store); + camel_object_unref(folder); + } + } + + camel_exception_free(ex); + + return NULL; +} + +int main(int argc, char **argv) +{ + CamelException *ex; + int i, j; + pthread_t threads[MAX_THREADS]; + + camel_test_init(argc, argv); + + ex = camel_exception_new(); + + /* clear out any camel-test data */ + system("/bin/rm -rf /tmp/camel-test"); + + session = camel_test_session_new ("/tmp/camel-test"); + + for (testid=0;testid<2;testid++) { + if (testid == 0) + camel_test_start("store and folder bag torture test, stacked references"); + else + camel_test_start("store and folder bag torture test, unstacked references"); + + for (j=0;j<ARRAY_LEN(local_providers);j++) { + + camel_test_push("provider %s", local_providers[j]); + path = g_strdup_printf("%s:///tmp/camel-test/%s", local_providers[j], local_providers[j]); + + for (i=0;i<MAX_THREADS;i++) + pthread_create(&threads[i], 0, worker, NULL); + + for (i=0;i<MAX_THREADS;i++) + pthread_join(threads[i], NULL); + + test_free(path); + + camel_test_pull(); + } + + camel_test_end(); + } + + camel_object_unref((CamelObject *)session); + camel_exception_free(ex); + + return 0; +} + +#endif /* ENABLE_THREADS */ |