1 /* $Id: os_support.h 24643 2006-10-24 11:45:21Z janderwald $
3 * PROJECT: System regression tool for ReactOS
4 * LICENSE: GPL - See COPYING in the top level directory
5 * FILE: tools/sysreg/conf_parser.h
6 * PURPOSE: operating systems specific code
7 * PROGRAMMERS: Johannes Anderwald (johannes.anderwald at sbox tugraz at)
10 #include "os_support.h"
15 OsSupport::TimeEntryVector
OsSupport::s_Entries
;
17 //int gettimeofday(struct timeval *tv, void * tz);
18 //------------------------------------------------------------------------
19 void OsSupport::checkAlarms()
24 // gettimeofday(&tm, 0);
26 for (i
= 0; i
< s_Entries
.size(); i
++)
28 long diffsec
= s_Entries
[i
]->tm
.tv_sec
- tm
.tv_sec
;
31 cout
<< "terminating process pid:" << s_Entries
[i
]->pid
<< endl
;
32 terminateProcess(s_Entries
[i
]->pid
, -2);
34 s_Entries
.erase (s_Entries
.begin () + i
);
42 long secs
= s_Entries
[i
]->tm
.tv_sec
- tm
.tv_sec
;
47 bool OsSupport::hasAlarms ()
49 return (s_Entries
.size () != 0);
51 //------------------------------------------------------------------------
52 void OsSupport::cancelAlarms()
58 TerminateThread(s_hThread
, 0);
63 for(size_t i
= 0; i
< s_Entries
.size(); i
++)
76 HANDLE
OsSupport::s_hThread
= 0;
79 __inline
int gettimeofday(struct timeval
*tv
, struct timezone
*tz
)
88 GetSystemTimeAsFileTime(&ft
);
89 li
.LowPart
= ft
.dwLowDateTime
;
90 li
.HighPart
= ft
.dwHighDateTime
;
91 t
= li
.QuadPart
; /* In 100-nanosecond intervals */
92 t
-= EPOCHFILETIME
; /* Offset to the Epoch time */
93 t
/= 10; /* In microseconds */
94 tv
->tv_sec
= (long)(t
/ 1000000);
95 tv
->tv_usec
= (long)(t
% 1000000);
105 tz
->tz_minuteswest
= _timezone
/ 60;
106 tz
->tz_dsttime
= _daylight
;
112 bool OsSupport::terminateProcess(OsSupport::ProcessID pid
, int exitcode
)
114 HANDLE hProcess
= OpenProcess(PROCESS_TERMINATE
, FALSE
, pid
);
120 bool ret
= TerminateProcess(hProcess
, exitcode
);
121 CloseHandle(hProcess
);
125 OsSupport::ProcessID
OsSupport::createProcess(const char *procname
, int procargsnum
, const char **procargs
, bool wait
)
127 STARTUPINFO siStartInfo
;
128 PROCESS_INFORMATION piProcInfo
;
129 OsSupport::ProcessID pid
;
133 ZeroMemory(&siStartInfo
, sizeof(STARTUPINFO
));
134 ZeroMemory(&piProcInfo
, sizeof(PROCESS_INFORMATION
));
136 siStartInfo
.cb
= sizeof(STARTUPINFO
);
137 siStartInfo
.wShowWindow
= SW_SHOWNORMAL
;
138 siStartInfo
.dwFlags
= STARTF_USESHOWWINDOW
;
142 for (int i
= 1; i
< procargsnum
; i
++)
144 length
+= strlen(procargs
[i
]);
147 length
+= procargsnum
;
148 szBuffer
= (char*)malloc(length
* sizeof(char));
150 for (int i
= 1; i
< procargsnum
; i
++)
152 strcpy(&szBuffer
[length
], procargs
[i
]);
153 length
+= strlen(procargs
[i
]);
154 if (i
+ 1 < procargsnum
)
156 szBuffer
[length
] = ' ';
160 szBuffer
[length
] = '\0';
164 length
= strlen(procname
) + strlen(szBuffer
) + 2;
165 cmd
= (char*)malloc(length
* sizeof(char));
166 strcpy(cmd
, procname
);
168 strcat(cmd
, szBuffer
);
173 cmd
= _strdup(procname
);
176 if (!CreateProcess(NULL
, cmd
, NULL
, NULL
, FALSE
, NORMAL_PRIORITY_CLASS
, NULL
, NULL
, &siStartInfo
, &piProcInfo
))
178 cerr
<< "Error: CreateProcess failed " << cmd
<< endl
;
183 pid
= piProcInfo
.dwProcessId
;
186 WaitForSingleObject(piProcInfo
.hThread
, INFINITE
);
188 CloseHandle(piProcInfo
.hProcess
);
189 CloseHandle(piProcInfo
.hThread
);
194 void OsSupport::delayExecution(long value
)
199 DWORD WINAPI
AlarmThread(LPVOID param
)
201 LARGE_INTEGER liDueTime
;
203 hTimer
= CreateWaitableTimer(NULL
, TRUE
, "SysRegTimer");
208 liDueTime
.QuadPart
= -100000000LL;
211 SetWaitableTimer(hTimer
, &liDueTime
, 5000, NULL
, NULL
, FALSE
);
212 WaitForSingleObject(hTimer
, INFINITE
);
213 OsSupport::checkAlarms ();
218 void OsSupport::setAlarm(long secs
, OsSupport::ProcessID pid
)
221 PTIME_ENTRY entry
= (PTIME_ENTRY
) malloc(sizeof(TIME_ENTRY
));
224 cout
<< "secs: " << secs
<< endl
;
227 gettimeofday(&tm
, 0);
234 s_Entries
.push_back(entry
);
235 if (s_Entries
.size () == 1)
237 s_hThread
= CreateThread(NULL
, 0, AlarmThread
, 0, 0, NULL
);
243 /********************************************************************************************************************/
246 struct sigaction
OsSupport::s_sact
;
249 OsSupport::ProcessID
OsSupport::createProcess(char *procname
, int procargsnum
, char **procargs
, bool bWait
)
253 if ((pid
= fork()) < 0)
255 cerr
<< "OsSupport::createProcess> fork failed" << endl
;
260 execv(procname
, procargs
);
268 waitpid(pid
, NULL
, 0);
274 bool OsSupport::terminateProcess(OsSupport::ProcessID pid
, int exitcode
)
280 void OsSupport::delayExecution(long value
)
285 void handleSignal(int sig
)
289 OsSupport::checkAlarms();
291 else if (sig
== SIGCHLD
)
293 if (OsSupport::hasAlarms())
298 /// there are expiriation alarms active and a child died unexpectly
299 /// lets commit suicide
304 void OsSupport::setAlarm(long secs
, OsSupport::ProcessID pid
)
306 sigemptyset( &s_sact
.sa_mask
);
308 s_sact
.sa_handler
= handleSignal
;
309 sigaction( SIGALRM
, &s_sact
, NULL
);
311 PTIME_ENTRY entry
= (PTIME_ENTRY
) malloc(sizeof(TIME_ENTRY
));
315 gettimeofday(&tm
, 0);
320 for(size_t i
= 0; i
< s_Entries
.size(); i
++)
322 if (tm
.tv_sec
< s_Entries
[i
]->tm
.tv_sec
&& tm
.tv_usec
< s_Entries
[i
]->tm
.tv_usec
)
326 /* adjust alarm timer to new period */
329 s_Entries
.insert(s_Entries
.begin() + i
, entry
);
333 s_Entries
.push_back(entry
);
339 } // end of namespace System_