20#if ! defined (MUMPS_WIN32)
21# if defined(WITH_PFUNC) && ! defined (WITHOUT_PTHREAD)
23pthread_mutex_t mumps_io_pwrite_mutex;
60 if (file_number_arg > ((
mumps_files+type)->mumps_io_nb_file)-1){
69 if((
mumps_files+type)->mumps_io_pfile_pointer_array==NULL){
70 return mumps_io_error(-13,
"Allocation problem in low-level OOC layer\n");
73 ((
mumps_files+type)->mumps_io_pfile_pointer_array+((
mumps_files+type)->mumps_io_nb_file)-1)->is_opened = 0;
75 mumps_io_pfile_pointer_array=(
mumps_files+type)->mumps_io_pfile_pointer_array;
81 ((
mumps_files+type)->mumps_io_current_file_number)=file_number_arg;
82 ((
mumps_files+type)->mumps_io_current_file)=mumps_io_pfile_pointer_array+file_number_arg;
83 if((mumps_io_pfile_pointer_array+file_number_arg)->is_opened!=0){
106 sprintf(buf,
"File creation failure");
120 strcpy((mumps_io_pfile_pointer_array+(
mumps_files+type)->mumps_io_current_file_number)->name,name);
122#if ! defined( MUMPS_WIN32 )
123 (mumps_io_pfile_pointer_array+(
mumps_files+type)->mumps_io_current_file_number)->file=open(name,(
mumps_files+type)->mumps_flag_open,0666);
127 if((mumps_io_pfile_pointer_array+(
mumps_files+type)->mumps_io_current_file_number)->file==-1){
131 (mumps_io_pfile_pointer_array+(
mumps_files+type)->mumps_io_current_file_number)->file=fopen(name,(
mumps_files+type)->mumps_flag_open);
132 if((mumps_io_pfile_pointer_array+(
mumps_files+type)->mumps_io_current_file_number)->file==NULL){
136 (
mumps_files+type)->mumps_io_current_file=(mumps_io_pfile_pointer_array+(
mumps_files+type)->mumps_io_current_file_number);
142 ((
mumps_files+type)->mumps_io_current_file)->write_pos=0;
143 ((
mumps_files+type)->mumps_io_current_file)->is_opened=1;
166 current_file=(
mumps_files+type)->mumps_io_current_file;
177 *pos_in_file=((
mumps_files+type)->mumps_io_current_file)->current_pos;
179 *file_number=(
mumps_files+type)->mumps_io_current_file_number;
197 long long block_size,
206 MUMPS_INT ret_code,file_number_loc,pos_in_file_loc;
207 double to_be_written;
208#if ! defined( MUMPS_WIN32 )
216 size_t already_written=0;
219 loc_addr=address_block;
223 for(i=0;i<nb_concerned_files;i++){
224#if ! defined( MUMPS_WIN32 ) && ! defined (WITHOUT_PTHREAD)
227 mumps_io_protect_pointers();
233#if ! defined( MUMPS_WIN32 ) && ! defined (WITHOUT_PTHREAD)
236 mumps_io_unprotect_pointers();
243 write_size=(size_t)to_be_written;
244 already_written=(size_t)to_be_written;
247 already_written=already_written+(size_t)write_size;
249#if defined( MUMPS_WIN32 )
252 file=&(((
mumps_files+type)->mumps_io_current_file)->file);
253 where=((
mumps_files+type)->mumps_io_current_file)->write_pos;
254#if ! defined( MUMPS_WIN32 ) && ! defined (WITHOUT_PTHREAD)
257 mumps_io_unprotect_pointers();
265#if ! defined( MUMPS_WIN32 ) && ! defined (WITHOUT_PTHREAD)
268 mumps_io_protect_pointers();
272#if ! defined( MUMPS_WIN32 )
274 to_be_written=to_be_written-((
MUMPS_INT)write_size);
275 loc_addr=(
void*)((
size_t)loc_addr+write_size);
288#if ! defined( MUMPS_WIN32 ) && ! defined (WITHOUT_PTHREAD)
291 mumps_io_unprotect_pointers();
296 if(to_be_written!=0){
298 sprintf(buf,
"Internal (1) error in low-level I/O operation %lf",to_be_written);
305 long long block_size,
310#if ! defined( MUMPS_WIN32 )
333 loc_addr=address_block;
339 file=&((((
mumps_files+type)->mumps_io_pfile_pointer_array)+local_fnum)->file);
341#if ! defined( MUMPS_WIN32 )
345 size=(size_t)read_size;
358#if defined( MUMPS_WIN32 )
361 vaddr_loc=vaddr_loc+(
long long)size;
362 read_size=read_size-(double)size;
363 loc_addr=(
void*)((
size_t)loc_addr+size);
366 if(local_fnum>(
mumps_files+type)->mumps_io_nb_file){
368 return mumps_io_error(*ierr,
"Internal error (2) in low level read op\n");
379#if ! defined( MUMPS_WIN32 )
389 for(j=0;j<bound;j++){
390 if(
mumps_files[j].mumps_io_pfile_pointer_array == NULL ) {
393 for(i=0;i<(
mumps_files+j)->mumps_io_nb_file_opened;i++){
394#if ! defined( MUMPS_WIN32 )
395 ierr=close((((
mumps_files+j)->mumps_io_pfile_pointer_array)+i)->file);
400 ierr=fclose((((
mumps_files+j)->mumps_io_pfile_pointer_array)+i)->file);
407 free((
mumps_files+j)->mumps_io_pfile_pointer_array);
411#if ! defined( MUMPS_WIN32 )
419 (
mumps_files+which)->mumps_io_current_file_number = -1;
420 (
mumps_files+which)->mumps_io_last_file_opened = -1;
423 (
mumps_files+which)->mumps_io_pfile_pointer_array = NULL;
431 if((
mumps_files+which)->mumps_io_pfile_pointer_array==NULL){
432 return mumps_io_error(-13,
"Allocation problem in low-level OOC layer\n");
435 (((
mumps_files+which)->mumps_io_pfile_pointer_array)+i)->is_opened=0;
443#if ! defined( MUMPS_WIN32 )
452#if ! defined( MUMPS_WIN32 )
460 return mumps_io_error(-13,
"Allocation problem in low-level OOC layer\n");
464 nb=(flag_tab[i]==0||flag_tab[i]==1) ? mumps_io_nb_file : 1;
471#if ! defined( MUMPS_WIN32 )
472 (
mumps_files+i)->mumps_flag_open=mumps_flag_open|O_WRONLY|O_CREAT|O_TRUNC;
473# if defined(__MINGW32__)
482#if ! defined( MUMPS_WIN32 )
483 (
mumps_files+i)->mumps_flag_open=mumps_flag_open|O_RDONLY|O_CREAT|O_TRUNC;
484# if defined(__MINGW32__)
493#if ! defined( MUMPS_WIN32 )
494 (
mumps_files+i)->mumps_flag_open=mumps_flag_open|O_RDWR|O_CREAT|O_TRUNC;
495# if defined(__MINGW32__)
521 char *tmp_dir,*tmp_fname;
524 char mumps_base[10]=
"mumps_";
525 tmp_dir=(
char *)malloc(((*mumps_dim_dir)+1)*
sizeof(
char));
527 return mumps_io_error(-13,
"Allocation problem in low-level OOC layer\n");
529 tmp_fname=(
char *)malloc(((*mumps_dim_file)+1)*
sizeof(
char));
531 return mumps_io_error(-13,
"Allocation problem in low-level OOC layer\n");
533 for(i=0;i<*mumps_dim_dir;i++){
534 tmp_dir[i]=mumps_dir[i];
537 for(i=0;i<*mumps_dim_file;i++){
538 tmp_fname[i]=mumps_file[i];
544 tmp_dir=getenv(
"MUMPS_OOC_TMPDIR");
548 tmp_dir=getenv(
"TMPDIR");
562 tmp_fname=getenv(
"MUMPS_OOC_PREFIX");
566#if ! defined( MUMPS_WIN32 )
567 sprintf(base_name,
"_%s%d_XXXXXX",mumps_base,(
int)*_myid);
569 sprintf(base_name,
"_%s%d",mumps_base,*_myid);
573 return mumps_io_error(-13,
"Allocation problem in low-level OOC layer\n");
577#if ! defined( MUMPS_WIN32 )
578 sprintf(base_name,
"%s%s%d_XXXXXX",
SEPARATOR,mumps_base,(
int)*_myid);
580 sprintf(base_name,
"%s%s%d",
SEPARATOR,mumps_base,*_myid);
584 return mumps_io_error(-13,
"Allocation problem in low-level OOC layer\n");
597 *nb_files=((
mumps_files+*type)->mumps_io_last_file_opened)+1;
603 strcpy(name,(((
mumps_files+*type)->mumps_io_pfile_pointer_array)+i)->name);
614 return mumps_io_error(-13,
"Allocation problem in low-level OOC layer\n");
626#if ! defined( MUMPS_WIN32 )
632#if ! defined( MUMPS_WIN32 )
637#if ! defined( MUMPS_WIN32 )
638 (
mumps_files+i)->mumps_flag_open=mumps_flag_open|O_RDONLY;
656 strcpy((((
mumps_files+*type)->mumps_io_pfile_pointer_array)+i)->name,name);
662#if defined (sgi) || defined (__sgi)
666 mumps_io_pfile_pointer_array=(
mumps_files+j)->mumps_io_pfile_pointer_array;
668#if ! defined( MUMPS_WIN32 )
669 (mumps_io_pfile_pointer_array+i)->file=open((mumps_io_pfile_pointer_array+i)->name,(
mumps_files+j)->mumps_flag_open);
670 if((mumps_io_pfile_pointer_array+i)->file==-1){
674 (mumps_io_pfile_pointer_array+i)->file=fopen((mumps_io_pfile_pointer_array+i)->name,(
mumps_files+j)->mumps_flag_open);
675 if((mumps_io_pfile_pointer_array+i)->file==NULL){
678 (mumps_io_pfile_pointer_array+i)->is_opened=1;
685 (
mumps_files+*type)->mumps_io_last_file_opened=*dim-1;
689#if ! defined( MUMPS_WIN32 ) && ! defined (WITHOUT_PTHREAD)
692 pthread_mutex_lock(&mumps_io_pwrite_mutex);
696 pthread_mutex_unlock(&mumps_io_pwrite_mutex);
700 pthread_mutex_init(&mumps_io_pwrite_mutex,NULL);
703MUMPS_INT mumps_io_destroy_pointers_lock(){
704 pthread_mutex_destroy(&mumps_io_pwrite_mutex);
711#if ! defined( MUMPS_WIN32 )
719 ret_code=mumps_io_read_win32__(file,loc_addr, size,local_offset);
726#if ! defined( MUMPS_WIN32 )
731 ret_code=pread(*(
MUMPS_INT *)file,loc_addr,size,local_offset);
733 lseek(*(
MUMPS_INT *)file,(
long) local_offset,SEEK_SET);
734 ret_code=read(*(
MUMPS_INT *)file,loc_addr,size);
742#if defined( MUMPS_WIN32 )
743MUMPS_INT mumps_io_read_win32__(
void * file,
void * loc_addr,
size_t size,
MUMPS_INT local_offset){
745 fseek(*(FILE **)file,(
long) local_offset,SEEK_SET);
747 if((ret_code!=size)||(ferror(*(FILE**)file))){
755#if ! defined( MUMPS_WIN32 )
763 ret_code=mumps_io_write_win32__(file,loc_addr, write_size,where);
770#if ! defined( MUMPS_WIN32 )
775 ret_code=pwrite(*(
MUMPS_INT *)file,loc_addr,write_size,where);
779 lseek(*(
MUMPS_INT *)file,(
long)where,SEEK_SET);
780 ret_code=write(*(
MUMPS_INT *)file,loc_addr,write_size);
784 }
else if(ret_code!=write_size){
790#if defined( MUMPS_WIN32 )
791MUMPS_INT mumps_io_write_win32__(
void *file,
void *loc_addr,
size_t write_size,
MUMPS_INT where){
793 fseek(*(FILE **)file,(
long)where,SEEK_SET);
795 if((ret_code!=write_size)||(ferror(*(FILE**)file))){
804#if defined(MUMPS_WIN32)
809 pos=ftell(*(FILE **)file);
811 fseek(*(FILE **)file,0,SEEK_END);
813 *size=(size_t)ftell(*(FILE **)file);
815 fseek(*(FILE **)file,pos,SEEK_SET);
817 struct stat file_info;
820 *size = (size_t)file_info.st_size;
MUMPS_INT mumps_io_get_nb_files(MUMPS_INT *nb_files, const MUMPS_INT *type)
MUMPS_INT mumps_io_flag_async
MUMPS_INT mumps_io_set_file_name(MUMPS_INT *indice, char *name, MUMPS_INT *length, MUMPS_INT *type)
MUMPS_INT mumps_io_alloc_file_struct(MUMPS_INT *nb, MUMPS_INT which)
MUMPS_INT mumps_compute_file_size(void *file, size_t *size)
MUMPS_INT mumps_io_set_last_file(MUMPS_INT *dim, MUMPS_INT *type)
void mumps_update_current_file_position(mumps_file_struct *file_arg)
MUMPS_INT mumps_io_alloc_pointers(MUMPS_INT *nb_file_type, MUMPS_INT *dim)
MUMPS_INT mumps_io_max_file_size
MUMPS_INT mumps_prepare_pointers_for_write(double to_be_written, MUMPS_INT *pos_in_file, MUMPS_INT *file_number, const MUMPS_INT type, long long vaddr, size_t already_written)
MUMPS_INT mumps_io_init_vars(MUMPS_INT *myid_arg, MUMPS_INT *size_element, MUMPS_INT *async_arg)
MUMPS_INT mumps_compute_where_to_write(const double to_be_written, const MUMPS_INT type, long long vaddr, size_t already_written)
MUMPS_INT mumps_io_write__(void *file, void *loc_addr, size_t write_size, MUMPS_INT where, MUMPS_INT type)
MUMPS_INT mumps_init_file_structure(MUMPS_INT *_myid, long long *total_size_io, MUMPS_INT *size_element, MUMPS_INT *nb_file_type, MUMPS_INT *flag_tab)
MUMPS_INT mumps_compute_nb_concerned_files(long long block_size, MUMPS_INT *nb_concerned_files, long long vaddr)
MUMPS_INT mumps_io_read__(void *file, void *loc_addr, size_t size, MUMPS_INT local_offset, MUMPS_INT type)
MUMPS_INT mumps_set_file(MUMPS_INT type, MUMPS_INT file_number_arg)
MUMPS_INT mumps_io_read_os_buff__(void *file, void *loc_addr, size_t size, MUMPS_INT local_offset)
MUMPS_INT mumps_io_get_file_name(MUMPS_INT *indice, char *name, MUMPS_INT *length, MUMPS_INT *type)
MUMPS_INT mumps_init_file_name(char *mumps_dir, char *mumps_file, MUMPS_INT *mumps_dim_dir, MUMPS_INT *mumps_dim_file, MUMPS_INT *_myid)
MUMPS_INT mumps_io_write_os_buff__(void *file, void *loc_addr, size_t write_size, MUMPS_INT where)
MUMPS_INT mumps_io_open_files_for_read()
MUMPS_INT mumps_io_nb_file_type
MUMPS_INT mumps_directio_flag
MUMPS_INLINE MUMPS_INT mumps_gen_file_info(long long vaddr, MUMPS_INT *pos, MUMPS_INT *file)
MUMPS_INT mumps_io_is_init_called
char * mumps_ooc_file_prefix
MUMPS_INT mumps_io_do_read_block(void *address_block, long long block_size, MUMPS_INT *type_arg, long long vaddr, MUMPS_INT *ierr)
MUMPS_INT mumps_io_do_write_block(void *address_block, long long block_size, MUMPS_INT *type_arg, long long vaddr, MUMPS_INT *ierr)
MUMPS_INT mumps_elementary_data_size
MUMPS_INT mumps_free_file_pointers(MUMPS_INT *step)
void mumps_io_init_file_struct(MUMPS_INT *nb, MUMPS_INT which)
mumps_file_type * mumps_files
struct __mumps_file_type mumps_file_type
struct __mumps_file_struct mumps_file_struct
#define MUMPS_OOC_DEFAULT_DIR
MUMPS_INT mumps_io_sys_error(MUMPS_INT mumps_errno, const char *desc)
MUMPS_INT mumps_io_error(MUMPS_INT mumps_errno, const char *desc)