aboutsummaryrefslogtreecommitdiff
path: root/addprocess.h
blob: e4c04cb93b2602bfa82c269ecc2c81cc3dfa5483 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/* 0 <= mem.l <= mem.r <= mem.a */

/* add process to data structure, return index or -1 */
static int addprocess(void *p, char *service) {
  unsigned int root_len, serv_len = str_len(service) + 1;
  void *name;
  struct process *pr;

  root_len = mem.l + PROCESS_SIZE;
  if (root_len + serv_len + 32 > mem.r) 
    { write(1,"init: out of memory\n",20);  return -1; }

  mem.r -= serv_len;
  ++maxprocess;

  pr = root;
  root = mem.x + (mem.r & ~15) - root_len;
  byte_copy(root, mem.l, pr);

  pr = root + maxprocess;
  byte_copy(pr, PROCESS_SIZE, p);

  mem.l += PROCESS_SIZE;
  name = mem.x + mem.r;
  byte_copy(name, serv_len, service);

  pr->name = process_name_set;
  next_cron = 0;
  return maxprocess;
}