From 7a324d3df7e8b4a3b4ee1381a02032d21c668c9a Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Fri, 13 Jun 2014 23:24:02 +0200 Subject: add barrier MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/cmdipc | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/src/cmdipc b/src/cmdipc index 3390900..639b80f 100755 --- a/src/cmdipc +++ b/src/cmdipc @@ -36,7 +36,8 @@ parser = ArgParser('System V and POSIX IPC from the command line', '%s -C [] [enter|leave|wait]' % sys.argv[0], '%s -C [] notify [all]' % sys.argv[0], '%s -C [] broadcast' % sys.argv[0], - '%s -B [] [enter]' % sys.argv[0]]), + '%s -B [] [enter]' % sys.argv[0], + '%s -B [] -r' % sys.argv[0]]), None, None, True, ArgParser.standard_abbreviations()) @@ -60,7 +61,7 @@ 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 (using semaphore)') parser.add_argumentless(['-C', '--condition'], 0, 'Use condition (non-primitive)') -#parser.add_argumentless(['-B', '--barrier'], 0, 'Use barrier (non-primitive)') +parser.add_argumentless(['-B', '--barrier'], 0, 'Use barrier (non-primitive)') #parser.add_argumentless(['-R', '--rendezvous'], 0, 'Use rendezvous (non-primitive)') #parser.add_argumentless(['-L', '--shared-lock'], 0, 'Use shared lock (non-primitive)') @@ -226,6 +227,44 @@ try: print('Invalid command given', file = sys.stderr) sys.exit(1) + elif parser.opts['--barrier'] is not None: + key, flags, mode, timeout = [None, None], 0, 0o600, None + if parser.opts['--nonblocking'] is not None: timeout = 0 + 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 len(parser.files) == 0: + threshold = 1 + if parser.opts['--remove'] is None: + print('Invalid command given', file = sys.stderr) + sys.exit(1) + else: + threshold = int(parser.files[0]) + if key[0] is not None: + key = [int(k) for k in key.split('.')] + s = sysv_ipc.Semaphore(key[0], flags, mode, threshold) + m = sysv_ipc.Semaphore(key[1], flags, mode, 1) + if key[0] is None: + print('key: %i.%i' % (s.key, m.key)) + nocmd = False + if (len(parser.files) == 2) and (parser.files[1] == 'enter'): + s.P() + s.Z() + m.P() + if s.value == 0: + s.value = threshold + m.V() + elif key[0] is not None: + nocmd = True + if parser.opts['--remove'] is not None: + s.remove() + m.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