Changeset 2983
- Timestamp:
- 11/20/07 22:23:11
- Files:
-
- trunk/ChangeLog (modified) (1 diff)
- trunk/libtinymail/tny-folder-monitor.c (modified) (1 diff)
- trunk/libtinymail/tny-merge-folder.c (modified) (68 diffs)
- trunk/libtinymail/tny-merge-folder.h (modified) (2 diffs)
- trunk/tests/c-demo/tny-demoui-summary-view.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/ChangeLog
r2981 r2983 8 8 9 9 * Bugfix makes ENABLE not happen if login failed 10 * Completed the implementation of TnyMergeFolder, shortened its locks 11 and made it possible to provide a ui-locker. Also, locking the ui 12 context at the right times. 10 13 11 14 2007-11-20 Steve Kowalik <stevenk@ubuntu.com> trunk/libtinymail/tny-folder-monitor.c
r2914 r2983 366 366 367 367 g_mutex_lock (priv->lock); 368 g_object_unref ( G_OBJECT (priv->lists));368 g_object_unref (priv->lists); 369 369 g_mutex_unlock (priv->lock); 370 370 trunk/libtinymail/tny-merge-folder.c
r2884 r2983 27 27 #include <tny-simple-list.h> 28 28 #include <tny-folder-observer.h> 29 #include <tny-noop-lockable.h> 29 30 30 31 static GObjectClass *parent_class = NULL; … … 35 36 { 36 37 gchar *id, *name; 37 TnyList *mothers , *observers;38 TnyList *mothers; 38 39 GStaticRecMutex *lock; 39 40 TnyFolderType folder_type; 41 GList *obs; 42 TnyLockable *ui_locker; 40 43 }; 41 44 … … 49 52 { 50 53 TnyMergeFolderPriv *priv = TNY_MERGE_FOLDER_GET_PRIVATE (self); 51 TnyList *copy = NULL;52 54 TnyIterator *iter; 53 54 g_static_rec_mutex_lock (priv->lock); 55 if (!priv->observers) { 55 GList *list; 56 57 g_static_rec_mutex_lock (priv->lock); 58 if (!priv->obs) { 56 59 g_static_rec_mutex_unlock (priv->lock); 57 60 return; 58 61 } 59 copy = tny_list_copy (priv->observers);60 g_static_rec_mutex_unlock (priv->lock); 61 62 iter = tny_list_create_iterator (copy); 63 while ( !tny_iterator_is_done (iter))64 { 65 TnyFolderObserver *observer = TNY_FOLDER_OBSERVER ( tny_iterator_get_current (iter));66 /* TNY TODO: tny_lockable_lock (ui_lock); */62 list = g_list_copy (priv->obs); 63 g_static_rec_mutex_unlock (priv->lock); 64 65 66 while (list) 67 { 68 TnyFolderObserver *observer = TNY_FOLDER_OBSERVER (list->data); 69 tny_lockable_lock (priv->ui_locker); 67 70 tny_folder_observer_update (observer, change); 68 /* TNY TODO: tny_lockable_unlock (ui_lock); */69 g_object_unref (G_OBJECT (observer));70 tny_iterator_next (iter);71 } 72 73 g_object_unref (iter); 74 g_object_unref (copy);71 tny_lockable_unlock (priv->ui_locker); 72 list = g_list_next (list); 73 } 74 75 g_list_free (list); 76 77 return; 75 78 } 76 79 … … 122 125 TnyMergeFolderPriv *priv = TNY_MERGE_FOLDER_GET_PRIVATE (self); 123 126 TnyIterator *iter; 124 125 g_static_rec_mutex_lock (priv->lock); 126 127 iter = tny_list_create_iterator (priv->mothers); 127 TnyList *copy; 128 129 g_static_rec_mutex_lock (priv->lock); 130 copy = tny_list_copy (priv->mothers); 131 g_static_rec_mutex_unlock (priv->lock); 132 133 iter = tny_list_create_iterator (copy); 128 134 while (!tny_iterator_is_done (iter)) 129 135 { … … 143 149 } 144 150 g_object_unref (iter); 145 146 g_static_rec_mutex_unlock (priv->lock); 151 g_object_unref (copy); 152 147 153 148 154 return; … … 172 178 173 179 /* thread reference */ 174 g_object_unref ( G_OBJECT (self));180 g_object_unref (self); 175 181 if (info->err) 176 182 g_error_free (info->err); … … 185 191 { 186 192 SyncFolderInfo *info = thr_user_data; 193 TnyMergeFolderPriv *priv = TNY_MERGE_FOLDER_GET_PRIVATE (info->self); 187 194 188 195 if (info->callback) { 189 /* TNY TODO: tny_lockable_lock (ui_lock); */196 tny_lockable_lock (priv->ui_locker); 190 197 info->callback (info->self, info->cancelled, info->err, info->user_data); 191 /* TNY TODO: tny_lockable_unlock (ui_lock); */198 tny_lockable_unlock (priv->ui_locker); 192 199 } 193 200 … … 204 211 TnyIterator *iter; 205 212 GError *err = NULL; 206 207 g_static_rec_mutex_lock (priv->lock); 213 TnyList *copy; 214 215 g_static_rec_mutex_lock (priv->lock); 216 copy = tny_list_copy (priv->mothers); 217 g_static_rec_mutex_unlock (priv->lock); 208 218 209 219 info->cancelled = FALSE; 210 220 211 iter = tny_list_create_iterator ( priv->mothers);221 iter = tny_list_create_iterator (copy); 212 222 while (!tny_iterator_is_done (iter)) 213 223 { … … 226 236 tny_iterator_next (iter); 227 237 } 238 228 239 g_object_unref (iter); 240 g_object_unref (copy); 229 241 230 242 info->err = NULL; 231 232 g_static_rec_mutex_unlock (priv->lock);233 243 234 244 if (info->callback) … … 244 254 } 245 255 } else /* Thread reference */ 246 g_object_unref ( G_OBJECT (self));256 g_object_unref (self); 247 257 248 258 g_thread_exit (NULL); … … 268 278 269 279 /* thread reference */ 270 g_object_ref ( G_OBJECT (self));280 g_object_ref (self); 271 281 272 282 thread = g_thread_create (sync_async_thread, info, FALSE, NULL); … … 321 331 TnyFolder *fol = tny_header_get_folder (header); 322 332 TnyMsg *retval = tny_folder_get_msg (fol, header, err); 333 323 334 g_object_unref (fol); 324 335 … … 333 344 TnyIterator *iter; 334 345 TnyMsg *retval = NULL; 335 336 g_static_rec_mutex_lock (priv->lock); 337 338 iter = tny_list_create_iterator (priv->mothers); 346 TnyList *copy; 347 348 g_static_rec_mutex_lock (priv->lock); 349 copy = tny_list_copy (priv->mothers); 350 g_static_rec_mutex_unlock (priv->lock); 351 352 iter = tny_list_create_iterator (copy); 339 353 while (!tny_iterator_is_done (iter) && !retval) 340 354 { … … 346 360 347 361 g_object_unref (iter); 348 349 g_static_rec_mutex_unlock (priv->lock); 362 g_object_unref (copy); 363 350 364 351 365 if (!retval) … … 376 390 377 391 /* thread reference */ 378 g_object_unref (G_OBJECT (info->self)); 392 g_object_unref (info->self); 393 379 394 if (info->msg) 380 g_object_unref ( G_OBJECT (info->msg));395 g_object_unref (info->msg); 381 396 382 397 if (info->err) … … 390 405 { 391 406 GetMsgInfo *info = (GetMsgInfo *) thr_user_data; 407 TnyMergeFolderPriv *priv = TNY_MERGE_FOLDER_GET_PRIVATE (info->self); 392 408 393 409 if (info->callback) { 394 410 /* TNY TODO: the cancelled field */ 395 396 /* TNY TODO: tny_lockable_lock (ui_lock); */ 411 tny_lockable_lock (priv->ui_locker); 397 412 info->callback (info->self, FALSE, info->msg, info->err, info->user_data); 398 /* TNY TODO: tny_lockable_unlock (ui_lock); */413 tny_lockable_unlock (priv->ui_locker); 399 414 } 400 415 … … 413 428 { 414 429 if (info->msg && G_IS_OBJECT (info->msg)) 415 g_object_unref ( G_OBJECT (info->msg));430 g_object_unref (info->msg); 416 431 info->msg = NULL; 417 432 } 418 433 419 g_object_unref ( G_OBJECT (info->header));434 g_object_unref (info->header); 420 435 421 436 if (info->callback) … … 431 446 } 432 447 } else /* thread reference */ 433 g_object_unref ( G_OBJECT (info->self));448 g_object_unref (info->self); 434 449 435 450 g_thread_exit (NULL); … … 499 514 { 500 515 GetHeadersFolderInfo *info = thr_user_data; 516 TnyMergeFolderPriv *priv = TNY_MERGE_FOLDER_GET_PRIVATE (info->self); 501 517 502 518 if (info->callback) { 503 /* TNY TODO: tny_lockable_lock (ui_lock); */519 tny_lockable_lock (priv->ui_locker); 504 520 info->callback (info->self, info->cancelled, info->headers, info->err, info->user_data); 505 /* TNY TODO: tny_lockable_unlock (ui_lock); */521 tny_lockable_unlock (priv->ui_locker); 506 522 } 507 523 … … 518 534 TnyIterator *iter; 519 535 GError *err = NULL; 520 521 g_static_rec_mutex_lock (priv->lock); 536 TnyList *copy; 537 538 g_static_rec_mutex_lock (priv->lock); 539 copy = tny_list_copy (priv->mothers); 540 g_static_rec_mutex_unlock (priv->lock); 522 541 523 542 info->cancelled = FALSE; 524 543 525 iter = tny_list_create_iterator ( priv->mothers);544 iter = tny_list_create_iterator (copy); 526 545 while (!tny_iterator_is_done (iter)) 527 546 { … … 540 559 tny_iterator_next (iter); 541 560 } 561 542 562 g_object_unref (iter); 563 g_object_unref (copy); 543 564 544 565 info->err = NULL; 545 546 g_static_rec_mutex_unlock (priv->lock);547 566 548 567 if (info->callback) … … 598 617 TnyMergeFolderPriv *priv = TNY_MERGE_FOLDER_GET_PRIVATE (self); 599 618 TnyIterator *iter; 600 601 g_static_rec_mutex_lock (priv->lock); 602 603 iter = tny_list_create_iterator (priv->mothers); 619 TnyList *copy; 620 621 g_static_rec_mutex_lock (priv->lock); 622 copy = tny_list_copy (priv->mothers); 623 g_static_rec_mutex_unlock (priv->lock); 624 625 iter = tny_list_create_iterator (copy); 604 626 605 627 while (!tny_iterator_is_done (iter)) … … 620 642 621 643 g_object_unref (iter); 622 623 g_static_rec_mutex_unlock (priv->lock); 644 g_object_unref (copy); 624 645 625 646 } … … 643 664 GString *ids = g_string_new (""); 644 665 gboolean first = TRUE; 666 TnyList *copy; 645 667 646 668 g_static_rec_mutex_lock (priv->lock); 647 648 iter = tny_list_create_iterator (priv->mothers); 669 copy = tny_list_copy (priv->mothers); 670 g_static_rec_mutex_unlock (priv->lock); 671 672 iter = tny_list_create_iterator (copy); 649 673 650 674 while (!tny_iterator_is_done (iter)) … … 666 690 priv->id = ids->str; 667 691 g_string_free (ids, FALSE); 692 668 693 g_object_unref (iter); 669 670 g_static_rec_mutex_unlock (priv->lock); 694 g_object_unref (copy); 671 695 672 696 } … … 674 698 /* The get_id_func() DBC contract does not allow this to be NULL or "": */ 675 699 if ( (priv->id == NULL) || (strlen (priv->id) == 0)) { 676 priv->id = g_strdup ("unknown_mergefolder"); 677 } 678 700 priv->id = g_strdup ("unknown_mergefolder"); 701 } 702 679 703 return priv->id; 680 704 } … … 723 747 TnyIterator *iter; 724 748 guint total = 0; 725 726 g_static_rec_mutex_lock (priv->lock); 727 728 iter = tny_list_create_iterator (priv->mothers); 749 TnyList *copy; 750 751 g_static_rec_mutex_lock (priv->lock); 752 copy = tny_list_copy (priv->mothers); 753 g_static_rec_mutex_unlock (priv->lock); 754 755 iter = tny_list_create_iterator (copy); 729 756 730 757 while (!tny_iterator_is_done (iter)) … … 737 764 738 765 g_object_unref (iter); 739 740 g_static_rec_mutex_unlock (priv->lock); 766 g_object_unref (copy); 767 741 768 742 769 return total; … … 749 776 TnyIterator *iter; 750 777 guint total = 0; 751 752 g_static_rec_mutex_lock (priv->lock); 753 754 iter = tny_list_create_iterator (priv->mothers); 778 TnyList *copy; 779 780 g_static_rec_mutex_lock (priv->lock); 781 copy = tny_list_copy (priv->mothers); 782 g_static_rec_mutex_unlock (priv->lock); 783 784 iter = tny_list_create_iterator (copy); 755 785 756 786 while (!tny_iterator_is_done (iter)) … … 763 793 764 794 g_object_unref (iter); 765 766 g_static_rec_mutex_unlock (priv->lock); 795 g_object_unref (copy); 767 796 768 797 return total; … … 776 805 TnyIterator *iter; 777 806 guint total = 0; 778 779 g_static_rec_mutex_lock (priv->lock); 780 781 iter = tny_list_create_iterator (priv->mothers); 807 TnyList *copy; 808 809 g_static_rec_mutex_lock (priv->lock); 810 copy = tny_list_copy (priv->mothers); 811 g_static_rec_mutex_unlock (priv->lock); 812 813 iter = tny_list_create_iterator (copy); 782 814 783 815 while (!tny_iterator_is_done (iter)) … … 790 822 791 823 g_object_unref (iter); 792 793 g_static_rec_mutex_unlock (priv->lock); 824 g_object_unref (copy); 794 825 795 826 return total; … … 808 839 TnyMergeFolderPriv *priv = TNY_MERGE_FOLDER_GET_PRIVATE (self); 809 840 TnyIterator *iter; 810 811 g_static_rec_mutex_lock (priv->lock); 812 813 iter = tny_list_create_iterator (priv->mothers); 841 TnyList *copy; 842 843 g_static_rec_mutex_lock (priv->lock); 844 copy = tny_list_copy (priv->mothers); 845 g_static_rec_mutex_unlock (priv->lock); 846 847 iter = tny_list_create_iterator (copy); 814 848 while (!tny_iterator_is_done (iter)) 815 849 { … … 829 863 830 864 g_object_unref (iter); 831 832 g_static_rec_mutex_unlock (priv->lock); 865 g_object_unref (copy); 833 866 834 867 return; … … 855 888 856 889 /* thread reference */ 857 g_object_unref ( G_OBJECT (self));890 g_object_unref (self); 858 891 if (info->err) 859 892 g_error_free (info->err); … … 868 901 { 869 902 RefreshFolderInfo *info = thr_user_data; 903 TnyMergeFolderPriv *priv = TNY_MERGE_FOLDER_GET_PRIVATE (info->self); 870 904 871 905 if (info->callback) { 872 /* TNY TODO: tny_lockable_lock (ui_lock); */906 tny_lockable_lock (priv->ui_locker); 873 907 info->callback (info->self, info->cancelled, info->err, info->user_data); 874 /* TNY TODO: tny_lockable_unlock (ui_lock); */908 tny_lockable_unlock (priv->ui_locker); 875 909 } 876 910 … … 900 934 TnyIterator *iter; 901 935 GError *err = NULL; 902 903 g_static_rec_mutex_lock (priv->lock); 936 TnyList *copy; 937 938 g_static_rec_mutex_lock (priv->lock); 939 copy = tny_list_copy (priv->mothers); 940 g_static_rec_mutex_unlock (priv->lock); 904 941 905 942 info->cancelled = FALSE; 906 943 907 iter = tny_list_create_iterator ( priv->mothers);944 iter = tny_list_create_iterator (copy); 908 945 while (!tny_iterator_is_done (iter)) 909 946 { … … 922 959 tny_iterator_next (iter); 923 960 } 961 924 962 g_object_unref (iter); 963 g_object_unref (copy); 925 964 926 965 info->err = NULL; 927 966 928 g_static_rec_mutex_unlock (priv->lock);929 967 930 968 if (info->callback) … … 940 978 } 941 979 } else /* Thread reference */ 942 g_object_unref ( G_OBJECT (self));980 g_object_unref (self); 943 981 944 982 g_thread_exit (NULL); … … 963 1001 964 1002 /* thread reference */ 965 g_object_ref ( G_OBJECT (self));1003 g_object_ref (self); 966 1004 967 1005 thread = g_thread_create (refresh_async_thread, info, FALSE, NULL); … … 976 1014 TnyMergeFolderPriv *priv = TNY_MERGE_FOLDER_GET_PRIVATE (self); 977 1015 TnyIterator *iter; 978 979 g_static_rec_mutex_lock (priv->lock);980 1016 981 1017 iter = tny_list_create_iterator (header_list); … … 1005 1041 1006 1042 g_object_unref (iter); 1007 1008 g_static_rec_mutex_unlock (priv->lock);1009 1043 1010 1044 return; … … 1030 1064 1031 1065 /* thread reference */ 1032 g_object_unref ( G_OBJECT (info->self));1033 g_object_unref ( G_OBJECT (info->folder_dst));1034 g_object_unref ( G_OBJECT (info->header_list));1066 g_object_unref (info->self); 1067 g_object_unref (info->folder_dst); 1068 g_object_unref (info->header_list); 1035 1069 1036 1070 if (info->err) … … 1046 1080 { 1047 1081 TransferMsgsInfo *info = thr_user_data; 1082 TnyMergeFolderPriv *priv = TNY_MERGE_FOLDER_GET_PRIVATE (info->self); 1048 1083 1049 1084 if (info->callback) { 1050 1085 /* TNY TODO: the cancelled field */ 1051 1052 /* TNY TODO: tny_lockable_lock (ui_lock); */ 1086 tny_lockable_lock (priv->ui_locker); 1053 1087 info->callback (info->self, FALSE, info->err, info->user_data); 1054 /* TNY TODO: tny_lockable_unlock (ui_lock); */1088 tny_lockable_unlock (priv->ui_locker); 1055 1089 } 1056 1090 … … 1066 1100 TnyMergeFolderPriv *priv = TNY_MERGE_FOLDER_GET_PRIVATE (self); 1067 1101 1068 g_static_rec_mutex_lock (priv->lock);1069 1102 tny_merge_folder_transfer_msgs (info->self, info->header_list, info->folder_dst, info->delete_originals, &info->err); 1070 g_static_rec_mutex_unlock (priv->lock);1071 1103 1072 1104 if (info->callback) … … 1082 1114 } 1083 1115 } else { /* Thread reference */ 1084 g_object_unref ( G_OBJECT (info->self));1085 g_object_unref ( G_OBJECT (info->folder_dst));1086 g_object_unref ( G_OBJECT (info->header_list));1116 g_object_unref (info->self); 1117 g_object_unref (info->folder_dst); 1118 g_object_unref (info->header_list); 1087 1119 } 1088 1120 … … 1110 1142 1111 1143 /* thread reference */ 1112 g_object_ref ( G_OBJECT (self));1113 g_object_ref ( G_OBJECT (folder_dst));1114 g_object_ref ( G_OBJECT (header_list));1144 g_object_ref (self); 1145 g_object_ref (folder_dst); 1146 g_object_ref (header_list); 1115 1147 1116 1148 thread = g_thread_create (transfer_msgs_async_thread, info, FALSE, NULL); … … 1127 1159 TnyIterator *iter; 1128 1160 TnyFolder *nfol = NULL; 1129 1130 g_static_rec_mutex_lock (priv->lock); 1131 1132 iter = tny_list_create_iterator (priv->mothers); 1161 TnyList *copy; 1162 1163 g_static_rec_mutex_lock (priv->lock); 1164 copy = tny_list_copy (priv->mothers); 1165 g_static_rec_mutex_unlock (priv->lock); 1166 1167 iter = tny_list_create_iterator (copy); 1133 1168 while (!tny_iterator_is_done (iter)) 1134 1169 { … … 1171 1206 1172 1207 g_object_unref (iter); 1173 1174 g_static_rec_mutex_unlock (priv->lock); 1208 g_object_unref (copy); 1175 1209 1176 1210 return nfol; … … 1182 1216 TnyMergeFolderPriv *priv = TNY_MERGE_FOLDER_GET_PRIVATE (self); 1183 1217 TnyIterator *iter; 1184 1185 g_static_rec_mutex_lock (priv->lock); 1186 1187 iter = tny_list_create_iterator (priv->mothers); 1218 TnyList *copy; 1219 1220 g_static_rec_mutex_lock (priv->lock); 1221 copy = tny_list_copy (priv->mothers); 1222 g_static_rec_mutex_unlock (priv->lock); 1223 1224 iter = tny_list_create_iterator (copy); 1188 1225 while (!tny_iterator_is_done (iter)) 1189 1226 { … … 1195 1232 1196 1233 g_object_unref (iter); 1197 1198 g_static_rec_mutex_unlock (priv->lock); 1199 1200 return; 1234 g_object_unref (copy); 1235 1236 return; 1237 } 1238 1239 1240 static void 1241 notify_observer_del (gpointer user_data, GObject *observer) 1242 { 1243 TnyMergeFolderPriv *priv = TNY_MERGE_FOLDER_GET_PRIVATE (user_data); 1244 g_static_rec_mutex_lock (priv->lock); 1245 priv->obs = g_list_remove (priv->obs, observer); 1246 g_static_rec_mutex_unlock (priv->lock); 1201 1247 } 1202 1248 … … 1207 1253 1208 1254 g_static_rec_mutex_lock (priv->lock); 1209 1210 if (!priv->observers) 1211 priv->observers = tny_simple_list_new (); 1212 1213 tny_list_prepend (priv->observers, G_OBJECT (observer)); 1214 1255 priv->obs = g_list_prepend (priv->obs, observer); 1256 g_object_weak_ref (G_OBJECT (observer), notify_observer_del, self); 1215 1257 g_static_rec_mutex_unlock (priv->lock); 1216 1258 … … 1222 1264 { 1223 1265 TnyMergeFolderPriv *priv = TNY_MERGE_FOLDER_GET_PRIVATE (self); 1224 1225 g_static_rec_mutex_lock (priv->lock); 1226 1227 if (priv->observers) 1228 tny_list_remove (priv->observers, G_OBJECT (observer)); 1266 GList *found = NULL; 1267 1268 g_assert (TNY_IS_FOLDER_OBSERVER (observer)); 1269 1270 g_static_rec_mutex_lock (priv->lock); 1271 1272 if (!priv->obs) { 1273 g_static_rec_mutex_unlock (priv->lock); 1274 return; 1275 } 1276 1277 found = g_list_find (priv->obs, observer); 1278 if (found) { 1279 priv->obs = g_list_remove_link (priv->obs, found); 1280 g_object_weak_unref (found->data, notify_observer_del, self); 1281 g_list_free (found); 1282 } 1229 1283 1230 1284 g_static_rec_mutex_unlock (priv->lock); … … 1249 1303 TnyIterator *iter; 1250 1304 gint total_size = 0; 1251 1252 g_static_rec_mutex_lock (priv->lock); 1253 1254 iter = tny_list_create_iterator (priv->mothers); 1305 TnyList *copy; 1306 1307 g_static_rec_mutex_lock (priv->lock); 1308 copy = tny_list_copy (priv->mothers); 1309 g_static_rec_mutex_unlock (priv->lock); 1310 1311 iter = tny_list_create_iterator (copy); 1255 1312 while (!tny_iterator_is_done (iter)) 1256 1313 { … … 1264 1321 1265 1322 g_object_unref (iter); 1266 1267 g_static_rec_mutex_unlock (priv->lock); 1323 g_object_unref (copy); 1268 1324 1269 1325 /* TNY TODO: update unread, all_count and local_size here ! */ … … 1305 1361 TnyList *list; 1306 1362 TnyIterator *iter; 1307 1308 1363 gint total = 0, unread = 0; 1309 1310 g_static_rec_mutex_lock (priv->lock); 1311 1312 iter = tny_list_create_iterator (priv->mothers); 1364 TnyList *copy; 1365 1366 g_static_rec_mutex_lock (priv->lock); 1367 copy = tny_list_copy (priv->mothers); 1368 g_static_rec_mutex_unlock (priv->lock); 1369 1370 iter = tny_list_create_iterator (copy); 1313 1371 while (!tny_iterator_is_done (iter)) 1314 1372 { … … 1319 1377 tny_iterator_next (iter); 1320 1378 } 1379 1321 1380 g_object_unref (iter); 1322 g_ static_rec_mutex_unlock (priv->lock);1381 g_object_unref (copy); 1323 1382 1324 1383 tny_folder_change_set_new_all_count (new_change, total); … … 1382 1441 /* TODO: register @self as observer of @folder and proxy the 1383 1442 * events through to observers of @self. */ 1384 1443 1385 1444 g_static_rec_mutex_lock (priv->lock); 1386 1445 1387 1446 tny_list_prepend (priv->mothers, G_OBJECT (folder)); 1388 1389 1447 tny_folder_add_observer (folder, TNY_FOLDER_OBSERVER (self)); 1390 1448 … … 1411 1469 1412 1470 priv = TNY_MERGE_FOLDER_GET_PRIVATE (self); 1413 1471 1414 1472 g_static_rec_mutex_lock (priv->lock); 1415 1473 1416 1474 tny_folder_remove_observer (folder, TNY_FOLDER_OBSERVER (self)); 1417 1418 1475 tny_list_remove (priv->mothers, G_OBJECT (folder)); 1419 1476 … … 1435 1492 TnyMergeFolderPriv *priv; 1436 1493 TnyIterator *iter; 1494 TnyList *copy; 1437 1495 1438 1496 g_return_if_fail (TNY_IS_MERGE_FOLDER (self)); … … 1440 1498 1441 1499 priv = TNY_MERGE_FOLDER_GET_PRIVATE (self); 1442 1443 g_static_rec_mutex_lock (priv->lock); 1444 1445 iter = tny_list_create_iterator (priv->mothers); 1500 1501 g_static_rec_mutex_lock (priv->lock); 1502 copy = tny_list_copy (priv->mothers); 1503 g_static_rec_mutex_unlock (priv->lock); 1504 1505 iter = tny_list_create_iterator (copy); 1446 1506 while (!tny_iterator_is_done (iter)) { 1447 1507 GObject *folder; … … 1453 1513 tny_iterator_next (iter); 1454 1514 } 1515 1455 1516 g_object_unref (iter); 1456 1457 g_static_rec_mutex_unlock (priv->lock); 1517 g_object_unref (copy); 1518 1458 1519 } 1459 1520 … … 1465 1526 * instances together (partly read only, though). 1466 1527 * 1528 * Important consideration: if you use this type within a Gtk+ application, 1529 * you probably want to use tny_merge_folder_new_with_ui_locker in stead. If 1530 * your UI toolkid isn't thread safe (most aren't), but so-called thread aware 1531 * because it has a UI context lock (like Gtk+ has), then you must create this 1532 * type with a TnyLockable that aquires and releases this lock correctly. 1533 * For Gtk+ there's a default implementation called TnyGtkLockable available 1534 * in libtinymailui-gtk. Please do use this, else you can have threading related 1535 * problems in your user interface software. 1536 * 1467 1537 * Return value: a new #TnyMergeFolder instance 1468 1538 **/ … … 1479 1549 1480 1550 1551 /** 1552 * tny_merge_folder_new_with_ui_locker: 1553 * @folder_name: the name of the merged folder 1554 * @ui_locker: a #TnyLockable for locking your ui 1555 * 1556 * Creates a a new TnyMergeFolder instance that can merge multiple #TnyFolder 1557 * instances together (partly read only, though). Upon construction it 1558 * instantly sets the ui locker. For Gtk+ you should use TnyGtkLockable here. 1559 * 1560 * Return value: a new #TnyMergeFolder instance 1561 **/ 1562 TnyFolder* 1563 tny_merge_folder_new_with_ui_locker (const gchar *folder_name, TnyLockable *ui_locker) 1564 { 1565 TnyMergeFolder *self = TNY_MERGE_FOLDER (tny_merge_folder_new (folder_name)); 1566 tny_merge_folder_set_ui_locker (self, ui_locker); 1567 return TNY_FOLDER (self); 1568 } 1569 1570 /** 1571 * tny_merge_folder_set_ui_locker: 1572 * @self: a #TnyMergeFolder instance 1573 * @ui_locker: a #TnyLockable locker for locking your ui 1574 * 1575 * Sets the ui locker. For Gtk+ you should use TnyGtkLockable here. 1576 * 1577 **/ 1578 void 1579 tny_merge_folder_set_ui_locker (TnyMergeFolder *self, TnyLockable *ui_locker) 1580 { 1581 TnyMergeFolderPriv *priv = TNY_MERGE_FOLDER_GET_PRIVATE (self); 1582 if (priv->ui_locker) 1583 g_object_unref (priv->ui_locker); 1584 priv->ui_locker = TNY_LOCKABLE (g_object_ref (ui_locker)); 1585 return; 1586 } 1587 1588 1481 1589 static void 1482 1590 tny_merge_folder_instance_init (GTypeInstance *instance, gpointer g_class) … … 1489 1597 priv->lock = g_new0 (GStaticRecMutex, 1); 1490 1598 g_static_rec_mutex_init (priv->lock); 1491 priv->obs ervers= NULL;1599 priv->obs = NULL; 1492 1600 priv->folder_type = TNY_FOLDER_TYPE_MERGE; 1601 priv->ui_locker = tny_noop_lockable_new (); 1493 1602 1494 1603 return; … … 1501 1610 TnyMergeFolderPriv *priv = TNY_MERGE_FOLDER_GET_PRIVATE (self); 1502 1611 TnyIterator *iter; 1503 1504 g_static_rec_mutex_lock (priv->lock); 1505 1506 iter = tny_list_create_iterator (priv->mothers); 1612 TnyList *copy; 1613 1614 g_static_rec_mutex_lock (priv->lock); 1615 copy = tny_list_copy (priv->mothers); 1616 g_static_rec_mutex_unlock (priv->lock); 1617 1618 iter = tny_list_create_iterator (copy); 1507 1619 while (!tny_iterator_is_done (iter)) 1508 1620 { … … 1512 1624 tny_iterator_next (iter); 1513 1625 } 1626 1514 1627 g_object_unref (iter); 1515 1516 if (priv->observers) 1517 g_object_unref (priv->observers); 1628 g_object_unref (copy); 1629 1630 1631 if (priv->obs) { 1632 GList *copy = priv->obs; 1633 while (copy) { 1634 g_object_weak_unref ((GObject *) copy->data, notify_observer_del, self); 1635 copy = g_list_next (copy); 1636 } 1637 g_list_free (priv->obs); 1638 priv->obs = NULL; 1639 } 1518 1640 1519 1641 g_object_unref (priv->mothers); 1642 g_object_unref (priv->ui_locker); 1520 1643 1521 1644 if (priv->id) … … 1524 1647 if (priv->name) 1525 1648 g_free (priv->name); 1526 1527 g_static_rec_mutex_unlock (priv->lock);1528 1649 1529 1650 /* g_static_rec_mutex_free (priv->lock); */ trunk/libtinymail/tny-merge-folder.h
r2825 r2983 32 32 #include <tny-folder-store.h> 33 33 #include <tny-folder-stats.h> 34 #include <tny-lockable.h> 34 35 35 36 G_BEGIN_DECLS … … 58 59 59 60 TnyFolder* tny_merge_folder_new (const gchar *folder_name); 61 TnyFolder* tny_merge_folder_new_with_ui_locker (const gchar *folder_name, TnyLockable *ui_locker); 62 void tny_merge_folder_set_ui_locker (TnyMergeFolder *self, TnyLockable *ui_locker); 60 63 void tny_merge_folder_add_folder (TnyMergeFolder *self, TnyFolder *folder); 61 64 void tny_merge_folder_remove_folder (TnyMergeFolder *self, TnyFolder *folder); trunk/tests/c-demo/tny-demoui-summary-view.c
r2896 r2983 177 177 { 178 178 tny_folder_monitor_stop (priv->monitor); 179 g_object_unref ( G_OBJECT (priv->monitor));179 g_object_unref (priv->monitor); 180 180 } 181 181 priv->monitor = NULL; … … 919 919 if (priv->monitor) { 920 920 tny_folder_monitor_stop (priv->monitor); 921 g_object_unref ( G_OBJECT (priv->monitor));921 g_object_unref (priv->monitor); 922 922 } 923 923 priv->monitor = TNY_FOLDER_MONITOR (tny_folder_monitor_new (folder)); … … 988 988 if (priv->monitor) { 989 989 tny_folder_monitor_stop (priv->monitor); 990 g_object_unref ( G_OBJECT (priv->monitor));990 g_object_unref (priv->monitor); 991 991 } 992 992 priv->monitor = TNY_FOLDER_MONITOR (tny_folder_monitor_new (merge)); … … 2047 2047 { 2048 2048 tny_folder_monitor_stop (priv->monitor); 2049 g_object_unref (G_OBJECT (priv->monitor)); 2049 g_object_unref (priv->monitor); 2050 priv->monitor = NULL; 2050 2051 } 2051 2052 g_mutex_unlock (priv->monitor_lock);
