// I am not sure why this code sometimes deadlocks, but sometimes it 
doesn't.
// Hopefully someone will have some suggestions 

package main

// ??? sometimes deadlocks

import (
    "fmt"
    "sync"
    "time"
)

type Button struct {
    Clicked *sync.Cond
}

func main() {
    button := Button{
        Clicked: sync.NewCond(&sync.Mutex{}),
    }

    // running on goroutine every function that passed/registered
    // and wait, not exit until that goroutine is confirmed to be running
    subscribe := func(c *sync.Cond, param string, fn func(s string)) {
        var goroutineRunning sync.WaitGroup
        var cnt = 0
        cnt = cnt + 1

        fmt.Println("cnt:", cnt)
        goroutineRunning.Add(1)

        go func(p string) {
          goroutineRunning.Done()
          c.L.Lock() // critical section
          defer c.L.Unlock()

          fmt.Println("Registered and wait ... ")
          // HANG SPOT: can hang here 
          c.Wait()
          fmt.Println("afer goroutine wait for:", param)

          fn(p)
        }(param)
        fmt.Println("call wait before goroutine exit")
        goroutineRunning.Wait()
        fmt.Println("after wait, subscribe exits")
    }

    var clickRegistered sync.WaitGroup

    for _, v := range []string{
        "Maximizing window.",
        "Displaying annoying dialog box!",
        "Mouse clicked."} {

        clickRegistered.Add(1)

        subscribe(button.Clicked, v, func(s string) {
            fmt.Println(s, "****************************")
            clickRegistered.Done()
        })
    }

    fmt.Println("broadcast")
    // is supposed to get the goroutines past HANG SPOT
    button.Clicked.Broadcast()
    time.Sleep(4000 * time.Millisecond)

    clickRegistered.Wait()
}

-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/d8148ef1-4d56-4b0b-a2d8-2992abe7a6c2n%40googlegroups.com.

Reply via email to