Re: [Administrivia] On ruby and contrib/

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, Jun 8, 2013 at 7:07 AM, Duy Nguyen <pclouds@xxxxxxxxx> wrote:
> On Sat, Jun 8, 2013 at 6:56 PM, Felipe Contreras
> <felipe.contreras@xxxxxxxxx> wrote:
>> On Sat, Jun 8, 2013 at 6:28 AM, Duy Nguyen <pclouds@xxxxxxxxx> wrote:

>>> but how many people on this
>>> list understand git design and limits _and_ ruby's good enough to spot
>>> the bugs?
>>
>> Now you are changing the subject. Does that mean that you accept that
>> 'fork' wouldn't be a problem when writing Ruby scripts?
>
> There are a lot of static variables in builtin/ (and outside too),
> which make it non-entrant, or at least not safe.

So?

> fork provides a process space isolation, some depend on that.

Process space isolation from what?

> And there are die() everywhere. Good luck controlling them.

Done.

--- a/ruby/git.c
+++ b/ruby/git.c
@@ -1,6 +1,7 @@
 #include <builtin.h>
 #include <cache.h>
 #include <fcntl.h>
+#include <ucontext.h>

 #undef NORETURN
 #undef PATH_SEP
@@ -8,6 +9,8 @@
 #include <ruby.h>

 static VALUE shellwords;
+static ucontext_t main_context;
+static int status;

 struct cmd_struct {
 	const char *cmd;
@@ -73,7 +76,14 @@ static VALUE git_rb_backticks(int o_argc, VALUE
*o_argv, VALUE ctx)
 	if (cmd->option & RUN_SETUP)
 		prefix = setup_git_directory();

-	i = cmd->fn(argc, argv, prefix);
+	getcontext(&main_context);
+	if (status == 0) {
+		status += 1;
+		i = cmd->fn(argc, argv, prefix);
+	} else {
+		i = 1;
+	}
+	status = 0;
 	rb_last_status_set(i, getpid());

 	fflush(stdout);
@@ -87,9 +97,19 @@ static VALUE git_rb_backticks(int o_argc, VALUE
*o_argv, VALUE ctx)
 	return rb_str_new(buf, i);
 }

+static void bye(void)
+{
+	if (status != 1)
+		return;
+	status += 1;
+	setcontext(&main_context);
+}
+
 void Init_git(void)
 {
 	rb_require("shellwords");
 	shellwords = rb_define_module("Shellwords");
 	rb_define_global_function("`", git_rb_backticks, -1);
+
+	atexit(bye);
 }

>> As for the people that know Git and Ruby; they can learn. Didn't you
>> just said that you didn't see any problem with the community learning
>> a new language?
>
> I said nothing about the community being ready _now_, did I?

If they can learn Ruby five years from now, then can learn it now.

> When you have the support for Ruby in Git, sure go ahead.

You are going in circles.

>>> If a bug is found and requires major restructuring in
>>> libgit.a, how are you sure it's worth the effort and does not
>>> destablize the rest of git?
>>
>> There is no need to destabilize anything. I just showed you 100 lines
>> of code that are able to run git commands without forks, and without
>> changing anything in libgit.a.
>
> And how do you deal with, for example die(), or thread safety?

See above for die(), and I don't see many perl or shell scripts with
multiple threads, why should the Ruby scripts have more than one
thread?

-- 
Felipe Contreras
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]