about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorluislavena <luislavena@19e92222-5c0b-0410-8929-a290d50e31e9>2008-04-18 07:09:41 +0000
committerluislavena <luislavena@19e92222-5c0b-0410-8929-a290d50e31e9>2008-04-18 07:09:41 +0000
commit87e6494e924849fc22d0602187b650a0b7a11fc8 (patch)
tree0fff3ee238efeb2c8d724286ba91267043ae8755
parent12cc38aaf337b2b0e0d518ec6d311e8d82db7d30 (diff)
downloadunicorn-87e6494e924849fc22d0602187b650a0b7a11fc8.tar.gz
git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/branches/stable_1-2@1011 19e92222-5c0b-0410-8929-a290d50e31e9
-rw-r--r--projects/mongrel_service/tests/fixtures/mock_process.bas76
1 files changed, 56 insertions, 20 deletions
diff --git a/projects/mongrel_service/tests/fixtures/mock_process.bas b/projects/mongrel_service/tests/fixtures/mock_process.bas
index 833967c..e9405ab 100644
--- a/projects/mongrel_service/tests/fixtures/mock_process.bas
+++ b/projects/mongrel_service/tests/fixtures/mock_process.bas
@@ -14,43 +14,79 @@
 #include once "crt.bi"
 #include once "windows.bi"
 
-dim shared stop_hit as BOOL
+dim shared as any ptr control_signal, control_mutex
+dim shared flagged as byte
+dim shared result as integer
 
-function _console_handler(byval dwCtrlType as DWORD) as BOOL
+function slow_console_handler(byval dwCtrlType as DWORD) as BOOL
     dim result as BOOL
     
     if (dwCtrlType = CTRL_C_EVENT) then
-        '# slow response, take 10 seconds...
-        fprintf(stdout, !"out: slow stop\r\n")
-        sleep (10*1000)
+        fprintf(stdout, !"out: CTRL-C received\r\n")
+        mutexlock(control_mutex)
         result = 1
-        stop_hit = TRUE
+        flagged = 1
+        condsignal(control_signal)
+        mutexunlock(control_mutex)
+    elseif (dwCtrlType = CTRL_BREAK_EVENT) then
+        fprintf(stdout, !"out: CTRL-BREAK received\r\n")
+        mutexlock(control_mutex)
+        result = 1
+        flagged = 2
+        condsignal(control_signal)
+        mutexunlock(control_mutex)
     end if
     
     return result
 end function
 
-sub main()
+sub wait_for(byval flag_level as integer)
+    flagged = 0
+    '# set handler
+    if (SetConsoleCtrlHandler(@slow_console_handler, 1) = 0) then
+        fprintf(stderr, !"err: cannot set console handler\r\n")
+    end if
+    fprintf(stdout, !"out: waiting for keyboard signal\r\n")
+    mutexlock(control_mutex)
+    do until (flagged = flag_level)
+        condwait(control_signal, control_mutex)
+    loop
+    mutexunlock(control_mutex)
+    fprintf(stdout, !"out: got keyboard signal\r\n")
+    if (SetConsoleCtrlHandler(@slow_console_handler, 0) = 0) then
+        fprintf(stderr, !"err: cannot unset console handler\r\n")
+    end if
+end sub
+
+function main() as integer
     fprintf(stdout, !"out: message\r\n")
     fprintf(stderr, !"err: error\r\n")
     
     select case lcase(command(1))
         case "wait":
             sleep
-            
+            return 0
+
         case "error":
             '# terminate with error code
-            end 1
-            
-        case "slow":
-            stop_hit = FALSE
-            SetConsoleCtrlHandler(@_console_handler, 1)
-            do while (stop_hit = FALSE)
-                sleep 15
-            loop
-            SetConsoleCtrlHandler(@_console_handler, 0)
-            end 10
+            return 1
+        
+        case "slow1":
+            wait_for(1)
+            return 10
+        
+        case "slow2":
+            wait_for(2)
+            return 20
     end select
-end sub
+end function
+
+control_signal = condcreate()
+control_mutex = mutexcreate()
+
+result = main()
+
+conddestroy(control_signal)
+mutexdestroy(control_mutex)
 
-main()
+end result