ptr_type device_ptr() { // This will copy data to the device if and only if necessary. sync_device(); // Because device data may change, we mark the host-side buffer // appropriately. invalidate_host(); return device_storage_.ptr(); }
struct chirp_file * chirp_reli_open( const char *host, const char *path, INT64_T flags, INT64_T mode, time_t stoptime ) { struct chirp_file *file; int delay=0; time_t nexttry; INT64_T result; struct chirp_stat buf; time_t current; while(1) { struct chirp_client *client = connect_to_host(host,stoptime); if(client) { result = chirp_client_open(client,path,flags,mode,&buf,stoptime); if(result>=0) { file = xxmalloc(sizeof(*file)); strcpy(file->host,host); strcpy(file->path,path); memcpy(&file->info,&buf,sizeof(buf)); file->fd = result; file->flags = flags & ~(O_CREAT|O_TRUNC); file->mode = mode; file->serial = chirp_client_serial(client); file->stale = 0; file->buffer = malloc(chirp_reli_blocksize); file->buffer_offset = 0; file->buffer_valid = 0; file->buffer_dirty = 0; return file; } else { if(errno!=ECONNRESET) return 0; } invalidate_host(host); } else { if(errno==ENOENT) return 0; } if(time(0)>=stoptime) { errno = ECONNRESET; return 0; } if(delay>=2) debug(D_NOTICE,"couldn't connect to %s: still trying...\n",host); debug(D_CHIRP,"couldn't talk to %s: %s\n",host,strerror(errno)); current = time(0); nexttry = MIN(stoptime,current+delay); debug(D_CHIRP,"try again in %d seconds\n",(int)(nexttry-current)); sleep_until(nexttry); if(delay==0) { delay = 1; } else { delay = MIN(delay*2,MAX_DELAY); } } }