source: trunk/kernel/syscalls/sys_cond_var.c@ 8

Last change on this file since 8 was 1, checked in by alain, 10 years ago

First import

File size: 3.0 KB
Line 
1/*
2 * sys_cond_var: interface to access condition vraibles service
3 *
4 * Copyright (c) 2008,2009,2010,2011,2012 Ghassan Almaless
5 * Copyright (c) 2011,2012 UPMC Sorbonne Universites
6 *
7 * This file is part of ALMOS-kernel.
8 *
9 * ALMOS-kernel is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; version 2.0 of the License.
12 *
13 * ALMOS-kernel is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with ALMOS-kernel; if not, write to the Free Software Foundation,
20 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23#include <types.h>
24#include <errno.h>
25#include <thread.h>
26#include <kmem.h>
27#include <task.h>
28#include <vmm.h>
29#include <kmagics.h>
30#include <semaphore.h>
31#include <cond_var.h>
32
33static inline bool_t isBadSem(struct semaphore_s *sem)
34{
35 return vmm_check_object(sem, struct semaphore_s, SEMAPHORE_ID);
36}
37
38static inline bool_t isBadCV(struct cv_s *cv)
39{
40 return vmm_check_object(cv, struct cv_s, COND_VAR_ID);
41}
42
43int sys_cond_var(struct cv_s **cv, uint_t operation, struct semaphore_s **sem)
44{
45 kmem_req_t req;
46 struct cv_s *icv;
47 struct semaphore_s *isem;
48 error_t err = EINVAL;
49
50 if((err = vmm_check_address("usr cv ptr", current_task,cv,sizeof(struct cv_s*))))
51 goto SYS_COND_END;
52
53 if((err = cpu_copy_from_uspace(&icv, cv, sizeof(struct cv_s *))))
54 goto SYS_COND_END;
55
56 switch(operation)
57 {
58 case CV_INIT:
59 req.type = KMEM_CV;
60 req.size = sizeof(*icv);
61 req.flags = AF_USER;
62
63 if((icv = kmem_alloc(&req)) == NULL)
64 {
65 err = ENOMEM;
66 break;
67 }
68
69 if((err = cv_init(icv)))
70 break;
71
72 if((err = cpu_copy_to_uspace(cv, &icv, sizeof(struct cv_s *))))
73 {
74 req.ptr = icv;
75 kmem_free(&req);
76 }
77
78 break;
79
80 case CV_WAIT:
81 err = vmm_check_address("usr sem ptr",
82 current_task,
83 sem, sizeof(struct semaphore_s*));
84
85 if(err) break;
86
87 if((err = cpu_copy_from_uspace(&isem, sem, sizeof(struct semaphore_s *))))
88 break;
89
90 if(isBadSem(isem))
91 break;
92
93 if(isBadCV(icv))
94 break;
95
96 return cv_wait(icv, isem);
97
98 case CV_SIGNAL:
99 if(isBadCV(icv))
100 break;
101
102 return cv_signal(icv);
103
104 case CV_BROADCAST:
105 if(isBadCV(icv))
106 break;
107
108 return cv_broadcast(icv);
109
110 case CV_DESTROY:
111 if(isBadCV(icv))
112 break;
113
114 if((err = cv_destroy(icv)))
115 break;
116
117 req.type = KMEM_CV;
118 req.ptr = icv;
119 kmem_free(&req);
120 return 0;
121
122 default:
123 err = EINVAL;
124 }
125
126SYS_COND_END:
127 current_thread->info.errno = err;
128 return err;
129}
130
131KMEM_OBJATTR_INIT(cv_kmem_init)
132{
133 attr->type = KMEM_CV;
134 attr->name = "KCM Condition Variable";
135 attr->size = sizeof(struct cv_s);
136 attr->aligne = 0;
137 attr->min = CONFIG_CONDTION_VAR_MIN;
138 attr->max = CONFIG_CONDTION_VAR_MAX;
139 attr->ctor = NULL;
140 attr->dtor = NULL;
141
142 return 0;
143}
Note: See TracBrowser for help on using the repository browser.