Revision: 6142
Author: iratqq
Date: Sat Jan 23 23:08:24 2010
Log: * uim/fileio.c (c_file_poll_internal):
  - New function.
  (c_file_poll):
  - Call gc-guarded c_file_poll_internal().

http://code.google.com/p/uim/source/detail?r=6142

Modified:
 /trunk/uim/fileio.c

=======================================
--- /trunk/uim/fileio.c Sat Jan 23 22:50:32 2010
+++ /trunk/uim/fileio.c Sat Jan 23 23:08:24 2010
@@ -274,6 +274,24 @@
   return uim_lisp_poll_flags;
 }

+struct c_file_poll_args {
+  struct pollfd *fds;
+  int nfds;
+};
+
+static uim_lisp
+c_file_poll_internal(struct c_file_poll_args *args)
+{
+  int i;
+  uim_lisp ret_ = uim_scm_null();
+  struct pollfd *fds = args->fds;
+
+  for (i = 0; i < args->nfds; i++)
+    if (fds[i].revents != 0)
+ ret_ = CONS(CONS(MAKE_INT(fds[i].fd), MAKE_INT(fds[i].revents)), ret_);
+  return ret_;
+}
+
 static uim_lisp
 c_file_poll(uim_lisp fds_, uim_lisp timeout_)
 {
@@ -284,6 +302,7 @@
   int i;
   int ret;
   uim_lisp ret_;
+  struct c_file_poll_args args;

   fds = uim_calloc(nfds, sizeof(struct pollfd));

@@ -300,12 +319,10 @@
   else if (ret == 0)
     return uim_scm_null();

-  ret_ = uim_scm_null();
-
-  for (i = 0; i < nfds; i++)
-    if (fds[i].revents != 0)
- ret_ = CONS(CONS(MAKE_INT(fds[i].fd), MAKE_INT(fds[i].revents)), ret_);
-
+  args.fds = fds;
+  args.nfds = nfds;
+ ret_ = (uim_lisp)uim_scm_call_with_gc_ready_stack((uim_gc_gate_func_ptr)c_file_poll_internal,
+                                                   (void *)&args);
   free(fds);
   return uim_scm_callf("reverse", "o", ret_);
 }

Reply via email to