void ushell_cmd_perform_transfer( Fs_file_segment seg_src, Fs_file_segment seg_dest ) { uint8_t id_trans_memtomem; Ctrl_status status_stream; uint16_t u16_i, u16_trans_max; uint32_t u32_tmp, u32_time; u16_trans_max = ( seg_src.u16_size < seg_dest.u16_size )? seg_src.u16_size : seg_dest.u16_size; for( u16_i=2; u16_i<=u16_trans_max; u16_i*=10 ) { u32_time = Get_sys_count(); id_trans_memtomem = stream_mem_to_mem( seg_src.u8_lun , seg_src.u32_addr , seg_dest.u8_lun , seg_dest.u32_addr , u16_i ); if( ID_STREAM_ERR == id_trans_memtomem ) { printf( "Transfer error\r\n"); return; } while(1) { status_stream = stream_state( id_trans_memtomem ); if( CTRL_BUSY == status_stream ) continue; if( CTRL_GOOD == status_stream ) break; if( CTRL_FAIL == status_stream ) { printf( "Transfer error\r\n"); return; } } u32_time = cpu_cy_2_us(Get_sys_count()-u32_time, g_u32_ushell_pba_hz ); u32_tmp = ((uint32_t)u16_i*(1000000/2))/u32_time; printf( "Transfer rate %4luKB/s - stream size %4iKB\r\n", u32_tmp, u16_i/2 ); if( (8000000) < u32_time ) { // The test time must be inferior at 8s break; } } }
// internal pread, do a read query with offset on a different descriptor, do not change the position of the current one. ssize_t gridftp_rw_internal_pread(GridFTPFactory * factory, GridFTPFileDesc* desc, void* buffer, size_t s_buff, off_t offset) { // throw Gfal::CoreException gfal_log(GFAL_VERBOSE_TRACE, " -> [GridFTPModule::internal_pread]"); GridFTPSessionHandler handler(factory, desc->url); GridFTPRequestState request_state(&handler); GridFTPStreamState stream_state(&handler); globus_result_t res = globus_ftp_client_partial_get( handler.get_ftp_client_handle(), desc->url.c_str(), handler.get_ftp_client_operationattr(), NULL, offset, offset + s_buff, globus_ftp_client_done_callback, &request_state); gfal_globus_check_result(GFAL_GRIDFTP_SCOPE_INTERNAL_PREAD, res); ssize_t r_size = gridftp_read_stream(GFAL_GRIDFTP_SCOPE_INTERNAL_PREAD, &stream_state, buffer, s_buff); request_state.wait(GFAL_GRIDFTP_SCOPE_INTERNAL_PREAD); gfal_log(GFAL_VERBOSE_TRACE, "[GridFTPModule::internal_pread] <-"); return r_size; }