Changeset 11891 in project


Ignore:
Timestamp:
09/04/08 07:30:38 (11 years ago)
Author:
ecloud
Message:

thread-wait-for-i/o! works even better.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • release/3/gps/trunk/gps.scm

    r11890 r11891  
    6969                                                ((foreign-lambda* void (((pointer (struct "gps_data_t")) s))
    7070                                                        "gps_set_raw_hook(s, C_raw_cb);") conn-data)
     71                                                ;; Forcing the I/O to be non-blocking doesn't help.  We need select().
    7172                                                ; ((foreign-lambda* void (((pointer (struct "gps_data_t")) s))
    7273                                                        ; "int ret = fcntl(s->gps_fd, F_SETFD, O_NONBLOCK);
     
    8182                                        ))))
    8283
    83         (define gps:has-data?
    84                 (foreign-lambda* bool (((pointer (struct "gps_data_t")) s))
    85                         "fd_set rfds;
    86                         struct timeval tv;
    87                         int retval;
    88                         FD_ZERO(&rfds);
    89                         FD_SET(s->gps_fd, &rfds);
    90                         tv.tv_sec = 0;
    91                         tv.tv_usec = 100;
    92                         retval = select(s->gps_fd + 1, &rfds, NULL, NULL, &tv);
    93                         if (retval == -1)
    94                         {
    95                                 perror(\"select(gps_fd)\");
    96                                 C_return(0);
    97                         }
    98                         C_return(retval);"))
     84        ; (define gps:has-data?
     85                ; (foreign-lambda* bool (((pointer (struct "gps_data_t")) s))
     86                        ; "fd_set rfds;
     87                        ; struct timeval tv;
     88                        ; int retval;
     89                        ; FD_ZERO(&rfds);
     90                        ; FD_SET(s->gps_fd, &rfds);
     91                        ; tv.tv_sec = 0;
     92                        ; tv.tv_usec = 100;
     93                        ; retval = select(s->gps_fd + 1, &rfds, NULL, NULL, &tv);
     94                        ; if (retval == -1)
     95                        ; {
     96                                ; perror(\"select(gps_fd)\");
     97                                ; C_return(0);
     98                        ; }
     99                        ; C_return(retval);"))
    99100
    100101        ;; cb of the form (lambda (gps-data message) ... )
    101102        (set! gps:poll (lambda (cb)
    102103                (open-if-necessary)
    103                 (when (and conn-data (gps:has-data? conn-data))
     104                ; (when (and conn-data (gps:has-data? conn-data))
     105                (when conn-data
    104106                        (set! registered-cb cb)
    105107                        (let loop ([done #f])
     
    112114        (set! gps:subscribe (lambda (cb)
    113115                (use srfi-18)
     116                (open-if-necessary)
    114117                (thread-start! (lambda ()
    115118                        (let loop ()
     119                                (thread-wait-for-i/o! (gps:data-gps-fd conn-data) #:input)
    116120                                (gps:poll cb)
    117121                                (loop))))))
Note: See TracChangeset for help on using the changeset viewer.