[asterisk-commits] twilson: branch twilson/calendaring r167056 - in /team/twilson/calendaring: i...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Dec 31 16:47:35 CST 2008


Author: twilson
Date: Wed Dec 31 16:47:34 2008
New Revision: 167056

URL: http://svn.digium.com/view/asterisk?view=rev&rev=167056
Log:
Don't delete all calendars and re-add on reload.  Mark as needing to be deleted and merge/delete when necessary. (also as per russell on reviewboard).  I also fixed a memory leak that arose from a utility function that I created that initialized an events stringfield for me, but I forgot to remove the manual initializations.

Modified:
    team/twilson/calendaring/include/asterisk/calendar.h
    team/twilson/calendaring/main/calendar.c
    team/twilson/calendaring/res/res_caldav.c
    team/twilson/calendaring/res/res_icalendar.c

Modified: team/twilson/calendaring/include/asterisk/calendar.h
URL: http://svn.digium.com/view/asterisk/team/twilson/calendaring/include/asterisk/calendar.h?view=diff&rev=167056&r1=167055&r2=167056
==============================================================================
--- team/twilson/calendaring/include/asterisk/calendar.h (original)
+++ team/twilson/calendaring/include/asterisk/calendar.h Wed Dec 31 16:47:34 2008
@@ -120,7 +120,8 @@
 	int timeframe;       /*!< Span (in mins) of calendar data to pull with each request */
 	pthread_t thread;    /*!< The thread that the calendar is loaded/updated in */
 	ast_cond_t unload;
-	int unloading;
+	int unloading:1;
+	int pending_deletion:1;
 	struct ao2_container *events;  /*!< The events that are known at this time */
 };
 

Modified: team/twilson/calendaring/main/calendar.c
URL: http://svn.digium.com/view/asterisk/team/twilson/calendaring/main/calendar.c?view=diff&rev=167056&r1=167055&r2=167056
==============================================================================
--- team/twilson/calendaring/main/calendar.c (original)
+++ team/twilson/calendaring/main/calendar.c Wed Dec 31 16:47:34 2008
@@ -196,22 +196,28 @@
 {
 	struct ast_calendar *cal;
 	struct ast_variable *v;
-
-	if (!(cal = ao2_alloc(sizeof(*cal), calendar_destructor))) {
-		ast_log(LOG_ERROR, "Could not allocate calendar structure. Stopping.\n");
-		return NULL;
-	}
-
-	if (!(cal->events = ao2_container_alloc(MAX_BUCKETS, event_hash_fn, event_cmp_fn))) {
-		ast_log(LOG_ERROR, "Could not allocate events container for %s\n", cat);
-		cal = unref_calendar(cal);
-		return NULL;
-	}
-
-	if (ast_string_field_init(cal, 32)) {
-		ast_log(LOG_ERROR, "Couldn't create string fields for %s\n", cat);
-		cal = unref_calendar(cal);
-		return NULL;
+	int new_calendar = 0;
+
+	if (!(cal = find_calendar(cat))) {
+		new_calendar = 1;
+		if (!(cal = ao2_alloc(sizeof(*cal), calendar_destructor))) {
+			ast_log(LOG_ERROR, "Could not allocate calendar structure. Stopping.\n");
+			return NULL;
+		}
+
+		if (!(cal->events = ao2_container_alloc(MAX_BUCKETS, event_hash_fn, event_cmp_fn))) {
+			ast_log(LOG_ERROR, "Could not allocate events container for %s\n", cat);
+			cal = unref_calendar(cal);
+			return NULL;
+		}
+
+		if (ast_string_field_init(cal, 32)) {
+			ast_log(LOG_ERROR, "Couldn't create string fields for %s\n", cat);
+			cal = unref_calendar(cal);
+			return NULL;
+		}
+	} else {
+		cal->pending_deletion = 0;
 	}
 
 	ast_string_field_set(cal, name, cat);
@@ -242,8 +248,12 @@
 		}
 	}
 
-	cal->thread = AST_PTHREADT_NULL;
-	ast_cond_init(&cal->unload, NULL);
+	if (new_calendar) {
+		cal->thread = AST_PTHREADT_NULL;
+		ast_cond_init(&cal->unload, NULL);
+		ao2_link(calendars, cal);
+		ast_pthread_create(&cal->thread, NULL, cal->tech->load_calendar, cal);
+	}
 
 	return cal;
 }
@@ -268,10 +278,6 @@
 			ast_calendar_unregister(tech);
 			return -1;
 		}
