-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmailslot_vector.c
More file actions
74 lines (61 loc) · 2.06 KB
/
Copy pathmailslot_vector.c
File metadata and controls
74 lines (61 loc) · 2.06 KB
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <linux/semaphore.h>
#include <linux/slab.h>
#include "mailslot_vector.h"
#include "mailslot_vector.h"
#include "mailslot.h"
#include "macro.h"
struct semaphore *vector_lock[MINORS];
#define LOCK_MUTEX(device_instance) down(vector_lock[device_instance])
#define RELEASE_MUTEX(device_instance) up(vector_lock[device_instance])
struct mailslot_vector_s *create_new_mailslot_vector()
{
struct mailslot_vector_s *mailslots = kmalloc(sizeof(struct mailslot_vector_s), GFP_KERNEL);
int i;
if (mailslots == NULL)
{
printk("kmalloc failed while allocating the mailslot vector\n");
goto end;
}
mailslots->number_of_instances = 0;
memset(mailslots->mailslot_instances, 0, MINORS);
printk("Initializing the semaphores");
for (i = 0; i < MINORS; i++)
{
printk("semaphore number %d done", i);
vector_lock[i] = kmalloc(sizeof(struct semaphore), GFP_KERNEL);
sema_init(vector_lock[i], 1);
}
end:
return mailslots;
}
bool_t insert_new_mailslot(struct mailslot_vector_s *mailslot_vector, int device_instance, struct mailslot_s *mailslot)
{
bool_t inserted = FALSE;
LOCK_MUTEX(device_instance);
if (mailslot_vector->mailslot_instances[device_instance] == NULL)
{
mailslot_vector->mailslot_instances[device_instance] = mailslot;
mailslot_vector->number_of_instances += 1;
inserted = TRUE;
}
RELEASE_MUTEX(device_instance);
return inserted;
}
void remove_mailslot_instance(mailslot_vector_t mailslot_vector, int device_instance)
{
LOCK_MUTEX(device_instance);
if (mailslot_vector->mailslot_instances[device_instance] != NULL)
{
mailslot_vector->mailslot_instances[device_instance] = NULL;
mailslot_vector->number_of_instances -= 1;
}
RELEASE_MUTEX(device_instance);
}
mailslot_t get_mailslot(struct mailslot_vector_s *mailslots, int device_instance)
{
mailslot_t mailslot;
LOCK_MUTEX(device_instance);
mailslot = mailslots->mailslot_instances[device_instance];
RELEASE_MUTEX(device_instance);
return mailslot;
}