From 37dc5ab973f08029e6bfc941333b768e31499109 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Fri, 13 Jun 2014 20:48:56 +0200 Subject: add condition MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/cmdipc | 49 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) (limited to 'src') 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 [] send [--] ' % sys.argv[0], '%s -Q [] receive' % sys.argv[0], '%s -S [] [p|v|z]' % sys.argv[0], + '%s -S [] read' % sys.argv[0], '%s -X []' % sys.argv[0], '%s -X [] enter' % sys.argv[0], '%s -X [] leave' % sys.argv[0], @@ -37,7 +38,8 @@ parser = ArgParser('System V and POSIX IPC from the command line', '%s -C [] enter' % sys.argv[0], '%s -C [] leave' % sys.argv[0], '%s -C [] wait' % sys.argv[0], - '%s -C [] notify [all]' % sys.argv[0]]), + '%s -C [] notify [all]' % sys.argv[0], + '%s -C [] 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) -- cgit v1.2.3-70-g09d2