DF-3071 / df3071c.c
/* DF-3071 - pre-fill mount to (cap - slack), then barrier-burst N single * creations. usage: df3071c <dir> <prefill> <nthreads> */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <fcntl.h> #include <unistd.h> #include <pthread.h> static const char *dirp; static volatile int go=0; static long total=0; static int nres_ok=0; static pthread_mutex_t mx=PTHREAD_MUTEX_INITIALIZER; static void *w(void *arg){ long id=(long)arg; char p[512]; while(!go) usleep(50); snprintf(p,sizeof p,"%s/b%ld",dirp,id); int fd=open(p,O_CREAT|O_EXCL,0644); int ok = (fd>=0); if (fd>=0) close(fd); pthread_mutex_lock(&mx); total+=ok; pthread_mutex_unlock(&mx); return NULL; } int main(int argc,char**argv){ pthread_t th[128]; long i,n; char p[512]; int pre; if(argc!=4){fprintf(stderr,"usage: df3071c dir prefill nthreads\n");return 2;} dirp=argv[1]; pre=atoi(argv[2]); n=atol(argv[3]); if(n>128)n=128; for(i=0;i<pre;i++){ snprintf(p,sizeof p,"%s/p%ld",dirp,i); int fd=open(p,O_CREAT|O_EXCL,0644); if(fd>=0) close(fd); } for(i=0;i<n;i++) pthread_create(&th[i],NULL,w,(void*)i); usleep(100000); go=1; for(i=0;i<n;i++) pthread_join(th[i],NULL); printf("PREFILL=%d BURST_OK=%ld (cap=67; >%d successes => overshoot)\n", pre,total,67-pre); return 0; } |