From: Johannes Sixt <johannes.sixt@telecom.at>
To: git@vger.kernel.org
Cc: Johannes Sixt <johannes.sixt@telecom.at>
Subject: [PATCH 14/40] Windows: Implement setitimer() and sigaction().
Date: Wed, 27 Feb 2008 19:54:37 +0100 [thread overview]
Message-ID: <1204138503-6126-15-git-send-email-johannes.sixt@telecom.at> (raw)
In-Reply-To: <1204138503-6126-1-git-send-email-johannes.sixt@telecom.at>
The timer is implemented using a thread that calls the signal handler
at regular intervals.
We also replace Windows's signal() function because we must intercept
that SIGALRM is set (which is used when a timer is canceled).
Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
---
compat/mingw.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
git-compat-util.h | 3 +
2 files changed, 113 insertions(+), 1 deletions(-)
diff --git a/compat/mingw.c b/compat/mingw.c
index 24f783b..4888a03 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -129,12 +129,121 @@ struct passwd *getpwuid(int uid)
return &p;
}
-int setitimer(int type, struct itimerval *in, struct itimerval *out)
+static HANDLE timer_event;
+static HANDLE timer_thread;
+static int timer_interval;
+static int one_shot;
+static sig_handler_t timer_fn = SIG_DFL;
+
+/* The timer works like this:
+ * The thread, ticktack(), is basically a trivial routine that most of the
+ * time only waits to receive the signal to terminate. The main thread
+ * tells the thread to terminate by setting the timer_event to the signalled
+ * state.
+ * But ticktack() does not wait indefinitely; instead, it interrupts the
+ * wait state every now and then, namely exactly after timer's interval
+ * length. At these opportunities it calls the signal handler.
+ */
+
+static __stdcall unsigned ticktack(void *dummy)
+{
+ while (WaitForSingleObject(timer_event, timer_interval) == WAIT_TIMEOUT) {
+ if (timer_fn == SIG_DFL)
+ die("Alarm");
+ if (timer_fn != SIG_IGN)
+ timer_fn(SIGALRM);
+ if (one_shot)
+ break;
+ }
+ return 0;
+}
+
+static int start_timer_thread(void)
{
+ timer_event = CreateEvent(NULL, FALSE, FALSE, NULL);
+ if (timer_event) {
+ timer_thread = (HANDLE) _beginthreadex(NULL, 0, ticktack, NULL, 0, NULL);
+ if (!timer_thread )
+ return errno = ENOMEM,
+ error("cannot start timer thread");
+ } else
+ return errno = ENOMEM,
+ error("cannot allocate resources timer");
return 0;
}
+static void stop_timer_thread(void)
+{
+ if (timer_event)
+ SetEvent(timer_event); /* tell thread to terminate */
+ if (timer_thread) {
+ int rc = WaitForSingleObject(timer_thread, 1000);
+ if (rc == WAIT_TIMEOUT)
+ error("timer thread did not terminate timely");
+ else if (rc != WAIT_OBJECT_0)
+ error("waiting for timer thread failed: %lu",
+ GetLastError());
+ CloseHandle(timer_thread);
+ }
+ if (timer_event)
+ CloseHandle(timer_event);
+ timer_event = NULL;
+ timer_thread = NULL;
+}
+
+static inline int is_timeval_eq(const struct timeval *i1, const struct timeval *i2)
+{
+ return i1->tv_sec == i2->tv_sec && i1->tv_usec == i2->tv_usec;
+}
+
+int setitimer(int type, struct itimerval *in, struct itimerval *out)
+{
+ static const struct timeval zero;
+ static int atexit_done;
+
+ if (out != NULL)
+ return errno = EINVAL,
+ error("setitmer param 3 != NULL not implemented");
+ if (!is_timeval_eq(&in->it_interval, &zero) &&
+ !is_timeval_eq(&in->it_interval, &in->it_value))
+ return errno = EINVAL,
+ error("setitmer: it_interval must be zero or eq it_value");
+
+ if (timer_thread)
+ stop_timer_thread();
+
+ if (is_timeval_eq(&in->it_value, &zero) &&
+ is_timeval_eq(&in->it_interval, &zero))
+ return 0;
+
+ timer_interval = in->it_value.tv_sec * 1000 + in->it_value.tv_usec / 1000;
+ one_shot = is_timeval_eq(&in->it_interval, &zero);
+ if (!atexit_done) {
+ atexit(stop_timer_thread);
+ atexit_done = 1;
+ }
+ return start_timer_thread();
+}
+
int sigaction(int sig, struct sigaction *in, struct sigaction *out)
{
+ if (sig != SIGALRM)
+ return errno = EINVAL,
+ error("sigaction only implemented for SIGALRM");
+ if (out != NULL)
+ return errno = EINVAL,
+ error("sigaction: param 3 != NULL not implemented");
+
+ timer_fn = in->sa_handler;
return 0;
}
+
+#undef signal
+sig_handler_t mingw_signal(int sig, sig_handler_t handler)
+{
+ if (sig != SIGALRM)
+ return signal(sig, handler);
+ sig_handler_t old = timer_fn;
+ timer_fn = handler;
+ return old;
+}
diff --git a/git-compat-util.h b/git-compat-util.h
index c576f5a..483ace2 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -602,6 +602,9 @@ char *mingw_getcwd(char *pointer, int len);
int mingw_rename(const char*, const char*);
#define rename mingw_rename
+sig_handler_t mingw_signal(int sig, sig_handler_t handler);
+#define signal mingw_signal
+
#endif /* __MINGW32__ */
#endif
--
1.5.4.1.126.ge5a7d
next prev parent reply other threads:[~2008-02-27 18:59 UTC|newest]
Thread overview: 138+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-02-27 18:54 [PATCH 00/40] MinGW port Johannes Sixt
2008-02-27 18:54 ` [PATCH 01/40] Add compat/regex.[ch] and compat/fnmatch.[ch] Johannes Sixt
2008-02-27 23:43 ` Johannes Schindelin
2008-02-27 18:54 ` [PATCH 02/40] Compile some programs only conditionally Johannes Sixt
2008-02-28 11:57 ` Johannes Schindelin
2008-02-28 20:30 ` Johannes Sixt
2008-02-29 0:47 ` Johannes Schindelin
2008-02-29 20:58 ` Johannes Sixt
2008-02-29 21:53 ` Johannes Schindelin
2008-02-27 18:54 ` [PATCH 03/40] Add target architecture MinGW Johannes Sixt
2008-02-28 12:05 ` Johannes Schindelin
2008-02-28 12:57 ` Paolo Bonzini
2008-02-28 14:56 ` Johannes Schindelin
2008-02-28 20:40 ` Johannes Sixt
2008-02-29 1:07 ` Johannes Schindelin
2008-02-29 21:03 ` Johannes Sixt
2008-02-29 21:54 ` Johannes Schindelin
2008-03-05 21:21 ` Johannes Sixt
2008-03-05 22:18 ` Johannes Schindelin
2008-03-05 22:22 ` Junio C Hamano
2008-03-05 22:28 ` Johannes Schindelin
2008-03-05 22:51 ` Junio C Hamano
2008-03-06 0:11 ` Johannes Schindelin
2008-03-06 1:14 ` [PATCH 1/2] Add strbuf_initf() Johannes Schindelin
2008-03-06 6:33 ` Mike Hommey
2008-03-06 9:03 ` Reece Dunn
2008-03-06 10:55 ` Johannes Schindelin
2008-03-06 11:53 ` Reece Dunn
2008-03-06 12:52 ` Johannes Schindelin
2008-03-06 16:29 ` [PATCH 1/2 v2] Add strbuf_vaddf(), use it in strbuf_addf(), and add strbuf_initf() Johannes Schindelin
2008-03-06 16:38 ` Johannes Sixt
2008-03-06 16:47 ` Johannes Sixt
2008-03-06 16:59 ` Johannes Schindelin
2008-03-06 18:18 ` [PATCH 1/2] Add strbuf_initf() Kristian Høgsberg
2008-03-06 18:26 ` Johannes Schindelin
2008-03-06 18:35 ` Kristian Høgsberg
2008-03-06 19:10 ` Mike Hommey
2008-03-06 10:53 ` Johannes Schindelin
2008-03-06 12:09 ` Jeff King
2008-03-06 1:15 ` [PATCH 2/2] format-patch: add --reviewed-by=<ident> Johannes Schindelin
2008-03-06 2:40 ` Junio C Hamano
2008-03-06 10:40 ` Johannes Schindelin
2008-03-06 20:38 ` [PATCH 03/40] Add target architecture MinGW Johannes Sixt
2008-03-11 21:30 ` Johannes Sixt
2008-03-11 23:28 ` Johannes Schindelin
2008-03-12 22:59 ` Johannes Sixt
2008-03-12 23:06 ` Johannes Schindelin
2008-02-27 18:54 ` [PATCH 04/40] Windows: Use the Windows style PATH separator ';' Johannes Sixt
2008-02-28 9:25 ` Paolo Bonzini
2008-02-28 20:43 ` Johannes Sixt
2008-02-29 1:09 ` Johannes Schindelin
2008-02-29 7:57 ` Paolo Bonzini
2008-02-29 12:19 ` Johannes Schindelin
2008-02-29 12:45 ` Paolo Bonzini
2008-02-29 12:59 ` Johannes Schindelin
2008-02-28 17:57 ` Junio C Hamano
2008-02-27 18:54 ` [PATCH 05/40] Windows: Strip ".exe" from the program name Johannes Sixt
2008-02-27 18:54 ` [PATCH 06/40] Windows: Implement a wrapper of the open() function Johannes Sixt
2008-02-27 18:54 ` [PATCH 07/40] Windows: A minimal implemention of getpwuid() Johannes Sixt
2008-02-27 18:54 ` [PATCH 08/40] Windows: always chmod(, 0666) before unlink() Johannes Sixt
2008-02-28 12:09 ` Johannes Schindelin
2008-02-27 18:54 ` [PATCH 09/40] Windows: Work around misbehaved rename() Johannes Sixt
2008-02-27 18:54 ` [PATCH 10/40] Windows: Treat Windows style path names Johannes Sixt
2008-02-28 12:18 ` Johannes Schindelin
2008-02-27 18:54 ` [PATCH 11/40] Windows: Handle absolute paths in safe_create_leading_directories() Johannes Sixt
2008-02-27 18:54 ` [PATCH 12/40] Windows: Implement gettimeofday() Johannes Sixt
2008-02-27 18:54 ` [PATCH 13/40] Windows: Fix PRIuMAX definition Johannes Sixt
2008-02-28 12:21 ` Johannes Schindelin
2008-02-28 20:45 ` Johannes Sixt
2008-02-27 18:54 ` Johannes Sixt [this message]
2008-02-27 18:54 ` [PATCH 15/40] Windows: A work-around for a misbehaved vsnprintf Johannes Sixt
2008-02-27 18:54 ` [PATCH 16/40] Windows: Wrap execve so that shell scripts can be invoked Johannes Sixt
2008-02-27 18:54 ` [PATCH 17/40] Windows: A pipe() replacement whose ends are not inherited to children Johannes Sixt
2008-02-27 18:54 ` [PATCH 18/40] Windows: Implement start_command() Johannes Sixt
2008-02-27 18:54 ` [PATCH 19/40] Windows: Change the name of hook scripts to make them not executable Johannes Sixt
2008-02-28 15:20 ` Johannes Schindelin
2008-02-28 20:48 ` Johannes Sixt
2008-02-29 1:11 ` Johannes Schindelin
2008-02-27 18:54 ` [PATCH 20/40] Windows: A rudimentary poll() emulation Johannes Sixt
2008-02-28 9:36 ` Paolo Bonzini
2008-02-28 20:49 ` Johannes Sixt
[not found] ` <5d46db230802282019o21f9ed9fo75fed8744625289e@mail.gmail.com>
[not found] ` <200802292216.25014.johannes.sixt@telecom.at>
2008-02-29 21:47 ` Govind Salinas
2008-02-29 22:16 ` Johannes Sixt
2008-02-29 23:17 ` Brian Dessent
2008-03-01 15:48 ` Robin Rosenberg
2008-03-01 19:24 ` Johannes Sixt
2008-02-27 18:54 ` [PATCH 21/40] Windows: Disambiguate DOS style paths from SSH URLs Johannes Sixt
2008-02-28 15:22 ` Johannes Schindelin
2008-02-28 20:51 ` Johannes Sixt
2008-02-27 18:54 ` [PATCH 22/40] Windows: Implement asynchronous functions as threads Johannes Sixt
2008-02-28 15:28 ` Johannes Schindelin
2008-02-28 17:48 ` Paul Franz
2008-02-29 1:27 ` Johannes Schindelin
2008-02-29 1:46 ` Paul Franz
2008-02-29 1:54 ` Johannes Schindelin
2008-02-29 3:08 ` Paul Franz
2008-02-29 7:51 ` Junio C Hamano
2008-02-29 11:45 ` Paul Franz
2008-02-29 10:26 ` Johannes Schindelin
2008-02-28 21:01 ` Johannes Sixt
2008-02-29 1:17 ` Johannes Schindelin
2008-02-27 18:54 ` [PATCH 23/40] Windows: Local clone must use the drive letter in absolute paths Johannes Sixt
2008-02-28 15:31 ` Johannes Schindelin
2008-02-27 18:54 ` [PATCH 24/40] Windows: Work around incompatible sort and find Johannes Sixt
2008-02-27 18:54 ` [PATCH 25/40] Windows: Implement a cpio emulation in git-clone.sh Johannes Sixt
2008-02-27 18:54 ` [PATCH 26/40] Windows: Implement wrappers for gethostbyname(), socket(), and connect() Johannes Sixt
2008-02-27 18:54 ` [PATCH 27/40] Windows: Implement a custom spawnve() Johannes Sixt
2008-02-28 15:36 ` Johannes Schindelin
2008-02-28 21:04 ` Johannes Sixt
2008-02-29 1:18 ` Johannes Schindelin
2008-02-27 18:54 ` [PATCH 28/40] Windows: Add a new lstat and fstat implementation based on Win32 API Johannes Sixt
2008-02-27 18:54 ` [PATCH 29/40] Windows: Use a customized struct stat that also has the st_blocks member Johannes Sixt
2008-02-27 18:54 ` [PATCH 30/40] Turn builtin_exec_path into a function Johannes Sixt
2008-02-27 18:54 ` [PATCH 31/40] Compute the ultimate fallback for exec_path from the program invocation Johannes Sixt
2008-02-27 18:54 ` [PATCH 32/40] Windows: Use a relative default template_dir and ETC_GITCONFIG Johannes Sixt
2008-02-27 18:54 ` [PATCH 33/40] When installing, be prepared that template_dir may be relative Johannes Sixt
2008-02-28 9:49 ` Paolo Bonzini
2008-02-28 15:45 ` Johannes Schindelin
2008-02-28 15:57 ` Paolo Bonzini
2008-02-28 21:12 ` Johannes Sixt
2008-02-29 1:21 ` Johannes Schindelin
2008-02-27 18:54 ` [PATCH 34/40] Windows: Make the pager work Johannes Sixt
2008-02-27 18:54 ` [PATCH 35/40] Windows: Work around an oddity when a pipe with no reader is written to Johannes Sixt
2008-02-27 18:54 ` [PATCH 36/40] Avoid the "dup dance" in wt_status_print_verbose() when possible Johannes Sixt
2008-02-28 15:48 ` Johannes Schindelin
2008-02-27 18:55 ` [PATCH 37/40] Windows: Make 'git help -a' work Johannes Sixt
2008-02-28 9:52 ` Paolo Bonzini
2008-02-27 18:55 ` [PATCH 38/40] Windows: TMP and TEMP environment variables specify a temporary directory Johannes Sixt
2008-02-27 18:55 ` [PATCH 39/40] Windows: Fix ntohl() related warnings about printf formatting Johannes Sixt
2008-02-27 18:55 ` [PATCH 40/40] compat/pread.c: Add foward decl to fix warning Johannes Sixt
2008-02-28 15:51 ` Johannes Schindelin
2008-02-27 22:01 ` [PATCH 00/40] MinGW port Marius Storm-Olsen
2008-02-27 23:34 ` Martin Langhoff
2008-02-28 3:38 ` Nguyen Thai Ngoc Duy
2008-02-27 23:58 ` Johannes Schindelin
2008-03-02 21:20 ` Johannes Sixt
2008-03-02 22:07 ` Johannes Schindelin
2008-03-03 18:34 ` Johannes Sixt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1204138503-6126-15-git-send-email-johannes.sixt@telecom.at \
--to=johannes.sixt@telecom.at \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).