/* function : 销毁文件集合crs_fd_set_t handler input : crs_fd_set_t *set : 文件集合 return value : success : 返回 0 fail : -1 */ extern int32_t crs_fd_set_destroy(crs_fd_set_t *set) { if ( NULL == set ) { return -1; } crs_free( set ); set = NULL; return 0; }
// CRS ----------------------- int librlc_crs_encode(int k, int m, int w, int packet_size, const char *orig_data, int orig_data_len, char **encoded_data, char **encoded_parity, int *chunk_len) { crs_coder_t crs_code; // crs init crs_init(&crs_code, k+m, k, w, packet_size); // rs encode crs_encode(crs_code.pcrsi, orig_data, orig_data_len, encoded_data, encoded_parity, chunk_len); // rs free crs_free(&crs_code); return 0; }
int librlc_crs_repair(int k, int m, int w, int packet_size, char *available_data, int *data_list, int data_num,int chunk_len, int *repair_list, int repair_num, char **out_data) { int ret = 0; crs_coder_t crs_code; //crs init crs_init(&crs_code, k+m, k, w, packet_size); // re repair ret = crs_repair(crs_code.pcrsi, available_data, data_list, data_num, chunk_len, repair_list, repair_num, out_data); // crs free crs_free(&crs_code); return ret; }
int main(int narg, char* arg[]) { struct crs_data *crs; comm_ext world; int id,np; struct comm comm; #ifdef MPI MPI_Init(&narg,&arg); world = MPI_COMM_WORLD; MPI_Comm_size(world,&np); #else world=0, np=1; #endif comm_init(&comm,world); if(np!=3) { puts("run with 3 procs"); exit(1); } id = comm.id; crs = crs_setup(nx[id], &x_id[id][0], nz[id], &Ai[id][0], &Aj[id][0], &Ar[id][0], 0, &comm); crs_stats(crs); if(1) { uint i,j; double xv[8]; for(i=0;i<8;++i) { crs_solve(xv,crs,&bv[id][i][0]); printf("%d col %d:",id,i); for(j=0;j<nx[id];++j) printf("\t%.4g",xv[j]); printf("\n"); } } crs_free(crs); comm_free(&comm); #ifdef MPI MPI_Finalize(); #endif return 0; }
/* function : 由TCP服务器调用,用于从已完成连接的队列的头返回下一个已完成连接 input : crs_socket_handler_t *sock : socket handle return value : success : 返回 所接收的socket fail : 返回 -1 */ extern crs_socket_handler_t *crs_accept(crs_socket_handler_t *sock) { char str_ip[16]; memset(str_ip, 0,16); crs_socket_handler_t *new_sock = (crs_socket_handler_t *) crs_malloc(sizeof(crs_socket_handler_t)); if (NULL == new_sock) { return NULL; } crs_memset(new_sock, 0, sizeof(crs_socket_handler_t)); struct sockaddr_in peeraddr; socklen_t peeraddr_len; new_sock->fd = accept(sock->fd, (struct sockaddr *)&peeraddr, &peeraddr_len); if (0 > new_sock->fd) { crs_free(new_sock); return NULL; } strncpy(new_sock->sock_info.peer_ip, crs_inet_ntoa(peeraddr.sin_addr.s_addr,str_ip,16), sizeof(new_sock->sock_info.peer_ip) -1); new_sock->sock_info.peer_port = ntohs(peeraddr.sin_port); return new_sock; }
int main(int narg, char* arg[]) { uint n; ulong *xid; uint nz; uint *Ai, *Aj; double *A; uint i; double *x, *b, *x2; struct crs_data *crs; comm_ext world; int id,np; struct comm comm; #ifdef MPI MPI_Init(&narg,&arg); world = MPI_COMM_WORLD; MPI_Comm_size(world,&np); #else world=0, np=1; #endif comm_init(&comm,world); id = comm.id; n=M+1; if(id==np-1) --n; xid = tmalloc(ulong,n); x=tmalloc(double,3*n), b=x+n, x2=b+n; for(i=0; i<n; ++i) xid[i]=1+id*M+i; nz=2*M; if(id==np-1) --nz; Ai=tmalloc(uint,2*nz), Aj=Ai+nz; A =tmalloc(double,nz); for(i=0; i<M; ++i) Ai[i]=i,Aj[i]=i,A[i]=2; if(id==0) A[0]=1; if(id==np-1) A[n-1]=1; for(i=M; i<nz; ++i) Ai[i]=i-M,Aj[i]=i-M+1,A[i]=-1; crs = crs_setup(n,xid, nz,Ai,Aj,A, 1, &comm); crs_stats(crs); { double tn = M*np, mean = 1*(tn+1)/2; double avg = 1*(tn-1)*(tn+1)/12; for(i=0; i<n; ++i) x[i]=(xid[i]-mean)*(xid[i]-mean)-avg; for(i=0; i<n; ++i) b[i]=A[i]*x[i] - (i>0 || id!=0 ? (xid[i]-1-mean)*(xid[i]-1-mean)-avg : 0) - (i+1<n || id!=np-1 ? (xid[i]+1-mean)*(xid[i]+1-mean)-avg : 0); if(id!=np-1) b[n-1]=0; } crs_solve(x2,crs,b); crs_free(crs); comm_free(&comm); { double dif=0; for(i=0; i<n; ++i) { double d=fabs(x[i]-x2[i])/(.1+fabs(x[i])); if(d>dif) dif=d; } printf("%d : max dif = %g\n",id,dif); } free(A); free(Ai); free(x); free(xid); #ifdef MPI MPI_Finalize(); #endif if(id==0) printf("test successful\n"); return 0; }