process_shared 0.0.4 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/helper/extconf.rb +14 -0
- data/ext/helper/helper.c +70 -0
- data/lib/mach.rb +12 -0
- data/lib/mach/clock.rb +24 -0
- data/lib/mach/error.rb +56 -0
- data/lib/mach/functions.rb +342 -0
- data/lib/mach/host.rb +28 -0
- data/lib/mach/port.rb +143 -0
- data/lib/mach/semaphore.rb +74 -0
- data/lib/mach/task.rb +42 -0
- data/lib/mach/time_spec.rb +16 -0
- data/lib/process_shared.rb +17 -1
- data/lib/process_shared/binary_semaphore.rb +18 -7
- data/lib/process_shared/mach.rb +93 -0
- data/lib/process_shared/mach/semaphore.rb +39 -0
- data/lib/process_shared/posix/errno.rb +40 -0
- data/lib/process_shared/posix/libc.rb +78 -0
- data/lib/process_shared/posix/semaphore.rb +125 -0
- data/lib/process_shared/posix/shared_array.rb +71 -0
- data/lib/process_shared/posix/shared_memory.rb +82 -0
- data/lib/process_shared/posix/time_spec.rb +13 -0
- data/lib/process_shared/posix/time_val.rb +23 -0
- data/lib/process_shared/semaphore.rb +26 -73
- data/lib/process_shared/shared_array.rb +3 -1
- data/lib/process_shared/shared_memory.rb +10 -52
- data/lib/process_shared/time_spec.rb +22 -0
- data/spec/mach/port_spec.rb +21 -0
- data/spec/mach/scratch.rb +67 -0
- data/spec/mach/scratch2.rb +78 -0
- data/spec/mach/semaphore_spec.rb +60 -0
- data/spec/mach/task_spec.rb +31 -0
- data/spec/process_shared/scratch.rb +21 -0
- data/spec/process_shared/semaphore_spec.rb +12 -11
- data/spec/process_shared/shared_memory_spec.rb +1 -1
- metadata +46 -36
- data/ext/libpsem/bsem.c +0 -188
- data/ext/libpsem/bsem.h +0 -32
- data/ext/libpsem/constants.c +0 -22
- data/ext/libpsem/constants.h +0 -18
- data/ext/libpsem/extconf.rb +0 -40
- data/ext/libpsem/mempcpy.c +0 -7
- data/ext/libpsem/mempcpy.h +0 -13
- data/ext/libpsem/mutex.c +0 -15
- data/ext/libpsem/mutex.h +0 -14
- data/ext/libpsem/psem.c +0 -15
- data/ext/libpsem/psem.h +0 -45
- data/ext/libpsem/psem_error.c +0 -46
- data/ext/libpsem/psem_error.h +0 -11
- data/ext/libpsem/psem_posix.c +0 -160
- data/ext/libpsem/psem_posix.h +0 -10
- data/lib/process_shared/bounded_semaphore.rb +0 -46
- data/lib/process_shared/libc.rb +0 -36
- data/lib/process_shared/libpsem.bundle +0 -0
- data/lib/process_shared/libpsem.so +0 -0
- data/lib/process_shared/psem.rb +0 -113
- data/spec/process_shared/bounded_semaphore_spec.rb +0 -48
- data/spec/process_shared/libc_spec.rb +0 -9
- data/spec/process_shared/psem_spec.rb +0 -136
data/ext/libpsem/bsem.h
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
#ifndef __BSEM_H__
|
2
|
-
#define __BSEM_H__
|
3
|
-
|
4
|
-
#include "psem.h"
|
5
|
-
#include "psem_error.h"
|
6
|
-
|
7
|
-
struct bsem {
|
8
|
-
psem_t psem;
|
9
|
-
psem_t lock;
|
10
|
-
int maxvalue;
|
11
|
-
};
|
12
|
-
|
13
|
-
typedef struct bsem bsem_t;
|
14
|
-
|
15
|
-
extern size_t sizeof_bsem_t;
|
16
|
-
|
17
|
-
bsem_t * bsem_alloc();
|
18
|
-
void bsem_free(bsem_t *bsem);
|
19
|
-
|
20
|
-
int bsem_open(bsem_t *, const char *, unsigned int, unsigned int, error_t **);
|
21
|
-
int bsem_close(bsem_t *, error_t **);
|
22
|
-
int bsem_unlink(const char *, error_t **);
|
23
|
-
|
24
|
-
int bsem_post(bsem_t *, error_t **);
|
25
|
-
int bsem_wait(bsem_t *, error_t **);
|
26
|
-
int bsem_trywait(bsem_t *, error_t **);
|
27
|
-
int bsem_timedwait(bsem_t *, float, error_t **);
|
28
|
-
|
29
|
-
int bsem_getvalue(bsem_t *, int *, error_t **);
|
30
|
-
|
31
|
-
#endif /* __BSEM_H__ */
|
32
|
-
|
data/ext/libpsem/constants.c
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Define and extern various constants defined as macros.
|
3
|
-
*/
|
4
|
-
|
5
|
-
#include <sys/mman.h> /* PROT_*, MAP_* */
|
6
|
-
#include <fcntl.h> /* O_* */
|
7
|
-
|
8
|
-
#include "constants.h"
|
9
|
-
|
10
|
-
int o_rdwr = O_RDWR;
|
11
|
-
int o_creat = O_CREAT;
|
12
|
-
int o_excl = O_EXCL;
|
13
|
-
|
14
|
-
int prot_read = PROT_READ;
|
15
|
-
int prot_write = PROT_WRITE;
|
16
|
-
int prot_exec = PROT_EXEC;
|
17
|
-
int prot_none = PROT_NONE;
|
18
|
-
|
19
|
-
void * map_failed = MAP_FAILED;
|
20
|
-
|
21
|
-
int map_shared = MAP_SHARED;
|
22
|
-
int map_private = MAP_PRIVATE;
|
data/ext/libpsem/constants.h
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
#ifndef __CONSTANTS_H__
|
2
|
-
#define __CONSTANTS_H__
|
3
|
-
|
4
|
-
extern int o_rdwr;
|
5
|
-
extern int o_creat;
|
6
|
-
extern int o_excl;
|
7
|
-
|
8
|
-
extern int prot_read;
|
9
|
-
extern int prot_write;
|
10
|
-
extern int prot_exec;
|
11
|
-
extern int prot_none;
|
12
|
-
|
13
|
-
extern void * map_failed;
|
14
|
-
|
15
|
-
extern int map_shared;
|
16
|
-
extern int map_private;
|
17
|
-
|
18
|
-
#endif
|
data/ext/libpsem/extconf.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'mkmf'
|
2
|
-
|
3
|
-
$objs = []
|
4
|
-
|
5
|
-
# posix semaphores
|
6
|
-
if have_func('sem_open', 'semaphore.h') ||
|
7
|
-
($libs << '-lpthread' && have_func('sem_open', 'semaphore.h'))
|
8
|
-
have_func('floorf', 'math.h') or abort("Missing required floorf() in math.h")
|
9
|
-
have_library('m', 'floorf')
|
10
|
-
|
11
|
-
unless have_func('mempcpy', 'string.h')
|
12
|
-
$objs << 'mempcpy.o'
|
13
|
-
end
|
14
|
-
|
15
|
-
have_library('rt', 'sem_open')
|
16
|
-
else
|
17
|
-
abort('Win32 or platform without sem_open not supported (yet?)')
|
18
|
-
end
|
19
|
-
|
20
|
-
c_sources = ['psem.c', 'psem_error.c', 'psem_posix.c', 'bsem.c', 'constants.c']
|
21
|
-
$objs += ['psem.o', 'psem_error.o', 'bsem.o', 'constants.o']
|
22
|
-
|
23
|
-
if respond_to? :depend_rules
|
24
|
-
depend_rules <<-END
|
25
|
-
psem.c: psem.h psem_posix.c
|
26
|
-
psem_error.c: psem_error.h
|
27
|
-
|
28
|
-
bsem.h: psem.h psem_error.h
|
29
|
-
bsem.c: psem.h psem_error.h bsem.h
|
30
|
-
|
31
|
-
constants.c: constants.h
|
32
|
-
mempcpy.c: mempcpy.h
|
33
|
-
|
34
|
-
#{$objs.map { |o| "#{o}: #{o.chomp(".o")}.c" }.join("\n")}
|
35
|
-
|
36
|
-
libpsem.o: #{$objs.join(' ')}
|
37
|
-
END
|
38
|
-
end
|
39
|
-
|
40
|
-
create_makefile('libpsem')
|
data/ext/libpsem/mempcpy.c
DELETED
data/ext/libpsem/mempcpy.h
DELETED
data/ext/libpsem/mutex.c
DELETED
data/ext/libpsem/mutex.h
DELETED
data/ext/libpsem/psem.c
DELETED
data/ext/libpsem/psem.h
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
#ifndef __PSEM_H__
|
2
|
-
#define __PSEM_H__
|
3
|
-
|
4
|
-
/**
|
5
|
-
* Portable semaphore interface focusing on cross-process use.
|
6
|
-
*/
|
7
|
-
|
8
|
-
#include <stdlib.h> /* size_t */
|
9
|
-
|
10
|
-
#ifdef HAVE_SEM_OPEN
|
11
|
-
#include "psem_posix.h"
|
12
|
-
#endif
|
13
|
-
|
14
|
-
#include "psem_error.h"
|
15
|
-
|
16
|
-
typedef struct psem psem_t;
|
17
|
-
|
18
|
-
extern size_t sizeof_psem_t;
|
19
|
-
|
20
|
-
extern int OK;
|
21
|
-
extern int ERROR;
|
22
|
-
|
23
|
-
extern int E_SOURCE_SYSTEM;
|
24
|
-
extern int E_SOURCE_PSEM;
|
25
|
-
|
26
|
-
extern int E_NAME_TOO_LONG;
|
27
|
-
|
28
|
-
int psem_errno();
|
29
|
-
|
30
|
-
psem_t * psem_alloc();
|
31
|
-
void psem_free(psem_t *);
|
32
|
-
|
33
|
-
int psem_open(psem_t *, const char *, unsigned int, error_t **);
|
34
|
-
int psem_close(psem_t *, error_t **);
|
35
|
-
int psem_unlink(const char *, error_t **);
|
36
|
-
|
37
|
-
int psem_post(psem_t *, error_t **);
|
38
|
-
|
39
|
-
int psem_wait(psem_t *, error_t **);
|
40
|
-
int psem_trywait(psem_t *, error_t **);
|
41
|
-
int psem_timedwait(psem_t *, float, error_t **);
|
42
|
-
|
43
|
-
int psem_getvalue(psem_t *, int *, error_t **);
|
44
|
-
|
45
|
-
#endif /* __PSEM_H__ */
|
data/ext/libpsem/psem_error.c
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Similar to GError from GLib.
|
3
|
-
*/
|
4
|
-
|
5
|
-
#include <stdlib.h> /* malloc, free */
|
6
|
-
|
7
|
-
#include "psem_error.h"
|
8
|
-
|
9
|
-
struct error {
|
10
|
-
int error_source;
|
11
|
-
int error_number;
|
12
|
-
};
|
13
|
-
|
14
|
-
error_t *
|
15
|
-
error_alloc()
|
16
|
-
{
|
17
|
-
return (error_t *) malloc(sizeof (error_t));
|
18
|
-
}
|
19
|
-
|
20
|
-
void
|
21
|
-
error_free(error_t *err)
|
22
|
-
{
|
23
|
-
free(err);
|
24
|
-
}
|
25
|
-
|
26
|
-
void
|
27
|
-
error_set(error_t *err, int source, int value)
|
28
|
-
{
|
29
|
-
err->error_source = source;
|
30
|
-
err->error_number = value;
|
31
|
-
}
|
32
|
-
|
33
|
-
void
|
34
|
-
error_new(error_t **err, int source, int value)
|
35
|
-
{
|
36
|
-
if (err != NULL) {
|
37
|
-
if (*err == NULL) {
|
38
|
-
*err = error_alloc();
|
39
|
-
error_set(*err, source, value);
|
40
|
-
} else {
|
41
|
-
/* tried to create a new error atop an existing error... */
|
42
|
-
}
|
43
|
-
} else {
|
44
|
-
/* error is being ignored by caller */
|
45
|
-
}
|
46
|
-
}
|
data/ext/libpsem/psem_error.h
DELETED
data/ext/libpsem/psem_posix.c
DELETED
@@ -1,160 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
* A type which wraps a semaphore
|
3
|
-
*
|
4
|
-
* semaphore.c
|
5
|
-
*
|
6
|
-
* Copyright (c) 2006-2008, R Oudkerk
|
7
|
-
*
|
8
|
-
* All rights reserved.
|
9
|
-
*
|
10
|
-
* Redistribution and use in source and binary forms, with or without
|
11
|
-
* modification, are permitted provided that the following conditions
|
12
|
-
* are met:
|
13
|
-
*
|
14
|
-
* 1. Redistributions of source code must retain the above copyright
|
15
|
-
* notice, this list of conditions and the following disclaimer.
|
16
|
-
*
|
17
|
-
* 2. Redistributions in binary form must reproduce the above
|
18
|
-
* copyright notice, this list of conditions and the following
|
19
|
-
* disclaimer in the documentation and/or other materials provided
|
20
|
-
* with the distribution.
|
21
|
-
*
|
22
|
-
* 3. Neither the name of author nor the names of any contributors
|
23
|
-
* may be used to endorse or promote products derived from this
|
24
|
-
* software without specific prior written permission.
|
25
|
-
*
|
26
|
-
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS"
|
27
|
-
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
28
|
-
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
29
|
-
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR
|
30
|
-
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
31
|
-
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
32
|
-
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
33
|
-
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
34
|
-
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
35
|
-
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
36
|
-
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
37
|
-
* POSSIBILITY OF SUCH DAMAGE.
|
38
|
-
*/
|
39
|
-
|
40
|
-
/*
|
41
|
-
* Modifications Copyright (c) 2011, Patrick Mahoney
|
42
|
-
*/
|
43
|
-
|
44
|
-
#include <errno.h>
|
45
|
-
#include <fcntl.h> /* For O_* constants */
|
46
|
-
#include <sys/stat.h> /* For mode constants */
|
47
|
-
#include <semaphore.h>
|
48
|
-
#include <stdlib.h> /* malloc, free */
|
49
|
-
#include <math.h> /* floorf */
|
50
|
-
#include <time.h> /* timespec */
|
51
|
-
|
52
|
-
#include "psem.h"
|
53
|
-
#include "psem_posix.h"
|
54
|
-
|
55
|
-
psem_t *
|
56
|
-
psem_alloc(void) {
|
57
|
-
return (psem_t *) malloc(sizeof(psem_t));
|
58
|
-
}
|
59
|
-
|
60
|
-
void
|
61
|
-
psem_free(psem_t *psem) {
|
62
|
-
free(psem);
|
63
|
-
}
|
64
|
-
|
65
|
-
#define errcheck_val(expr, errval, err) \
|
66
|
-
do { \
|
67
|
-
if ((expr) == (errval)) { \
|
68
|
-
error_new((err), E_SOURCE_SYSTEM, errno); \
|
69
|
-
return ERROR; \
|
70
|
-
} \
|
71
|
-
} while (0)
|
72
|
-
|
73
|
-
#define errcheck(expr, err) errcheck_val((expr), -1, (err))
|
74
|
-
|
75
|
-
int
|
76
|
-
psem_open(psem_t *psem, const char *name, unsigned int value, error_t **err)
|
77
|
-
{
|
78
|
-
errcheck_val(psem->sem = sem_open(name, O_CREAT | O_EXCL, 0600, value),
|
79
|
-
SEM_FAILED,
|
80
|
-
err);
|
81
|
-
return OK;
|
82
|
-
}
|
83
|
-
|
84
|
-
int
|
85
|
-
psem_close(psem_t *psem, error_t **err)
|
86
|
-
{
|
87
|
-
errcheck(sem_close(psem->sem), err);
|
88
|
-
return OK;
|
89
|
-
}
|
90
|
-
|
91
|
-
int
|
92
|
-
psem_unlink(const char *name, error_t **err)
|
93
|
-
{
|
94
|
-
errcheck(sem_unlink(name), err);
|
95
|
-
return OK;
|
96
|
-
}
|
97
|
-
|
98
|
-
int
|
99
|
-
psem_post(psem_t *psem, error_t **err)
|
100
|
-
{
|
101
|
-
errcheck(sem_post(psem->sem), err);
|
102
|
-
return OK;
|
103
|
-
}
|
104
|
-
|
105
|
-
int
|
106
|
-
psem_wait(psem_t *psem, error_t **err)
|
107
|
-
{
|
108
|
-
errcheck(sem_wait(psem->sem), err);
|
109
|
-
return OK;
|
110
|
-
}
|
111
|
-
|
112
|
-
int
|
113
|
-
psem_trywait(psem_t *psem, error_t **err)
|
114
|
-
{
|
115
|
-
errcheck(sem_trywait(psem->sem), err);
|
116
|
-
return OK;
|
117
|
-
}
|
118
|
-
|
119
|
-
#define NS_PER_S (1000 * 1000 * 1000)
|
120
|
-
#define US_PER_NS (1000)
|
121
|
-
#define TV_NSEC_MAX (NS_PER_S - 1)
|
122
|
-
|
123
|
-
int
|
124
|
-
psem_timedwait(psem_t *psem, float timeout_s, error_t **err)
|
125
|
-
{
|
126
|
-
struct timeval now;
|
127
|
-
struct timespec abs_timeout;
|
128
|
-
|
129
|
-
errcheck(gettimeofday(&now, NULL), err);
|
130
|
-
abs_timeout.tv_sec = now.tv_sec;
|
131
|
-
abs_timeout.tv_nsec = now.tv_usec * US_PER_NS;
|
132
|
-
|
133
|
-
/* Fun with rounding: careful adding reltive timeout to abs time */
|
134
|
-
{
|
135
|
-
time_t sec; /* relative timeout */
|
136
|
-
long nsec;
|
137
|
-
|
138
|
-
sec = floorf(timeout_s);
|
139
|
-
nsec = floorf((timeout_s - floorf(timeout_s)) * NS_PER_S);
|
140
|
-
|
141
|
-
abs_timeout.tv_sec += sec;
|
142
|
-
abs_timeout.tv_nsec += nsec;
|
143
|
-
|
144
|
-
while (abs_timeout.tv_nsec > TV_NSEC_MAX) {
|
145
|
-
abs_timeout.tv_sec += 1;
|
146
|
-
abs_timeout.tv_nsec -= NS_PER_S;
|
147
|
-
}
|
148
|
-
}
|
149
|
-
|
150
|
-
errcheck(sem_timedwait(psem->sem, &abs_timeout), err);
|
151
|
-
return OK;
|
152
|
-
}
|
153
|
-
|
154
|
-
int
|
155
|
-
psem_getvalue(psem_t *psem, int *sval, error_t **err)
|
156
|
-
{
|
157
|
-
errcheck(sem_getvalue(psem->sem, sval), err);
|
158
|
-
return OK;
|
159
|
-
}
|
160
|
-
|