Пример #1
0
/*
 * Qeury the lease.
 * Return 1 if succedded, 0 if not , and < 0 on errors.
 */
int
query(int fd, off_t offset)
{
    char curr[taglen+1] = "";
    char id[idlen+1] = "";
    long long ts;
    time_t tsec;
    int tusec;
    char *t;

    if (readtag(fd, offset, curr, 0) < 0)
        return -errno;

    querytag(curr, id, &ts);
    tsec = ts / 1000000;
    tusec = ts % 1000000;

    t = ctime(&tsec);
    t[strlen(t)-1] = 0;

    printf("%s: ID %-*s TS %0*llx (%s, %d usec)\n",
        sameid(curr, freetag) ? "FREE" : "LOCKED",
        idlen, id, stamplen, ts, t, tusec);

    return 1;
}
Пример #2
0
/*
 * Attempt to acquire the lease.
 * Return 1 if succedded, 0 if not , and < 0 on errors.
 */
int
acquire(int fd, off_t offset, char *id, int busyloop, long long *ts)
{
    char curr[taglen+1] = "", last[taglen+1] = "", tag[taglen+1] = "";
    long backoff_usec = (lease_ms + 6 * op_max_ms) * 1000;
    long contend_usec = (2 * op_max_ms) * 1000;
    char dummyid[idlen+1];

    if (readtag(fd, offset, curr, 1) < 0)
        return -errno;

    settag(last, freetag);

    do {
        DEBUG("restart: curr tag is '%s'", curr);
        if (!sametag(curr, last) && !isfree(curr)) do {
            DEBUG("backoff: curr tag is '%s'", curr);
            settag(last, curr);
            usleep(backoff_usec);
            if (readtag(fd, offset, curr, 1) < 0)
                return -errno;
        } while (busyloop && !sametag(curr, last) && !isfree(curr));
        if (!sametag(curr, last) && !isfree(curr)) {
            DEBUG("fail:    curr tag is '%s'", curr);
            return 0;
        }
        DEBUG("contend: curr tag is '%s'", curr);
        if (writetimestamp(fd, offset, id, tag, ts) < 0) {
            DEBUG("lost (writetimestamp failed)  : curr tag is %s", curr);
            return -errno;
        }
        usleep(contend_usec);
        if (readtag(fd, offset, curr, 1) < 0) {
            DEBUG("lost (readtag failed)  : curr tag is %s", curr);
            return -errno;
        }
    } while (busyloop && !sametag(curr, tag));

    if (busyloop || sametag(curr, tag)) {
        DEBUG("won    : curr tag is %s", curr);
        querytag(curr, dummyid, ts);
        return renew(fd, offset, id, ts);
    }
    DEBUG("lost   : curr tag is %s\n         our tag is  %s", curr, tag);
    return 0;
}
Пример #3
0
/*
 * Attempt to renew the lease.
 * Return 1 if succeded, 0 if not , and < 0 on errors.
 */
int
renew(int fd, off_t offset, char *id, long long *ts)
{
    char curr[taglen+1] = "", tag[taglen+1] = "";
    char dummyid[idlen+1];
    struct sigaction sa;
    long long msleft;
    int rc = 0;

    sa.sa_flags = !SA_RESTART;
    sigemptyset(&sa.sa_mask);
    sa.sa_handler = handler;
    if (sigaction(SIGALRM, &sa, NULL) == -1)
        PANIC("sigaction: can't set alarm");

    if (readtag(fd, offset, curr, 0) < 0) {
        rc = -errno;
        goto out;
    }

    DEBUG("curr tag is '%s'", curr);
    if (!sameid(curr, id)) {
        *ts = 0;
        goto out;
    }

    querytag(curr, dummyid, ts);
    msleft = timeleft_ms(*ts);
    if (msleft <= 0) {
        rc = -ETIMEDOUT;
        goto out;
    }

    alarm(msleft / 1000);
    DEBUG("updating tag: msleft %lld", msleft);
    if (writetimestamp(fd, offset, id, tag, ts) < 0) {
        rc = -errno;
        goto out;
    }

    DEBUG("All good");
    /* disable the alarm because usleep might use the same signal */
    alarm(0);
    return 1;

out:
    alarm(0);
    return rc;
}
Пример #4
0
/*
 * Attempt to release the lease.
 * Return 1 if succedded, 0 if not , and < 0 on errors.
 */
