check_rss_recipient(
const char *recipient) /* I - Recipient URI */
{
+ int i, /* Looping var */
+ scount; /* Number of subscriptions */
cupsd_subscription_t *sub; /* Current subscription */
- for (sub = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions);
- sub;
- sub = (cupsd_subscription_t *)cupsArrayNext(Subscriptions))
+ _cupsRWLockRead(&SubscriptionsLock);
+
+ for (i = 0, scount = cupsArrayCount(Subscriptions); i < scount; i ++)
+ {
+ sub = (cupsd_subscription_t *)cupsArrayIndex(Subscriptions, i);
+
if (sub->recipient)
{
/*
if (*r1 == *r2)
return (0);
}
+ }
+
+ _cupsRWUnlock(&SubscriptionsLock);
return (1);
}
sub->expire = sub->lease ? time(NULL) + sub->lease : 0;
- _cupsRWUnlock(&sub->lock);
-
cupsdMarkDirty(CUPSD_DIRTY_SUBSCRIPTIONS);
con->response->request.status.status_code = IPP_STATUS_OK;
ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER,
"notify-lease-duration", sub->lease);
+
+ _cupsRWUnlock(&sub->lock);
}
cupsd_subscription_t *sub; /* Subscription */
- if (!Subscriptions)
- return;
-
_cupsRWLockWrite(&SubscriptionsLock);
+ if (!Subscriptions)
+ goto done;
+
for (sub = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions);
sub;
sub = (cupsd_subscription_t *)cupsArrayNext(Subscriptions))
+ {
cupsdDeleteSubscription(sub, -1);
+ }
cupsArrayDelete(Subscriptions);
Subscriptions = NULL;
+ done:
+
_cupsRWUnlock(&SubscriptionsLock);
}
cupsd_job_t *job) /* I - Job, if any */
{
cupsd_subscription_t *sub; /* Current subscription */
- int update; /* Update subscriptions.conf? */
+ int update = 0; /* Update subscriptions.conf? */
time_t curtime; /* Current time */
+ _cupsRWLockWrite(&SubscriptionsLock);
+
if (cupsArrayCount(Subscriptions) == 0)
- return;
+ goto done;
curtime = time(NULL);
- update = 0;
cupsdLogMessage(CUPSD_LOG_DEBUG, "Expiring subscriptions...");
- _cupsRWLockWrite(&SubscriptionsLock);
-
for (sub = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions);
sub;
sub = (cupsd_subscription_t *)cupsArrayNext(Subscriptions))
}
}
+ done:
+
_cupsRWUnlock(&SubscriptionsLock);
if (update)
* Yes, kill any processes that are left...
*/
+ _cupsRWLockWrite(&SubscriptionsLock);
+
for (sub = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions);
sub;
sub = (cupsd_subscription_t *)cupsArrayNext(Subscriptions))
+ {
if (sub->pid)
{
cupsdEndProcess(sub->pid, 0);
close(sub->pipe);
sub->pipe = -1;
}
+ }
+
+ _cupsRWUnlock(&SubscriptionsLock);
/*
* Close the status pipes...
cupsdLogMessage(CUPSD_LOG_CRIT,
"Unable to allocate memory for subscription #%d!",
sub->id);
- return;
+ goto done;
}
}
sub->next_event_id ++;
+ done:
+
_cupsRWUnlock(&sub->lock);
}