1 /*
2  *
3  *  This file is part of MUMPS 5.1.2, released
4  *  on Mon Oct  2 07:37:01 UTC 2017
5  *
6  *
7  *  Copyright 1991-2017 CERFACS, CNRS, ENS Lyon, INP Toulouse, Inria,
8  *  University of Bordeaux.
9  *
10  *  This version of MUMPS is provided to you free of charge. It is
11  *  released under the CeCILL-C license:
12  *  http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html
13  *
14  */
15 #ifndef MUMPS_IO_THREAD_H
16 #define MUMPS_IO_THREAD_H
17 #include "mumps_compat.h"
18 #include "mumps_c_types.h"
19 #if ! defined (MUMPS_WIN32) && ! defined (WITHOUT_PTHREAD)
20 # include <unistd.h>
21 # include <pthread.h>
22 # include <sys/types.h>
23 # include <sys/time.h>
24 # include <time.h>
25 # define MAX_IO 20
26 # define MAX_FINISH_REQ 40
27 # define IO_FLAG_STOP 1
28 # define IO_FLAG_RUN 0
29 # define IO_READ 1
30 # define IO_WRITE 0
31 struct request_io{
32   MUMPS_INT inode;
33   MUMPS_INT req_num; /*request number*/
34   void* addr;  /*memory address (either source or dest)*/
35   long long size;    /* size of the requested io (unit=size of elementary mumps data)*/
36   long long vaddr; /* virtual address for file management */
37   MUMPS_INT io_type; /*read or write*/
38   MUMPS_INT file_type; /* cb or lu or ... */
39   pthread_cond_t local_cond;
40   MUMPS_INT int_local_cond;
41 };
42 /* Exported global variables */
43 extern MUMPS_INT io_flag_stop,current_req_num;
44 extern pthread_t io_thread,main_thread;
45 extern pthread_mutex_t io_mutex;
46 extern pthread_cond_t cond_io,cond_nb_free_finished_requests,cond_nb_free_active_requests,cond_stop;
47 extern pthread_mutex_t io_mutex_cond;
48 extern MUMPS_INT int_sem_io,int_sem_nb_free_finished_requests,int_sem_nb_free_active_requests,int_sem_stop;
49 extern MUMPS_INT with_sem;
50 extern struct request_io *io_queue;
51 extern MUMPS_INT first_active,last_active,nb_active;
52 extern MUMPS_INT *finished_requests_inode,*finished_requests_id,first_finished_requests,
53   last_finished_requests,nb_finished_requests,smallest_request_id;
54 extern MUMPS_INT mumps_owns_mutex;
55 extern MUMPS_INT test_request_called_from_mumps;
56 /* Exported functions */
57 void* mumps_async_thread_function_with_sem (void* arg);
58 MUMPS_INT   mumps_is_there_finished_request_th(MUMPS_INT* flag);
59 MUMPS_INT   mumps_clean_request_th(MUMPS_INT* request_id);
60 MUMPS_INT   mumps_wait_req_sem_th(MUMPS_INT *request_id);
61 MUMPS_INT   mumps_test_request_th(MUMPS_INT* request_id,MUMPS_INT *flag);
62 MUMPS_INT   mumps_wait_request_th(MUMPS_INT *request_id);
63 MUMPS_INT   mumps_low_level_init_ooc_c_th(MUMPS_INT* async, MUMPS_INT* ierr);
64 MUMPS_INT   mumps_async_write_th(const MUMPS_INT * strat_IO,void * address_block,long long block_size,
65                            MUMPS_INT * inode,MUMPS_INT * request_arg,MUMPS_INT * type,long long vaddr,MUMPS_INT * ierr);
66 MUMPS_INT   mumps_async_read_th(const MUMPS_INT * strat_IO,void * address_block,long long block_size,MUMPS_INT * inode,MUMPS_INT * request_arg,
67                            MUMPS_INT * type,long long vaddr,MUMPS_INT * ierr);
68 MUMPS_INT mumps_clean_io_data_c_th(MUMPS_INT *myid);
69 MUMPS_INT mumps_get_sem(void *arg,MUMPS_INT *value);
70 MUMPS_INT mumps_wait_sem(void *arg,pthread_cond_t *cond);
71 MUMPS_INT mumps_post_sem(void *arg,pthread_cond_t *cond);
72 MUMPS_INT mumps_clean_finished_queue_th();
73 #endif /*_WIN32 && WITHOUT_PTHREAD*/
74 #endif /* MUMPS_IO_THREAD_H */
75