aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2014-06-13 20:48:56 +0200
committerMattias Andrée <maandree@operamail.com>2014-06-13 20:48:56 +0200
commit37dc5ab973f08029e6bfc941333b768e31499109 (patch)
treeaa6d291dbcedca8c76940d2ffee0ae882de241ba
parentadd mutex (diff)
downloadcmdipc-37dc5ab973f08029e6bfc941333b768e31499109.tar.gz
cmdipc-37dc5ab973f08029e6bfc941333b768e31499109.tar.bz2
cmdipc-37dc5ab973f08029e6bfc941333b768e31499109.tar.xz
add condition
Signed-off-by: Mattias Andrée <maandree@operamail.com>
-rwxr-xr-xsrc/cmdipc49
1 files changed, 46 insertions, 3 deletions
diff --git a/src/cmdipc b/src/cmdipc
index 805123c..535be00 100755
--- a/src/cmdipc
+++ b/src/cmdipc
@@ -30,6 +30,7 @@ parser = ArgParser('System V and POSIX IPC from the command line',
'%s -Q [<options>] send [--] <message>' % sys.argv[0],
'%s -Q [<options>] receive' % sys.argv[0],
'%s -S [<options>] [p|v|z]' % sys.argv[0],
+ '%s -S [<options>] read' % sys.argv[0],
'%s -X [<options>]' % sys.argv[0],
'%s -X [<options>] enter' % sys.argv[0],
'%s -X [<options>] leave' % sys.argv[0],
@@ -37,7 +38,8 @@ parser = ArgParser('System V and POSIX IPC from the command line',
'%s -C [<options>] enter' % sys.argv[0],
'%s -C [<options>] leave' % sys.argv[0],
'%s -C [<options>] wait' % sys.argv[0],
- '%s -C [<options>] notify [all]' % sys.argv[0]]),
+ '%s -C [<options>] notify [all]' % sys.argv[0],
+ '%s -C [<options>] broadcast' % sys.argv[0]]),
None, None, True, ArgParser.standard_abbreviations())
@@ -57,8 +59,9 @@ parser.add_argumentless(['-x', '--exclusive'], 0, 'Create exclusive i
parser.add_argumentless(['-Q', '--mqueue'], 0, 'Use message queue')
parser.add_argumentless(['-S', '--semaphore'], 0, 'Use semaphore')
parser.add_argumentless(['-X', '--mutex'], 0, 'Use mutex (using semaphore)')
-#parser.add_argumentless(['-C', '--condition'], 0, 'Use condition (non-primitive)')
-#parser.add_argumentless(['-M', '--shm'], 0, 'Use shared memory')
+parser.add_argumentless(['-C', '--condition'], 0, 'Use condition (non-primitive)')
+#parser.add_argumentless(['-B', '--barrier'], 0, 'Use barrier (non-primitive)')
+#parser.add_argumentless(['-M', '--shm'], 0, 'Use shared memory')
parser.parse()
@@ -120,6 +123,8 @@ try:
if (len(parser.files) == 1) and (parser.files[0] == 'p'): s.P(timeout, delta)
elif (len(parser.files) == 1) and (parser.files[0] == 'v'): s.V(delta)
elif (len(parser.files) == 1) and (parser.files[0] == 'z'): s.Z(timeout)
+ elif (len(parser.files) == 1) and (parser.files[0] == 'read'):
+ print('%i' % s.value)
elif key is not None:
nocmd = True
if parser.opts['--remove'] is not None:
@@ -149,6 +154,44 @@ try:
print('Invalid command given', file = sys.stderr)
sys.exit(1)
+ elif parser.opts['--condition'] is not None:
+ key, flags, mode, timeout = [None, None, None], 0, 0o600, None
+ if parser.opts['--key'] is not None: key = parser.opts['--key'][0]
+ if parser.opts['--create'] is not None: flags = sysv_ipc.IPC_CREAT
+ if parser.opts['--exclusive'] is not None: flags = sysv_ipc.IPC_CREAT | sysv_ipc.IPC_EXCL
+ if parser.opts['--mode'] is not None: mode = int(parser.opts['--mode'][0], 8)
+ if parser.opts['--timeout'] is not None: timeout = float(parser.opts['--timeout'][0])
+ if key[0] is not None:
+ key = [int(k) for k in key.split('.')]
+ s = sysv_ipc.Semaphore(key[0], flags, mode, 1)
+ c = sysv_ipc.Semaphore(key[1], flags, mode, 0)
+ q = sysv_ipc.MessageQueue(key[2], flags, mode, 1)
+ if key[0] is None:
+ print('key: %i.%i.%i' % (s.key, c.key, q.key))
+ nocmd = False
+ if len(parser.files) == 1:
+ if parser.files[0] == 'enter': s.P(timeout)
+ elif parser.files[0] == 'leave': s.V()
+ elif parser.files[0] == 'wait': c.V() ; s.V() ; q.receive() ; s.P(timeout) ; c.P()
+ elif parser.files[0] == 'notify': q.send('N')
+ elif parser.files[0] == 'broadcast':
+ for _ in range(c.value):
+ q.send('N')
+ elif key[0] is not None:
+ nocmd = True
+ elif (len(parser.files) == 2) and (parser.files[0] == 'notify') and (parser.files[1] == 'all'):
+ for _ in range(min(c.value, 1)):
+ q.send('N')
+ elif key[0] is not None:
+ nocmd = True
+ if parser.opts['--remove'] is not None:
+ s.remove()
+ c.remove()
+ q.remove()
+ elif nocmd:
+ print('Invalid command given', file = sys.stderr)
+ sys.exit(1)
+
else:
print('No command given', file = sys.stderr)
sys.exit(1)