jobs.c
author lbatlle@npdl268.bpo.hp.com
Fri, 23 Mar 2007 14:34:16 +0100
changeset 9 9acd8ae3190c
parent 8 03339adb7014
child 18 af4898956964
permissions -rw-r--r--
First usable version!
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
     1
#include <stdlib.h>
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
     2
#include <stdio.h>
3
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
     3
#include <assert.h>
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
     4
#include "msg.h"
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
     5
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
     6
static enum
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
     7
{
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
     8
    FREE,
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
     9
    WAITING
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
    10
} state = FREE;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
    11
3
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    12
struct Job
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    13
{
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    14
    int jobid;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    15
    char command[CMD_LEN];
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    16
    enum Jobstate state;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    17
    struct Job *next;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    18
};
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    19
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    20
/* Globals */
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    21
static struct Job *firstjob = 0;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    22
static jobids = 0;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    23
5
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
    24
static void send_list_line(int s, const char * str)
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
    25
{
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
    26
    struct msg m;
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
    27
    int res;
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
    28
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
    29
    m.type = LIST_LINE;
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
    30
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
    31
    strcpy(m.u.line, str);
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
    32
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
    33
    res = write(s, &m, sizeof(m));
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
    34
    if(res == -1)
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
    35
        perror("write");
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
    36
}
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
    37
3
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    38
void s_list(int s)
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    39
{
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    40
    int i;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    41
    struct Job *p;
5
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
    42
    char buffer[LINE_LEN];
3
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    43
5
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
    44
    sprintf(buffer, "ID\tState\tCommand\n");
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
    45
    send_list_line(s,buffer);
3
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    46
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    47
    p = firstjob;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    48
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    49
    while(p != 0)
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    50
    {
5
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
    51
        sprintf(buffer, "%i\t%i\t%s\n",
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
    52
                p->jobid,
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
    53
                p->state,
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
    54
                p->command);
bc5e251418f3 The LIST_LINEs are outputed by the client.
viric@llimona
parents: 3
diff changeset
    55
        send_list_line(s,buffer);
3
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    56
        p = p->next;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    57
    }
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    58
}
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    59
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    60
static struct Job * newjobptr()
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    61
{
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    62
    struct Job *p;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    63
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    64
    if (firstjob == 0)
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    65
    {
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    66
        firstjob = (struct Job *) malloc(sizeof(*firstjob));
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    67
        firstjob->next = 0;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    68
        return firstjob;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    69
    }
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    70
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    71
    p = firstjob;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    72
    while(p->next != 0)
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    73
        p = p->next;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    74
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    75
    p->next = (struct Job *) malloc(sizeof(*p));
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    76
    p->next->next = 0;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    77
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    78
    return p->next;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    79
}
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    80
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    81
/* Returns job id */
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    82
int s_newjob(struct msg *m)
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    83
{
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    84
    struct Job *p;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    85
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    86
    p = newjobptr();
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    87
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    88
    p->jobid = jobids++;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    89
    p->state = QUEUED;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    90
    strcpy(p->command, m->u.command);
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    91
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    92
    return p->jobid;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    93
}
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    94
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    95
void s_removejob(int jobid)
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    96
{
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    97
    struct Job *p;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    98
    struct Job *newnext;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
    99
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   100
    if (firstjob->jobid == jobid)
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   101
    {
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   102
        struct Job *newfirst;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   103
        /* First job is to be removed */
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   104
        newfirst = firstjob->next;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   105
        free(firstjob);
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   106
        firstjob = newfirst;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   107
        return;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   108
    }
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   109
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   110
    p = firstjob;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   111
    /* Not first job */
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   112
    while (p->next != 0)
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   113
    {
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   114
        if (p->next->jobid == jobid)
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   115
            break;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   116
        p = p->next;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   117
    }
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   118
    assert(p->next != 0);
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   119
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   120
    newnext = p->next->next;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   121
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   122
    free(p->next);
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   123
    p->next = newnext;
2fb8a6bdd024 More code.
viric@llimona
parents:
diff changeset
   124
}
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   125
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   126
/* -1 if no one should be run. */
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   127
int next_run_job()
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   128
{
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   129
    if (state == WAITING)
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   130
        return -1;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   131
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   132
    if (firstjob != 0)
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   133
    {
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   134
        state = WAITING;
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   135
        return firstjob->jobid;
9
9acd8ae3190c First usable version!
lbatlle@npdl268.bpo.hp.com
parents: 8
diff changeset
   136
    }
8
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   137
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   138
    return -1;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   139
}
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   140
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   141
void job_finished()
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   142
{
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   143
    struct Job *newfirst;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   144
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   145
    assert(state == WAITING);
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   146
    assert(firstjob != 0);
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   147
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   148
    newfirst = firstjob->next;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   149
    free(firstjob);
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   150
    firstjob = newfirst;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   151
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   152
    state = FREE;
03339adb7014 Some more code for execution.
viric@llimona
parents: 5
diff changeset
   153
}