-
-		ao2_link(calendars, cal);
-
-		ast_pthread_create(&cal->thread, NULL, cal->tech->load_calendar, cal);
 
 		cal = unref_calendar(cal);
 	}
@@ -340,11 +346,6 @@
 	ast_string_field_free_memory(event);
 
 	return;
-}
-
-static int cb_true(void *user_data, void *arg, int flags)
-{
-	return CMP_MATCH;
 }
 
 /* This is only called from ao2_callbacks that are going to unref the event for us,
@@ -1078,12 +1079,6 @@
 	}
 
 	if (!(event = ast_calendar_event_alloc(cal))) {
-		ast_log(LOG_ERROR, "Could not allocate memory for event\n");
-		goto write_cleanup;
-	}
-
-	if (ast_string_field_init(event, 32)) {
-		ast_log(LOG_ERROR, "Could not allocate memory for event stringfields\n");
 		goto write_cleanup;
 	}
 
@@ -1371,12 +1366,28 @@
 	.read = calendar_event_read,
 };
 
+static int cb_pending_deletion(void *user_data, void *arg, int flags)
+{
+	struct ast_calendar *cal = user_data;
+
+	cal->pending_deletion = 1;
+
+	return CMP_MATCH;
+}
+
+static int cb_rm_pending_deletion(void *user_data, void *arg, int flags)
+{
+	struct ast_calendar *cal = user_data;
+
+	return cal->pending_deletion ? CMP_MATCH : 0;
+}
+
 int ast_calendar_reload()
 {
 	struct ast_calendar_tech *iter;
 
-	/* Delete all calendars */
-	ao2_callback(calendars, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, cb_true, NULL);
+	/* Mark existing calendars for deletion */
+	ao2_callback(calendars, OBJ_NODATA | OBJ_MULTIPLE, cb_pending_deletion, NULL);
 	load_config(NULL);
 
 	AST_LIST_LOCK(&techs);
@@ -1386,6 +1397,9 @@
 		}
 	}
 	AST_LIST_UNLOCK(&techs);
+
+	/* Delete calendars that no longer show up in the config */
+	ao2_callback(calendars, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, cb_rm_pending_deletion, NULL);
 
 	return 0;
 }

Modified: team/twilson/calendaring/res/res_caldav.c
URL: http://svn.digium.com/view/asterisk/team/twilson/calendaring/res/res_caldav.c?view=diff&rev=167056&r1=167055&r2=167056
==============================================================================
--- team/twilson/calendaring/res/res_caldav.c (original)
+++ team/twilson/calendaring/res/res_caldav.c Wed Dec 31 16:47:34 2008
@@ -152,6 +152,7 @@
 	ne_add_request_header(req, "Content-type", ast_strlen_zero(content_type) ? "text/xml" : content_type);
 
 	ret = ne_request_dispatch(req);
+	ne_request_destroy(req);
 
 	if (ret != NE_OK || !ast_str_strlen(response)) {
 		ast_log(LOG_WARNING, "Unknown response to CalDAV calendar %s, request %s to %s: %s\n", pvt->owner->name, method, pvt->url, ne_get_error(pvt->session));
@@ -316,12 +317,6 @@
 		return;
 	}
 
-	if (ast_string_field_init(event, 32)) {
-		ast_log(LOG_ERROR, "Could not allocate string fields for event!\n");
-		event = ast_calendar_unref_event(event);
-		return;
-	}
-
 	start = icaltime_from_timet_with_zone(span->start, 0, utc);
 	end = icaltime_from_timet_with_zone(span->end, 0, utc);
 	event->start = span->start;

Modified: team/twilson/calendaring/res/res_icalendar.c
URL: http://svn.digium.com/view/asterisk/team/twilson/calendaring/res/res_icalendar.c?view=diff&rev=167056&r1=167055&r2=167056
==============================================================================
--- team/twilson/calendaring/res/res_icalendar.c (original)
+++ team/twilson/calendaring/res/res_icalendar.c Wed Dec 31 16:47:34 2008
@@ -180,12 +180,6 @@
 		return;
 	}
 
-	if (ast_string_field_init(event, 32)) {
-		ast_log(LOG_ERROR, "Could not allocate string fields for event!\n");
-		event = ast_calendar_unref_event(event);
-		return;
-	}
-
 	start = icaltime_from_timet_with_zone(span->start, 0, utc);
 	end = icaltime_from_timet_with_zone(span->end, 0, utc);
 	event->start = span->start;




More information about the asterisk-commits mailing list