5
/* OS specific server process/thread creation and destruction
17
/************************** Windows threads **************************/
25
thread_id_t armci_serv_tid;
26
unsigned long armci_serv_handle;
28
#define NEWTHREAD CreateThread
30
#define NEWTHREAD _beginthreadex
33
unsigned __stdcall armci_wrap_func(void *arg)
38
/* boost the server thread priority be better responsiveness */
39
(void)SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST);
47
void armci_create_server_thread ( void* (* func)(void*) )
49
/* as we need to use std C rt library we cannot use CreateThread */
50
armci_serv_handle = NEWTHREAD(NULL, 0, armci_wrap_func, (void*)func,
52
if(!armci_serv_handle)
53
armci_die("armci_create_server_thread: create failed",0);
59
void armci_terminate_server_thread()
62
/* TerminateThread(armci_serv_handle,&rc);*/
65
/****************************** PTHREADS *****************************/
66
#elif defined(PTHREADS)
69
thread_id_t armci_serv_tid;
71
void armci_create_server_thread ( void* (* func)(void*) )
76
if(pthread_attr_init(&attr))
77
armci_die("armci_create_server_thread: attr init failed",0);
79
#if defined(AIX) || defined(SOLARIS)
80
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
83
rc = pthread_create(&armci_serv_tid, &attr, func, NULL);
84
if(rc) armci_die("armci_create_server_thread: create failed",errno);
86
pthread_attr_destroy(&attr);
90
void armci_terminate_server_thread()
92
if(pthread_join(armci_serv_tid,NULL))
93
armci_die("armci_terminate_server_thread: failed",0);
98
/**************************** Unix processes ******************************/
104
# include <sys/types.h>
107
# include <sys/wait.h>
110
pid_t server_pid= (pid_t)0;
113
void armci_create_server_process ( void* (* func)(void*) )
117
if ( (pid = fork() ) < 0)
118
armci_die("fork failed", (int)pid);
122
armci_me = SOFFSET - armci_me; /* server id derived from parent id */
126
} else server_pid = pid;
130
void armci_wait_server_process()
135
if(!server_pid) return;
137
if (rc != server_pid){
138
perror("ARMCI master: wait for child process (server) failed:");
140
server_pid = (pid_t)0;