2018. szeptember 29., szombat 17:10:25 UTC+2 időpontban changkun a 
következőt írta:
>
>
>
> On Saturday, September 29, 2018 at 4:03:42 PM UTC+2, Tamás Gulácsi wrote:
>>
>> Create One (1) goroutine with LockOSThread and let it get the todo and 
>> response channel from a channel and send the response back when ready, and 
>> make all other goroutines communicate with this one and only one 
>> pango-dedicated goroutine. Which is locked to a thread.
>>
>
> Can't do that at the moment, reason in above. 
>

I tought something like: 

type todo struct {
  FuncToCall string
  Args []interface{}
  Response ch chan<- response
}
type response struct {
  ResultCode int
  Err error
}

var todoCh = make(chan todo)

go func(ch <- todo) {
    runtime.LockOSThread()
    defer runtime.UnlockOSThread()
    for t := range ch {
      switch t.FuncToCall {
      ...
      }
      t.Response <- response{Err:nil, ResultCode:0}
    }
}()

func handleConnection(timeout) error {
    ch := make(chan response, 1)
    ctx, cancel := context.WithTimeout(context.Background(), timeout)
    defer cancel()
    select {
    case <-ctx.Done():
      // timeout
      return ctx.Err()
    case todoCh <- todo{FuncToCall:..., Response:ch}:
      select {
        case <-ctx.Done():
          return ctx.Err()
        case resp := <-ch:
          // success!
          return nil
      }
    }
}
 

I don't feel that abstracting out the C (Pango) calls into an interface 
with maybe several implementations (C or Go) would be such a great 
undertaking,
but would ease up writing correct code.

And anyway you have to call that Pango thing from one thread.

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to