Modified to allow other threads to run in a multithreaded environment.
diff --git a/Modules/flmodule.c b/Modules/flmodule.c
index bd5ff56..796e297 100644
--- a/Modules/flmodule.c
+++ b/Modules/flmodule.c
@@ -29,6 +29,16 @@
    and possibly also with previous versions.
    (You must also edit FL.py to set _v15 to 1.) */
 
+/* A half-hearted attempt has been made to allow programs using this
+ * module to exploit parallelism (through the threads module). No provisions
+ * have been made for multiple threads to use this module at the same time,
+ * though. So, a program with a forms thread and a non-forms thread will work
+ * fine but a program with two threads using forms will probably crash (unless
+ * the program takes precaution to ensure that only one thread can be in
+ * this module at any time). This will have to be fixed some time.
+ * (A fix will probably also have to synchronise with the gl module).
+ */
+
 #include "forms.h"
 
 #include "allobjects.h"
@@ -1964,7 +1974,9 @@
 		return NULL;
 
 	for (;;) {
+	        BGN_SAVE
 		generic = (*func)();
+		END_SAVE
 		if (generic == NULL) {
 			INCREF(None);
 			return None;
@@ -2131,7 +2143,9 @@
 {
 	long retval;
 	short arg1 ;
+	BGN_SAVE
 	retval = fl_qread(&arg1);
+	END_SAVE
 	{ object *v = newtupleobject(2);
 	  if (v == NULL) return NULL;
 	  settupleitem(v, 0, newintobject(retval));
@@ -2273,7 +2287,9 @@
 
         if (!getargs(args, "(sss)", &a, &b, &c)) return NULL;
 
+	BGN_SAVE
 	fl_show_message(a, b, c);
+	END_SAVE
 
 	INCREF(None);
 	return None;
@@ -2287,6 +2303,7 @@
 	char *m1, *m2, *m3, *b1, *b2, *b3;
 	int nb;
 	char *format;
+	int rv;
 
 	if (args == NULL || !is_tupleobject(args)) {
 		err_badarg();
@@ -2314,7 +2331,10 @@
         if (!getargs(args, format, &m1, &m2, &m3, &b1, &b2, &b3))
 		return NULL;
 
-	return newintobject(fl_show_choice(m1, m2, m3, nb, b1, b2, b3));
+	BGN_SAVE
+	rv = fl_show_choice(m1, m2, m3, nb, b1, b2, b3);
+	END_SAVE
+	return newintobject(rv);
 }
 
 static object *
@@ -2327,7 +2347,9 @@
 
         if (!getargs(args, "(sss)", &a, &b, &c)) return NULL;
 
+	BGN_SAVE
 	ret = fl_show_question(a, b, c);
+	END_SAVE
    
         return newintobject((long) ret);
 }
@@ -2342,7 +2364,9 @@
 
         if (!getstrstrarg(args, &a, &b)) return NULL;
 
+	BGN_SAVE
 	str = fl_show_input(a, b);
+	END_SAVE
 
 	if (str == NULL) {
 		INCREF(None);
@@ -2361,7 +2385,9 @@
 
         if (!getargs(args, "(ssss)", &a, &b, &c, &d)) return NULL;
 
+	BGN_SAVE
 	str = fl_show_file_selector(a, b, c, d);
+	END_SAVE
    
 	if (str == NULL) {
 		INCREF(None);