sem_new.c (201561) | sem_new.c (201715) |
---|---|
1/* 2 * Copyright (C) 2010 David Xu <davidxu@freebsd.org>. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 12 unchanged lines hidden (view full) --- 21 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 27 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * | 1/* 2 * Copyright (C) 2010 David Xu <davidxu@freebsd.org>. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 12 unchanged lines hidden (view full) --- 21 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 27 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * |
29 * $FreeBSD: head/lib/libc/gen/sem_new.c 201561 2010-01-05 06:40:27Z davidxu $ | 29 * $FreeBSD: head/lib/libc/gen/sem_new.c 201715 2010-01-07 04:15:49Z davidxu $ |
30 */ 31 32#include "namespace.h" 33#include <sys/types.h> 34#include <sys/queue.h> 35#include <sys/mman.h> 36#include <sys/stat.h> 37#include <errno.h> --- 100 unchanged lines hidden (view full) --- 138{ 139 char path[PATH_MAX]; 140 141 struct stat sb; 142 va_list ap; 143 struct sem_nameinfo *ni = NULL; 144 sem_t *sem = NULL; 145 int fd = -1, mode, len; | 30 */ 31 32#include "namespace.h" 33#include <sys/types.h> 34#include <sys/queue.h> 35#include <sys/mman.h> 36#include <sys/stat.h> 37#include <errno.h> --- 100 unchanged lines hidden (view full) --- 138{ 139 char path[PATH_MAX]; 140 141 struct stat sb; 142 va_list ap; 143 struct sem_nameinfo *ni = NULL; 144 sem_t *sem = NULL; 145 int fd = -1, mode, len; |
146 int value = 0; |
|
146 147 if (name[0] != '/') { 148 errno = EINVAL; 149 return (NULL); 150 } 151 name++; 152 153 if (flags & ~(O_CREAT|O_EXCL)) { --- 11 unchanged lines hidden (view full) --- 165 _pthread_mutex_unlock(&sem_llock); 166 return (sem); 167 } 168 } 169 170 if (flags & O_CREAT) { 171 va_start(ap, flags); 172 mode = va_arg(ap, int); | 147 148 if (name[0] != '/') { 149 errno = EINVAL; 150 return (NULL); 151 } 152 name++; 153 154 if (flags & ~(O_CREAT|O_EXCL)) { --- 11 unchanged lines hidden (view full) --- 166 _pthread_mutex_unlock(&sem_llock); 167 return (sem); 168 } 169 } 170 171 if (flags & O_CREAT) { 172 va_start(ap, flags); 173 mode = va_arg(ap, int); |
174 value = va_arg(ap, int); |
|
173 va_end(ap); 174 } 175 176 len = sizeof(*ni) + strlen(name) + 1; 177 ni = (struct sem_nameinfo *)malloc(len); 178 if (ni == NULL) { 179 errno = ENOSPC; 180 goto error; --- 17 unchanged lines hidden (view full) --- 198 flock(fd, LOCK_UN); 199 goto error; 200 } 201 if (sb.st_size < sizeof(sem_t)) { 202 sem_t tmp; 203 204 tmp._magic = SEM_MAGIC; 205 tmp._kern._has_waiters = 0; | 175 va_end(ap); 176 } 177 178 len = sizeof(*ni) + strlen(name) + 1; 179 ni = (struct sem_nameinfo *)malloc(len); 180 if (ni == NULL) { 181 errno = ENOSPC; 182 goto error; --- 17 unchanged lines hidden (view full) --- 200 flock(fd, LOCK_UN); 201 goto error; 202 } 203 if (sb.st_size < sizeof(sem_t)) { 204 sem_t tmp; 205 206 tmp._magic = SEM_MAGIC; 207 tmp._kern._has_waiters = 0; |
206 tmp._kern._count = 0; | 208 tmp._kern._count = value; |
207 tmp._kern._flags = USYNC_PROCESS_SHARED | SEM_NAMED; 208 if (_write(fd, &tmp, sizeof(tmp)) != sizeof(tmp)) { 209 flock(fd, LOCK_UN); 210 goto error; 211 } 212 } 213 flock(fd, LOCK_UN); 214 sem = (sem_t *)mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, --- 243 unchanged lines hidden --- | 209 tmp._kern._flags = USYNC_PROCESS_SHARED | SEM_NAMED; 210 if (_write(fd, &tmp, sizeof(tmp)) != sizeof(tmp)) { 211 flock(fd, LOCK_UN); 212 goto error; 213 } 214 } 215 flock(fd, LOCK_UN); 216 sem = (sem_t *)mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, --- 243 unchanged lines hidden --- |