aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjohnvg2004-04-29 11:13:17 +0000
committerjohnvg2004-04-29 11:13:17 +0000
commit9334098b1bda87b10d0c85b025e448cba0c96f8f (patch)
tree0d8f564f6f92f13158b084b4391de171e84ff343
parentconvert file names for MachO (diff)
add set_compiler_id and get_compiler_id
git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@1492 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
-rw-r--r--main/Windows/Clean System Files/thread_message.objbin3665 -> 2496 bytes
-rw-r--r--main/Windows/thread_message.c254
-rw-r--r--main/Windows/thread_message.h0
3 files changed, 254 insertions, 0 deletions
diff --git a/main/Windows/Clean System Files/thread_message.obj b/main/Windows/Clean System Files/thread_message.obj
index 79e99da..d600ff0 100644
--- a/main/Windows/Clean System Files/thread_message.obj
+++ b/main/Windows/Clean System Files/thread_message.obj
Binary files differ
diff --git a/main/Windows/thread_message.c b/main/Windows/thread_message.c
new file mode 100644
index 0000000..d261842
--- /dev/null
+++ b/main/Windows/thread_message.c
@@ -0,0 +1,254 @@
+
+#include <stdio.h>
+#include <windows.h>
+#include "Clean.h"
+#include "thread_message.h"
+
+static int CleanCompiler_message_nunber;
+
+int get_message_number (void)
+{
+ return RegisterWindowMessage ("CleanCompiler");
+}
+
+int get_current_thread_id (void)
+{
+ return GetCurrentThreadId();
+}
+
+int compiler_result_handler_installed=0;
+
+#ifdef IDE
+extern void (*dispatch_null_message_hook) (MSG*);
+
+#define MAX_N_COMPILERS 32
+
+int compiler_finished[MAX_N_COMPILERS];
+int compiler_exit_codes[MAX_N_COMPILERS];
+
+void compiler_result_handler (MSG *msg)
+{
+ if (msg->message==CleanCompiler_message_nunber){
+ unsigned int compiler_n;
+
+ compiler_n=msg->wParam;
+
+ if (compiler_n<MAX_N_COMPILERS){
+ compiler_exit_codes[compiler_n]=msg->lParam;
+ compiler_finished[compiler_n]=1;
+ }
+ }
+}
+
+void install_compiler_result_handler (void)
+{
+ CleanCompiler_message_nunber=get_message_number();
+
+ dispatch_null_message_hook = &compiler_result_handler;
+}
+
+int start_compiler_process (CleanString compiler_path,CleanString compiler_directory,CleanString command,
+ int *compiler_thread_id_p,int *compiler_thread_handle_p,int *compiler_process_handle_p)
+{
+ PSTR application_name,command_line,env,dir;
+ STARTUPINFO si;
+ PROCESS_INFORMATION pi;
+ int r;
+
+ if (!compiler_result_handler_installed){
+ install_compiler_result_handler();
+ compiler_result_handler_installed=1;
+ }
+
+ application_name=CleanStringCharacters (compiler_path);
+ dir=CleanStringCharacters (compiler_directory);
+ command_line=CleanStringCharacters (command);
+ env=NULL;
+
+ si.cb = sizeof (STARTUPINFO);
+ si.lpReserved = NULL;
+ si.lpReserved2 = NULL;
+ si.cbReserved2 = 0;
+ si.lpDesktop = NULL;
+ si.lpTitle = NULL;
+ si.dwFlags = 0;
+
+ r=CreateProcess (application_name,command_line,NULL,NULL,TRUE,DETACHED_PROCESS/*0*/,env,dir,&si,&pi);
+
+ if (r!=0){
+ *compiler_thread_id_p=pi.dwThreadId;
+ *compiler_thread_handle_p=pi.hThread;
+ *compiler_process_handle_p=pi.hProcess;
+ } else {
+ *compiler_thread_id_p=0;
+ *compiler_thread_handle_p=0;
+ *compiler_process_handle_p=0;
+ }
+
+ return r;
+}
+
+int get_finished_compiler_id_and_exit_code (int *exit_code_p)
+{
+ int compiler_n;
+
+ for (compiler_n=0; compiler_n<MAX_N_COMPILERS; ++compiler_n)
+ if (compiler_finished[compiler_n]){
+ *exit_code_p=compiler_exit_codes[compiler_n];
+ compiler_finished[compiler_n]=0;
+ return compiler_n;
+ }
+
+ *exit_code_p=0;
+ return -1;
+}
+#endif
+
+int get_integers_from_message (int wm_number,int *i1_p,int *i2_p)
+{
+ MSG message;
+ int r;
+
+ r=GetMessage (&message,NULL,wm_number,wm_number);
+
+ if (r!=0){
+ *i1_p=message.wParam;
+ *i2_p=message.lParam;
+ } else {
+ *i1_p=0;
+ *i2_p=0;
+ }
+
+ return r;
+}
+
+#define PM_QS_POSTMESSAGE ((QS_POSTMESSAGE | QS_HOTKEY | QS_TIMER) << 16)
+
+int get_integers_from_thread_message (int wm_number,int thread_handle,int *i1_p,int *i2_p)
+{
+ MSG message;
+ int r;
+
+ r=PeekMessage (&message,INVALID_HANDLE_VALUE,wm_number,wm_number,PM_NOREMOVE | (QS_POSTMESSAGE<<16));
+ while (r==0){
+ r=MsgWaitForMultipleObjects (1,&thread_handle,0,INFINITE,QS_POSTMESSAGE);
+
+ if (r==-1 || r==WAIT_OBJECT_0 || r==WAIT_ABANDONED_0){
+ *i1_p=0;
+ *i2_p=0;
+ return 0;
+ }
+
+ r=PeekMessage (&message,INVALID_HANDLE_VALUE,wm_number,wm_number,PM_NOREMOVE | (QS_POSTMESSAGE<<16));
+ }
+
+ r=PeekMessage (&message,INVALID_HANDLE_VALUE,wm_number,wm_number,PM_REMOVE | (QS_POSTMESSAGE<<16));
+/* r=GetMessage (&message,INVALID_HANDLE_VALUE,wm_number,wm_number); */
+
+ if (r!=0){
+ *i1_p=message.wParam;
+ *i2_p=message.lParam;
+ } else {
+ *i1_p=0;
+ *i2_p=0;
+ }
+
+ return r;
+}
+
+int get_string_from_file_map_and_delete_map (int file_map,CleanString s)
+{
+ int l,i;
+ char *chars,*p;
+
+ chars=CleanStringCharacters (s);
+ l=CleanStringLength (s);
+
+ p=MapViewOfFile ((HANDLE)file_map,FILE_MAP_ALL_ACCESS,0,0,l);
+ if (p==NULL)
+ return 0;
+
+ for (i=0; i<l; ++i)
+ chars[i]=p[i];
+
+ UnmapViewOfFile (p);
+
+ CloseHandle ((HANDLE)file_map);
+
+ return 1;
+}
+
+int send_string_to_thread (int thread_id,int process_handle,int wm_number,CleanString s)
+{
+ HANDLE file_map,file_map2;
+ char *chars,*p1;
+ int r,l;
+ /*
+ int a;
+ */
+
+ chars=CleanStringCharacters (s);
+ l=CleanStringLength (s);
+
+ if (l==0 || chars[l-1]!='\0')
+ return 0;
+
+ file_map=CreateFileMapping ((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,l,NULL);
+ if (file_map==NULL)
+ return 0;
+
+ p1=MapViewOfFile (file_map,FILE_MAP_ALL_ACCESS,0,0,l);
+ if (p1==NULL)
+ return 0;
+
+ {
+ char *s_p,*d_p,c;
+
+ s_p=chars;
+ d_p=p1;
+ do {
+ c=*s_p++;
+ *d_p++=c;
+ } while (c!='\0');
+ }
+
+ UnmapViewOfFile (p1);
+
+ r=DuplicateHandle (GetCurrentProcess(),file_map,(HANDLE)process_handle,&file_map2,0,0,DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS);
+
+ if (r==0)
+ return 0;
+
+ do {
+ /*
+ r=PostThreadMessage (thread_id,wm_number,a,l);
+ */
+ r=PostThreadMessage (thread_id,wm_number,l,(int)file_map2);
+ } while (r==0);
+
+ return r;
+}
+
+int send_integers_to_thread (int thread_id,int wm_number,int i1,int i2)
+{
+ int r;
+
+ do {
+ r=PostThreadMessage (thread_id,wm_number,i1,i2);
+ } while (r==0);
+
+ return r;
+}
+
+int compiler_id=-1;
+
+int set_compiler_id (int compiler_id_p)
+{
+ compiler_id=compiler_id_p;
+ return compiler_id_p;
+}
+
+int get_compiler_id (void)
+{
+ return compiler_id;
+}
diff --git a/main/Windows/thread_message.h b/main/Windows/thread_message.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/main/Windows/thread_message.h