tlock.c revision 3f54fd611f536639ec30dd53c48e5ec1897cc7d9
b35e053c2c5a5ea0f13decfd0303894861d82b4dJonathan von Schroeder/***********************************************************************
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder* This software is part of the ast package *
b35e053c2c5a5ea0f13decfd0303894861d82b4dJonathan von Schroeder* Copyright (c) 1999-2012 AT&T Intellectual Property *
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu Prodescu* and is licensed under the *
b35e053c2c5a5ea0f13decfd0303894861d82b4dJonathan von Schroeder* Eclipse Public License, Version 1.0 *
b35e053c2c5a5ea0f13decfd0303894861d82b4dJonathan von Schroeder* by AT&T Intellectual Property *
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder* A copy of the License is available at *
b35e053c2c5a5ea0f13decfd0303894861d82b4dJonathan von Schroeder* http://www.eclipse.org/org/documents/epl-v10.html *
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
b35e053c2c5a5ea0f13decfd0303894861d82b4dJonathan von Schroeder* Information and Software Systems Research *
b35e053c2c5a5ea0f13decfd0303894861d82b4dJonathan von Schroeder* AT&T Research *
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder* Florham Park NJ *
b35e053c2c5a5ea0f13decfd0303894861d82b4dJonathan von Schroeder* Glenn Fowler <gsf@research.att.com> *
b35e053c2c5a5ea0f13decfd0303894861d82b4dJonathan von Schroeder***********************************************************************/
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder/* Test concurrency locking based on Atomic Scalar Operations
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder** Written by Kiem-Phong Vo
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder#define N_SLOT 12 /* number of lock slots */
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder#define N_STEP 1000 /* number of working steps */
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroederstatic unsigned int *Nproc; /* number of processes */
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroederstatic unsigned char *Lckc; /* slots of char locks */
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroederstatic unsigned short *Lcks; /* slots of short locks */
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroederstatic unsigned int *Lcki; /* slots of int locks */
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroederstatic unsigned int *Done; /* count done workloads */
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroederint lockobj(void* lck, ssize_t size, int locking)
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder if(locking == 0) /* unlocking a slot */
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder { if(size == sizeof(char))
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder else if(size == sizeof(short))
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder if(lckv != Pnum ) /* unlocking a wrong lock */
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder terror("Process %3d(pid=%d): unlocking %d(pid=%d)?",
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder if(size == sizeof(char))
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder else if(size == sizeof(short))
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder terror("Process %3d(pid=%d): unlocking CAS error %d",
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder for(k = 0;; ++k, usleep(100) ) /* locking a slot */
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder { if(size == sizeof(char))
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder else if(size == sizeof(short))
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder terror("Process %3d(pid=%d): locking CAS error %d",
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder else if(k > 0 && (k%10000) == 0)
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder twarn("Process %3d(pid=%d): locking loop %d blocked by %d",
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder for(k = 0; k < 2; ++k, usleep(100) ) /* make sure that lock is good */
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder { if(size == sizeof(char))
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder else if(size == sizeof(short))
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder terror("Process %3d(pid=%d): at step %d lock=%d?",
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder for(k = 0; k < N_STEP; ++k)
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder { if(k > 0 && (k%100) == 0)
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder tinfo("Process %3d(pid=%d): progress to %d", Pnum, Pid[Pnum], k);
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder terror("Process %3d(pid=%d): bad int lock %d",
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder terror("Process %3d(pid=%d): bad short lock %d",
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder terror("Process %3d(pid=%d): bad char lock %d",
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder if (!Tstall && !(asometh(0, 0)->type & ASO_INTRINSIC))
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder twarn("only ASO_INTRINSIC methods are tested by default");
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder if((zerof = open("/dev/zero", O_RDWR)) < 0)
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder /* get shared memory */
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder z = sizeof(*Nproc) + (N_PROC+1)*sizeof(pid_t) + sizeof(*Done) +
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder N_SLOT*sizeof(unsigned char) +
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder N_SLOT*sizeof(unsigned short) +
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder N_SLOT*sizeof(unsigned int);
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder addr = mmap(0,z,PROT_READ|PROT_WRITE,MAP_SHARED,zerof,0);
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder Done = (unsigned int*)(Pid + (N_PROC+1)*sizeof(pid_t));
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder Lcks = (unsigned short*)(Lcki + N_SLOT);
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder Lckc = (unsigned char* )(Lcks + N_SLOT);
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder terror("Can't create a child process");
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder else if(pid > 0 ) /* parent process */
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder else /* child process */
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder { for(;; usleep(1000) ) /* wait until all are alive */
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder workload(k); /* now start working concurrently */
c56a356d3fcc5e123efa790aab320781d94df3c7Jonathan von Schroeder terror("Some subprocess did not finish its workload");