00001
00010 #ifdef WIN32
00011 #include "windows.h"
00012 #include "output.h"
00013 #include "signal.h"
00014 #include "process.h"
00015
00016
00017
00018
00019
00020 #ifndef KILLONLY
00021
00022 #include "gridlabd.h"
00023
00024 static int handler_stop = 0;
00025 void kill_stophandler(void)
00026 {
00027 handler_stop = 1;
00028 }
00029
00030 void msghandler(void *param)
00031 {
00032 char name[32];
00033 HANDLE hEvent;
00034 unsigned int sig = (unsigned int)(int64)param;
00035 unsigned int pid = _getpid();
00036 sprintf(name,"gridlabd.%d.%d",pid,sig);
00037 hEvent = CreateEventA(NULL,TRUE,FALSE,name);
00038 output_verbose("creating gridlabd signal handler %d for process %d",sig,pid);
00039 while (WaitForSingleObject(hEvent,INFINITE)==WAIT_OBJECT_0)
00040 {
00041 output_verbose("windows signal handler activated");
00042 raise(sig);
00043 ResetEvent(hEvent);
00044 }
00045 }
00046
00047 void kill_starthandler(void)
00048 {
00049 if (_beginthread(&msghandler, 0, (void*)SIGINT)==1 || _beginthread(&msghandler, 0, (void*)SIGTERM)==1)
00050 output_error("kill handler failed to start");
00051 else
00052 output_verbose("windows message signal handlers started");
00053 }
00054 #else
00055 #define output_error printf
00056 #define output_verbose
00057 #endif
00058
00061 int kill(unsigned short pid,
00062 int sig)
00063 {
00064 char name[32];
00065 HANDLE hEvent;
00066 sprintf(name,"gridlabd.%d.%d",(int)pid,sig);
00067 hEvent = OpenEventA(EVENT_MODIFY_STATE,FALSE,name);
00068 if (hEvent==NULL)
00069 {
00070 output_error("unable to signal gridlabd process %d with signal %d (error %d)", pid, sig, GetLastError());
00071 return 0;
00072 }
00073 else
00074 {
00075 SetEvent(hEvent);
00076 output_verbose("signal %d sent to gridlabd process %d", sig, pid);
00077 return 1;
00078 }
00079 }
00080 #endif
00081