/*
- * "$Id: sysman.c 7928 2008-09-10 22:14:22Z mike $"
+ * "$Id: sysman.c 11106 2013-07-08 12:29:10Z msweet $"
*
* System management functions for the CUPS scheduler.
*
- * Copyright 2007-2011 by Apple Inc.
+ * Copyright 2007-2013 by Apple Inc.
* Copyright 2006 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
# include <IOKit/pwr_mgt/IOPMLib.h>
# ifdef HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H
# include <IOKit/pwr_mgt/IOPMLibPrivate.h>
+# else
+# define kIOPMAssertionTypeDenySystemSleep CFSTR("DenySystemSleep")
# endif /* HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H */
#endif /* __APPLE__ */
* Local globals...
*/
-#ifdef kIOPMAssertionTypeDenySystemSleep
-static IOPMAssertionID dark_wake = 0; /* "Dark wake" assertion for sharing */
-#endif /* kIOPMAssertionTypeDenySystemSleep */
+#if defined(kIOPMAssertionTypeDenySystemSleep) || defined(kIOPMAssertNetworkClientActive)
+static IOPMAssertionID keep_awake = 0; /* Keep the system awake while printing */
+#endif /* kIOPMAssertionTypeDenySystemSleep || kIOPMAssertNetworkClientActive */
/*
if (DirtyFiles & CUPSD_DIRTY_CLASSES)
cupsdSaveAllClasses();
- if (DirtyFiles & CUPSD_DIRTY_REMOTE)
- cupsdSaveRemoteCache();
-
if (DirtyFiles & CUPSD_DIRTY_PRINTCAP)
cupsdWritePrintcap();
void
cupsdMarkDirty(int what) /* I - What file(s) are dirty? */
{
- cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdMarkDirty(%c%c%c%c%c%c)",
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdMarkDirty(%c%c%c%c%c)",
(what & CUPSD_DIRTY_PRINTERS) ? 'P' : '-',
(what & CUPSD_DIRTY_CLASSES) ? 'C' : '-',
- (what & CUPSD_DIRTY_REMOTE) ? 'R' : '-',
(what & CUPSD_DIRTY_PRINTCAP) ? 'p' : '-',
(what & CUPSD_DIRTY_JOBS) ? 'J' : '-',
(what & CUPSD_DIRTY_SUBSCRIPTIONS) ? 'S' : '-');
if (job)
newbusy |= 2;
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "cupsdSetBusyState: newbusy=\"%s\", busy=\"%s\"",
+ busy_text[newbusy], busy_text[busy]);
+
/*
* Manage state changes...
*/
vtran = 0;
}
#endif /* HAVE_VPROC_TRANSACTION_BEGIN */
+ }
-#ifdef kIOPMAssertionTypeDenySystemSleep
- if ((busy & 2) && !dark_wake)
- IOPMAssertionCreateWithName(kIOPMAssertionTypeDenySystemSleep,
- kIOPMAssertionLevelOn,
- CFSTR("org.cups.cupsd"), &dark_wake);
- else if (!(busy & 2) && dark_wake)
- {
- IOPMAssertionRelease(dark_wake);
- dark_wake = 0;
- }
-#endif /* kIOPMAssertionTypeDenySystemSleep */
+#if defined(kIOPMAssertionTypeDenySystemSleep) || defined(kIOPMAssertNetworkClientActive)
+ if (cupsArrayCount(PrintingJobs) > 0 && !keep_awake)
+ {
+# ifdef kIOPMAssertNetworkClientActive
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Asserting NetworkClientActive.");
+
+ IOPMAssertionCreateWithName(kIOPMAssertNetworkClientActive,
+ kIOPMAssertionLevelOn,
+ CFSTR("org.cups.cupsd"), &keep_awake);
- cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdSetBusyState: %s", busy_text[busy]);
+# else
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Asserting DenySystemSleep.");
+
+ IOPMAssertionCreateWithName(kIOPMAssertionTypeDenySystemSleep,
+ kIOPMAssertionLevelOn,
+ CFSTR("org.cups.cupsd"), &keep_awake);
+
+# endif /* kIOPMAssertNetworkClientActive */
}
+ else if (cupsArrayCount(PrintingJobs) == 0 && keep_awake)
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Releasing power assertion.");
+ IOPMAssertionRelease(keep_awake);
+ keep_awake = 0;
+ }
+#endif /* kIOPMAssertionTypeDenySystemSleep || kIOPMAssertNetworkClientActive */
}
# define SYSEVENT_NAMECHANGED 0x10 /* Computer name changed */
-/*
- * Structures...
+/*
+ * Structures...
*/
typedef struct cupsd_sysevent_s /*** System event data ****/
} cupsd_thread_data_t;
-/*
- * Local globals...
+/*
+ * Local globals...
*/
static pthread_t SysEventThread = NULL;
/* Thread to host a runloop */
static pthread_mutex_t SysEventThreadMutex = { 0 };
- /* Coordinates access to shared gloabals */
+ /* Coordinates access to shared gloabals */
static pthread_cond_t SysEventThreadCond = { 0 };
/* Thread initialization complete condition */
static CFRunLoopRef SysEventRunloop = NULL;
static cupsd_sysevent_t LastSysEvent; /* Last system event (for delayed sleep) */
-/*
- * Local functions...
+/*
+ * Local functions...
*/
static void *sysEventThreadEntry(void);
kSCEntNetIPv6);
if (!NetworkGlobalKeyDNS)
- NetworkGlobalKeyDNS =
- SCDynamicStoreKeyCreateNetworkGlobalEntity(kCFAllocatorDefault,
+ NetworkGlobalKeyDNS =
+ SCDynamicStoreKeyCreateNetworkGlobalEntity(kCFAllocatorDefault,
kSCDynamicStoreDomainState,
kSCEntNetDNS);
threadData.timerRef =
CFRunLoopTimerCreate(kCFAllocatorDefault,
- CFAbsoluteTimeGetCurrent() + (86400L * 365L * 10L),
+ CFAbsoluteTimeGetCurrent() + (86400L * 365L * 10L),
86400L * 365L * 10L, 0, 0, sysEventTimerNotifier,
&timerContext);
CFRunLoopAddTimer(CFRunLoopGetCurrent(), threadData.timerRef,
break;
case kIOMessageSystemHasPoweredOn:
- /*
+ /*
* Because powered on is followed by a net-changed event, delay
* before sending it.
*/
if (sendit == 1)
{
- /*
+ /*
* Send the event to the main thread now.
*/
}
else
{
- /*
+ /*
* Send the event to the main thread after 1 to 2 seconds.
*/
threadData = (cupsd_thread_data_t *)context;
-
+
(void)store; /* anti-compiler-warning-code */
CFRange range = CFRangeMake(0, CFArrayGetCount(changedKeys));
}
/*
- * Because we registered for several different kinds of change notifications
- * this callback usually gets called several times in a row. We use a timer to
+ * Because we registered for several different kinds of change notifications
+ * this callback usually gets called several times in a row. We use a timer to
* de-bounce these so we only end up generating one event for the main thread.
*/
- CFRunLoopTimerSetNextFireDate(threadData->timerRef,
+ CFRunLoopTimerSetNextFireDate(threadData->timerRef,
CFAbsoluteTimeGetCurrent() + 5);
}
p;
p = (cupsd_printer_t *)cupsArrayNext(Printers))
{
- if (p->type & CUPS_PRINTER_DISCOVERED)
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "Deleting remote destination \"%s\"", p->name);
- cupsArraySave(Printers);
- cupsdDeletePrinter(p, 0);
- cupsArrayRestore(Printers);
- }
- else
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "Deregistering local printer \"%s\"", p->name);
- cupsdDeregisterPrinter(p, 0);
- }
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "Deregistering local printer \"%s\"", p->name);
+ cupsdDeregisterPrinter(p, 0);
}
cupsdCleanDirty();
+#ifdef kIOPMAssertionTypeDenySystemSleep
+ /*
+ * Remove our assertion as needed since the user wants the system to
+ * sleep (different than idle sleep)...
+ */
+
+ if (keep_awake)
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Releasing dark wake assertion.");
+ IOPMAssertionRelease(keep_awake);
+ keep_awake = 0;
+ }
+#endif /* kIOPMAssertionTypeDenySystemSleep */
+
/*
* If we have no printing jobs, allow the power change immediately.
* Otherwise set the SleepJobs time to 15 seconds in the future when
IOAllowPowerChange(sysevent.powerKernelPort,
sysevent.powerNotificationID);
Sleeping = 0;
+
+#ifdef kIOPMAssertionTypeDenySystemSleep
+ if (cupsArrayCount(PrintingJobs) > 0 && !keep_awake)
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Asserting dark wake.");
+ IOPMAssertionCreateWithName(kIOPMAssertionTypeDenySystemSleep,
+ kIOPMAssertionLevelOn,
+ CFSTR("org.cups.cupsd"), &keep_awake);
+ }
+#endif /* kIOPMAssertionTypeDenySystemSleep */
+
cupsdCheckJobs();
}
if (sysevent.event & SYSEVENT_NETCHANGED)
{
if (!Sleeping)
- {
cupsdLogMessage(CUPSD_LOG_DEBUG,
"System network configuration changed");
-
- /*
- * Resetting browse_time before calling cupsdSendBrowseList causes
- * browse packets to be sent for local shared printers.
- */
-
- for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
- p;
- p = (cupsd_printer_t *)cupsArrayNext(Printers))
- p->browse_time = 0;
-
- cupsdSendBrowseList();
- cupsdRestartPolling();
- }
else
cupsdLogMessage(CUPSD_LOG_DEBUG,
"System network configuration changed; "
p = (cupsd_printer_t *)cupsArrayNext(Printers))
cupsdDeregisterPrinter(p, 1);
+# if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
/*
* Update the computer name and BTMM domain list...
*/
cupsdUpdateDNSSDName();
+# endif /* HAVE_DNSSD || HAVE_AVAHI */
/*
* Now re-register them...
for (p = (cupsd_printer_t *)cupsArrayFirst(Printers);
p;
p = (cupsd_printer_t *)cupsArrayNext(Printers))
- {
- p->browse_time = 0;
cupsdRegisterPrinter(p);
- }
}
else
cupsdLogMessage(CUPSD_LOG_DEBUG,
/*
- * End of "$Id: sysman.c 7928 2008-09-10 22:14:22Z mike $".
+ * End of "$Id: sysman.c 11106 2013-07-08 12:29:10Z msweet $".
*/