aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2014-06-14 22:17:00 +0200
committerMattias Andrée <maandree@operamail.com>2014-06-14 22:17:00 +0200
commitce7c0e67bb08fa5a83b3602e48b839850703615d (patch)
treecfeafbf9ef2eed38812884716ee13596adc57855
parentm (diff)
downloadcmdipc-ce7c0e67bb08fa5a83b3602e48b839850703615d.tar.gz
cmdipc-ce7c0e67bb08fa5a83b3602e48b839850703615d.tar.bz2
cmdipc-ce7c0e67bb08fa5a83b3602e48b839850703615d.tar.xz
implement rendezvous for posix
Signed-off-by: Mattias Andrée <maandree@operamail.com>
-rwxr-xr-xsrc/cmdipc36
1 files changed, 28 insertions, 8 deletions
diff --git a/src/cmdipc b/src/cmdipc
index 409b1dc..a618706 100755
--- a/src/cmdipc
+++ b/src/cmdipc
@@ -66,9 +66,9 @@ parser.add_argumentless(['-S', '--semaphore'], 0, 'Use semaphore')
parser.add_argumentless(['-M', '--shm'], 0, 'Use shared memory')
parser.add_argumentless(['-X', '--mutex'], 0, 'Use mutex (1 semaphore)')
parser.add_argumentless(['-C', '--condition'], 0, 'Use condition (3 semaphores)')
-parser.add_argumentless(['-B', '--barrier'], 0, 'Use barrier (2 semaphores; -P: 3 semaphores)')
+parser.add_argumentless(['-B', '--barrier'], 0, 'Use barrier (2 semaphores; -P: +1 semaphore)')
parser.add_argumentless(['-L', '--shared-lock'], 0, 'Use shared lock (3 semaphores)')
-parser.add_argumentless(['-R', '--rendezvous'], 0, 'Use rendezvous (2 semaphores, 1 mqueue, SysV only)')
+parser.add_argumentless(['-R', '--rendezvous'], 0, 'Use rendezvous (2 semaphores, 1 mqueue; -P: +1 semaphore)')
parser.parse()
@@ -369,10 +369,11 @@ try:
print('Invalid command given', file = sys.stderr)
sys.exit(1)
- elif (not use_posix) and (parser.opts['--rendezvous'] is not None):
+ elif parser.opts['--rendezvous'] is not None:
key, flags, mode, spool, size, timeout = [None, None, None], 0, 0o600, 2, 8192, None
if use_posix:
spool, size = 1, 2048
+ key = [None] * 4
if parser.opts['--nonblocking'] is not None: timeout = 0
if parser.opts['--key'] is not None: key = ipc.keysep(parser.opts['--key'][0])
if parser.opts['--create'] is not None: flags = ipc.CREAT
@@ -384,8 +385,13 @@ try:
m = ipc.Semaphore(key[0], flags, mode, 1)
i = ipc.Semaphore(key[1], flags, mode, 0)
q = ipc.MessageQueue(key[2], flags, mode, spool, size)
+ if use_posix:
+ p = ipc.Semaphore(key[3], flags, mode, 0)
if key[0] is None:
- print('key: %s' % ipc.keycat(m.key, i.key, q.key))
+ if use_posix:
+ print('key: %s' % ipc.keycat(m.key, i.key, q.key, p.key))
+ else:
+ print('key: %s' % ipc.keycat(m.key, i.key, q.key))
nocmd = False
if len(parser.files) > 0:
send_message = ' '.join(parser.files).encode('utf-8')
@@ -393,13 +399,23 @@ try:
if i.value == 0:
i.V()
m.V()
- q.send(send_message, timeout, 1)
- (recv_message, _type) = q.receive(timeout, 2)
+ if not use_posix:
+ q.send(send_message, timeout, 1)
+ (recv_message, _type) = q.receive(timeout, 2)
+ else:
+ q.send(send_message, timeout)
+ p.P()
+ (recv_message, _prio) = q.receive(timeout)
else:
i.P(timeout)
m.V()
- (recv_message, _type) = q.receive(timeout, 1)
- q.send(send_message, timeout, 2)
+ if not use_posix:
+ (recv_message, _type) = q.receive(timeout, 1)
+ q.send(send_message, timeout, 2)
+ else:
+ (recv_message, _prio) = q.receive(timeout)
+ p.V()
+ q.send(send_message, timeout)
print('length: %i' % len(recv_message))
sys.stdout.buffer.write(recv_message)
sys.stdout.buffer.write(b'\n')
@@ -410,10 +426,14 @@ try:
m.remove()
i.remove()
q.remove()
+ if use_posix:
+ p.remove()
elif nocmd:
m.close()
i.close()
q.close()
+ if use_posix:
+ p.close()
print('Invalid command given', file = sys.stderr)
sys.exit(1)