Exemplo n.º 1
0
//the map function
//see ftw(3) man page (dftw is basically identical)
static int map(const char *fpath, const struct stat *sb, int tflag, void *kv) {
	off_t size;
	uid_t uid;


	switch (tflag) {
		case FTW_D:
			//fpath is a directory
			return 0;
		case FTW_DNR:
			//fpath is a directory which can't be read
			fprintf(stderr, "unreadable directory: %s\n", fpath);
			return 1;
		case FTW_NS:
			//the stat(2) call failed on fpath, which is not a symbolic link
			fprintf(stderr, "unstatable file: %s\n", fpath);
			return 1;
		default: {
			//(FTW_F)
			//ignore symlinks
			if (!S_ISLNK(sb->st_mode)) {
				size = sb->st_size;
				uid  = sb->st_uid;
				//emit a {uid:size} key/value
				MR_kv_add(kv, (char*)&uid, sizeof(uid_t), (char*)&size, sizeof(off_t));
			}
			return 0;
		}
	}
}
void generate(int itask, void *kv, void *ptr)
{
  RMAT *rmat = (RMAT *) ptr;

  int nlevels = rmat->nlevels;
  int order = rmat->order;
  int ngenerate = rmat->ngenerate;
  double a = rmat->a;
  double b = rmat->b;
  double c = rmat->c;
  double d = rmat->d;
  double fraction = rmat->fraction;

  int i,j,ilevel,delta,m;
  double a1,b1,c1,d1,total,rn;
  EDGE edge;

  for (m = 0; m < ngenerate; m++) {
    delta = order >> 1;
    a1 = a; b1 = b; c1 = c; d1 = d;
    i = j = 0;
    
    for (ilevel = 0; ilevel < nlevels; ilevel++) {
      rn = drand48();
      if (rn < a1) {
      } else if (rn < a1+b1) {
	j += delta;
      } else if (rn < a1+b1+c1) {
	i += delta;
      } else {
	i += delta;
	j += delta;
      }
      
      delta /= 2;
      if (fraction > 0.0) {
	a1 += a1*fraction * (drand48() - 0.5);
	b1 += b1*fraction * (drand48() - 0.5);
	c1 += c1*fraction * (drand48() - 0.5);
	d1 += d1*fraction * (drand48() - 0.5);
	total = a1+b1+c1+d1;
	a1 /= total;
	b1 /= total;
	c1 /= total;
	d1 /= total;
      }
    }

    edge.vi = i;
    edge.vj = j;
    MR_kv_add(kv,(char *) &edge,sizeof(EDGE),NULL,0);
  }
}
void histo(char *key, int keybytes, char *multivalue,
	   int nvalues, int *valuebytes, void *kv, void *ptr) 
{
  MR_kv_add(kv,key,keybytes,(char *) &nvalues,sizeof(int));
}
void degree(char *key, int keybytes, char *multivalue,
	 int nvalues, int *valuebytes, void *kv, void *ptr) 
{
  MR_kv_add(kv,(char *) &nvalues,sizeof(int),NULL,0);
}
void nonzero(char *key, int keybytes, char *multivalue,
	     int nvalues, int *valuebytes, void *kv, void *ptr) 
{
  EDGE *edge = (EDGE *) key;
  MR_kv_add(kv,(char *) &edge->vi,sizeof(VERTEX),NULL,0);
}
void cull(char *key, int keybytes, char *multivalue,
	  int nvalues, int *valuebytes, void *kv, void *ptr) 
{
  MR_kv_add(kv,key,keybytes,NULL,0);
}