WINE_DEFAULT_DEBUG_CHANNEL(schedsvc);
-#define DWORD_MAX 0xffffffffUL
-
-typedef struct _JOB
-{
- LIST_ENTRY Entry;
- DWORD JobId;
-
- DWORD_PTR JobTime;
- DWORD DaysOfMonth;
- UCHAR DaysOfWeek;
- UCHAR Flags;
- WCHAR Command[1];
-} JOB, *PJOB;
-
-DWORD dwNextJobId = 0;
-DWORD dwJobCount = 0;
-LIST_ENTRY JobListHead;
-RTL_RESOURCE JobListLock;
-
/* FUNCTIONS *****************************************************************/
dwJobCount++;
/* Append the new job to the job list */
- InsertTailList(&JobListHead, &pJob->Entry);
+ InsertTailList(&JobListHead, &pJob->JobEntry);
/* Release the job list lock */
RtlReleaseResource(&JobListLock);
+ /* Save the job in the registry */
+ SaveJob(pJob);
+
+ // Calculate start time
+
+ // Insert job into start list
+
+ // Update start timer
+
/* Return the new job ID */
*pJobId = pJob->JobId;
TRACE("NetrJobDel(%S %lu %lu)\n",
ServerName, MinJobId, MaxJobId);
+ /* Check the job IDs */
+ if (MinJobId > MaxJobId)
+ return ERROR_INVALID_PARAMETER;
+
/* Acquire the job list lock exclusively */
RtlAcquireResourceExclusive(&JobListLock, TRUE);
JobEntry = JobListHead.Flink;
while (JobEntry != &JobListHead)
{
- CurrentJob = CONTAINING_RECORD(JobEntry, JOB, Entry);
+ CurrentJob = CONTAINING_RECORD(JobEntry, JOB, JobEntry);
if ((CurrentJob->JobId >= MinJobId) && (CurrentJob->JobId <= MaxJobId))
{
+ // Remove job from start list
+
+ // Update start timer
+
+ /* Remove the job from the registry */
+ DeleteJob(CurrentJob);
+
NextEntry = JobEntry->Flink;
if (RemoveEntryList(JobEntry))
{
JobEntry = JobListHead.Flink;
while (JobEntry != &JobListHead)
{
- CurrentJob = CONTAINING_RECORD(JobEntry, JOB, Entry);
+ CurrentJob = CONTAINING_RECORD(JobEntry, JOB, JobEntry);
if (dwIndex >= dwStartIndex)
{
JobEntry = JobListHead.Flink;
while (JobEntry != &JobListHead)
{
- CurrentJob = CONTAINING_RECORD(JobEntry, JOB, Entry);
+ CurrentJob = CONTAINING_RECORD(JobEntry, JOB, JobEntry);
if (dwIndex >= dwStartIndex)
{
JobEntry = JobListHead.Flink;
while (JobEntry != &JobListHead)
{
- CurrentJob = CONTAINING_RECORD(JobEntry, JOB, Entry);
+ CurrentJob = CONTAINING_RECORD(JobEntry, JOB, JobEntry);
/* Do we have the right job? */
if (CurrentJob->JobId == JobId)
* PROJECT: ReactOS Services
* FILE: base/services/schedsvc/schedsvc.c
* PURPOSE: Scheduling service
- * PROGRAMMER: Eric Kohl
+ * PROGRAMMER: Eric Kohl <eric.kohl@reactos.org>
*/
/* INCLUDES *****************************************************************/
case SERVICE_CONTROL_SHUTDOWN:
TRACE(" SERVICE_CONTROL_SHUTDOWN received\n");
UpdateServiceStatus(SERVICE_STOP_PENDING);
+ RpcMgmtStopServerListening(NULL);
UpdateServiceStatus(SERVICE_STOPPED);
return ERROR_SUCCESS;
ServiceInit(VOID)
{
HANDLE hThread;
+ DWORD dwError;
/* Initialize the job list */
InitializeListHead(&JobListHead);
/* Initialize the job list lock */
RtlInitializeResource(&JobListLock);
+ /* Initialize the start list */
+ InitializeListHead(&StartListHead);
+
+ /* Initialize the start list lock */
+ RtlInitializeResource(&StartListLock);
+
+ /* Load stored jobs from the registry */
+ dwError = LoadJobs();
+ if (dwError != ERROR_SUCCESS)
+ return dwError;
+
+ /* Start the RPC thread */
hThread = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)RpcThreadRoutine,