⬢ DragonFlyBSD Kernel Audit
DF-3071 / df3071c.c
← back to finding ↓ download raw
/* 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;
}