int
release(int fd, off_t offset, char *id, int force)
{
    char curr[taglen+1] = "";

    if (!force) {
        if (readtag(fd, offset, curr, 0) < 0)
            return -errno;

        if (!sameid(curr, id))
            return 0;
    }

    return writetag(fd, offset, freetag, 0) < 0 ? -1 : 1;
}
Пример #5
0
void gitWithStream (strid_t str, git_uint32 cacheSize, git_uint32 undoSize)
{
    char * game;
    git_uint32 gamePos;
    git_uint32 gameSize;
    
    git_uint32 remaining;
    char * ptr;
    
    char buffer [4];
    
    glk_stream_set_position (str, 0, seekmode_Start);
    if (4 != glk_get_buffer_stream (str, buffer, 4))
        fatalError ("can't read from game file stream");
    
    if (readtag (buffer) == FORM)
    {
        giblorb_result_t result = handleBlorb (str);
        gamePos = result.data.startpos;
        gameSize = result.length;
    }
    else
    {
        gamePos = 0;
        glk_stream_set_position (str, 0, seekmode_End);
        gameSize = glk_stream_get_position (str);        
    }
    
    game = malloc (gameSize);
    if (game == NULL)
        fatalError ("failed to allocate memory to store game file");
    
    glk_stream_set_position (str, gamePos, seekmode_Start);
    
    remaining = gameSize;
    ptr = game;    
    while (remaining > 0)
    {
        git_uint32 n = glk_get_buffer_stream (str, ptr, remaining);
        if (n == 0)
            fatalError ("failed to read entire game file");
        remaining -= n;
        ptr += n;
    }
    
    gitMain ((git_uint8 *) game, gameSize, cacheSize, undoSize);
    free (game);
}
Пример #6
0
int read_partdata(FILE *f, FILE *ftag, Slice *s)
/* Read one block (128k particles) of data into Slice s.  Allocate needed
storage, erasing and freeing previous storage. */
/* This cannot be done with s->pid!=NULL, so s->pid is ignored and s->numlist
is reset to BLOCKSIZE */
/* Unlike other routines, this stores both positions and velocities in 
all cases (since the storage requirements are already small */
/* If ftag==NULL, don't read the tag file.  Otherwise do read it. */
{
    if (s->pid!=NULL) 
	mywarn("Non-trivial pid[] not supported with incremental reads");
    /* If we need to reallocate memory, do it.  Otherwise, just write over */
    if (s->px==NULL || s->vx==NULL || s->numlist!=s->numperblock) {
	if (s->px!=NULL) free_vector(s->px,1,s->numlist);
	if (s->py!=NULL) free_vector(s->py,1,s->numlist);
	if (s->pz!=NULL) free_vector(s->pz,1,s->numlist);
	if (s->vx!=NULL) free_vector(s->vx,1,s->numlist);
	if (s->vy!=NULL) free_vector(s->vy,1,s->numlist);
	if (s->vz!=NULL) free_vector(s->vz,1,s->numlist);
	if (ftag!=NULL && s->ntag!=NULL) free_ivector(s->ntag, 1, s->numlist);
	s->numlist = s->numperblock;
	s->px = vector(1,s->numlist);
	s->py = vector(1,s->numlist);
	s->pz = vector(1,s->numlist);
	s->vx = vector(1,s->numlist);
	s->vy = vector(1,s->numlist);
	s->vz = vector(1,s->numlist);
	if (ftag!=NULL) s->ntag = ivector(1, s->numlist);
	s->offset=0;
	/* fprintf(stderr, "Reallocating data arrays.\n"); */
    }
    else s->offset+=s->numlist;

    f77read(f,s->px+1,4*s->numlist);
    f77read(f,s->py+1,4*s->numlist);
    f77read(f,s->pz+1,4*s->numlist);
    f77read(f,s->vx+1,4*s->numlist);
    f77read(f,s->vy+1,4*s->numlist);
    f77read(f,s->vz+1,4*s->numlist);

    if (ftag!=NULL) readtag(ftag, s->numlist, s->ntag);
    normalizedata(s,1,1);
    return 0;
}
Пример #7
0
int main()

{

	int  i;	//EPICS TAG SEARCH
	//SearchTag();

	int clen;
//	struct sockaddr_in client_addr, server_addr;

//	char buf[MAXBUF] = "Im server connecting success.";
	
	int    iSize = 0;

	//EPICS TAG SEARCH
	SearchTag();

	//make server socket
	if((ssock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
	{      
		perror("Failed to make socket discriptor");
		exit(1);
	}

	clen = sizeof(client_addr);

	//setting address structure
	memset(&server_addr, 0, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	server_addr.sin_port = htons(3333);
printf("Etos2    Bind Start....\n");
	//binding
	if(bind(ssock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
	{
		perror("Failed to binding server socket");
		exit(1);
	}
printf("Etos2    Bind ok....");
	//wait for client
	if(listen(ssock, 8) <0 )
	{
		perror("listen error : ");
		exit(1);
        }
	char readbuf[MAXBUF];
	memset(&readbuf, 0, MAXBUF);

	i=0;
	while(1)
	{
		iSize = 0;
		csock = accept(ssock, (struct sockaddr *)&client_addr, &clen);
		i++;
		//if(write(csock, buf, MAXBUF) <= 0)
		//	perror("Writing error : ");
printf("Start Test!!!!\n");	
		VacDataRecv();
		close(csock);

		//printf("val : %f\n", fltDATA);
		iRead = readtag(T_CIP_REAL, VacTagDatachid2[0]);
		if(iRead == 0)
		{
			printf("ETOS2 EPICS TAG RE SEARCH!!!!\n");
			SearchTag();
		}
		else
		{
			printf("ETOS2 EPICS TAG Read Succes!!!!\n");
		}
        }
	return 0;

}