Date: Thursday, September 8, 2016 @ 03:43:54
  Author: felixonmars
Revision: 188985

upgpkg: deepin-daemon 3.0.21-1

Added:
  deepin-daemon/trunk/cgo-pointer.patch
Modified:
  deepin-daemon/trunk/PKGBUILD

-------------------+
 PKGBUILD          |   17 ++-
 cgo-pointer.patch |  285 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 296 insertions(+), 6 deletions(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD    2016-09-08 03:38:54 UTC (rev 188984)
+++ PKGBUILD    2016-09-08 03:43:54 UTC (rev 188985)
@@ -4,12 +4,12 @@
 # Contributor: Xu Fasheng <fasheng.xu[AT]gmail.com>
 
 pkgname=deepin-daemon
-pkgver=3.0.20
-_golibver=0.5
-_deepinapiver=3.0.13
+pkgver=3.0.21
+_golibver=0.5.1
+_deepinapiver=3.0.14
 _dbusfactoryver=3.0.6
 _girgeneratorver=0.9.5
-pkgrel=2
+pkgrel=1
 pkgdesc='Daemon handling the DDE session settings'
 arch=('i686' 'x86_64')
 url="https://github.com/linuxdeepin/dde-daemon";
@@ -32,7 +32,8 @@
         "git+https://cr.deepin.io/dbus-factory.git#tag=$_dbusfactoryver";
         "git+https://cr.deepin.io/go-gir-generator.git#tag=$_girgeneratorver";
         'deepin-daemon.sysusers'
-        'polkit-gnome-authentication-agent-1-deepin.desktop')
+        'polkit-gnome-authentication-agent-1-deepin.desktop'
+        'cgo-pointer.patch')
 sha256sums=('SKIP'
             'SKIP'
             'SKIP'
@@ -39,12 +40,16 @@
             'SKIP'
             'SKIP'
             '4482f2c82c3652040021dd43515f131184a0417e341dc37db487117012245e25'
-            '014f4c1111530e7556c3a83ab4409ae7dd47a87550004128ed8b7d02c58357e7')
+            '014f4c1111530e7556c3a83ab4409ae7dd47a87550004128ed8b7d02c58357e7'
+            'da3dc6f5c0d2637072a45aedcd7b3e1af423918533b6d68ae23ca213d8419f48')
 
 prepare() {
   sed -i "s|\"\${GOLDFLAGS}\"|\"\${GOLDFLAGS} $CFLAGS $LDFLAGS\"|" 
dde-daemon/Makefile
   sed -i 's| generator$||' go-gir-generator/makefile
 
+  # https://github.com/linuxdeepin/dde-daemon/issues/26
+  (cd dde-daemon; patch -p1 -i ../cgo-pointer.patch)
+
   export GOPATH="$srcdir/build"
   mkdir -p build/src/pkg.deepin.io/{lib,dde/api}
   cp -a go-lib/* build/src/pkg.deepin.io/lib

Added: cgo-pointer.patch
===================================================================
--- cgo-pointer.patch                           (rev 0)
+++ cgo-pointer.patch   2016-09-08 03:43:54 UTC (rev 188985)
@@ -0,0 +1,285 @@
+From b4a0d558772c81818ae9a02f80d05515c2ae9e7f Mon Sep 17 00:00:00 2001
+From: jouyouyun <[email protected]>
+Date: Wed, 24 Aug 2016 16:52:33 +0800
+Subject: [PATCH] mounts: Fix cgo pointer crash
+
+Because of 'AsyncReadyCallback' will cause process crash, so replace it with 
'gvfs-mount'.
+
+Change-Id: I10e7b3de40e772c07b7b5ab46fe11da00c209da4
+---
+ mounts/ifc.go     | 158 ++++++++++++++++++++++++++++--------------------------
+ mounts/monitor.go |  11 +---
+ 2 files changed, 82 insertions(+), 87 deletions(-)
+
+diff --git a/mounts/ifc.go b/mounts/ifc.go
+index 1225dbb..e893a31 100644
+--- a/mounts/ifc.go
++++ b/mounts/ifc.go
+@@ -11,8 +11,7 @@ package mounts
+ 
+ import (
+       "fmt"
+-      "gir/gio-2.0"
+-      "gir/gobject-2.0"
++      "os/exec"
+       . "pkg.deepin.io/lib/gettext"
+ )
+ 
+@@ -34,16 +33,20 @@ func (m *Manager) Eject(id string) error {
+ 
+       mount := m.getMountById(id)
+       if mount != nil {
+-              m.ejectMount(id, mount)
+-              mount.Unref()
+-              return nil
++              info := newDiskInfoFromMount(mount)
++              if info != nil && len(info.MountPoint) != 0 {
++                      m.ejectMount(info)
++                      return nil
++              }
+       }
+ 
+       volume := m.getVolumeById(id)
+       if volume != nil {
+-              m.ejectVolume(id, volume)
+-              volume.Unref()
+-              return nil
++              info := newDiskInfoFromVolume(volume)
++              if info != nil {
++                      m.ejectVolume(info)
++                      return nil
++              }
+       }
+ 
+       err := fmt.Errorf("Invalid disk id: %v", id)
+@@ -54,12 +57,13 @@ func (m *Manager) Eject(id string) error {
+ func (m *Manager) Mount(id string) error {
+       m.refreshLocker.Lock()
+       defer m.refreshLocker.Unlock()
+-
+       volume := m.getVolumeById(id)
+       if volume != nil {
+-              m.mountVolume(id, volume)
+-              volume.Unref()
+-              return nil
++              info := newDiskInfoFromVolume(volume)
++              if info != nil {
++                      m.mountVolume(info)
++                      return nil
++              }
+       }
+ 
+       err := fmt.Errorf("Not found GVolume by '%s'", id)
+@@ -73,9 +77,11 @@ func (m *Manager) Unmount(id string) error {
+ 
+       mount := m.getMountById(id)
+       if mount != nil {
+-              m.unmountMount(id, mount)
+-              mount.Unref()
+-              return nil
++              info := newDiskInfoFromMount(mount)
++              if info != nil {
++                      m.unmountMount(info)
++                      return nil
++              }
+       }
+ 
+       err := fmt.Errorf("Not found GMount by '%s'", id)
+@@ -83,72 +89,70 @@ func (m *Manager) Unmount(id string) error {
+       return err
+ }
+ 
+-func (m *Manager) ejectVolume(id string, volume *gio.Volume) {
+-      logger.Debugf("ejectVolume id: %q volume: %v", id, volume)
+-      op := gio.NewMountOperation()
+-      volume.EjectWithOperation(gio.MountUnmountFlagsNone, op, nil, 
gio.AsyncReadyCallback(
+-              func(o *gobject.Object, ret *gio.AsyncResult) {
+-                      logger.Debug("volume.EjectWithOperation 
AsyncReadyCallback")
+-                      volume := gio.ToVolume(o)
+-                      _, err := volume.EjectFinish(ret)
+-                      if err != nil {
+-                              m.emitError(id, err.Error())
+-                      }
+-              }))
+-      op.Unref()
++func (m *Manager) ejectVolume(info *DiskInfo) {
++      logger.Debugf("ejectVolume info: %#v", info)
++      go func() {
++              err := doDiskOperation("eject", info.Path)
++              if err != nil {
++                      logger.Warning("[ejectVolume] failed:", info.Path, err)
++                      m.emitError(info.Id, err.Error())
++              }
++      }()
++}
++
++func (m *Manager) ejectMount(info *DiskInfo) {
++      logger.Debugf("ejectMount info: %#v", info)
++      go func() {
++              err := doDiskOperation("eject", info.MountPoint)
++              if err != nil {
++                      logger.Warning("[ejectMount] failed:", info.MountPoint, 
err)
++                      m.emitError(info.Id, err.Error())
++              }
++      }()
+ }
+ 
+-func (m *Manager) ejectMount(id string, mount *gio.Mount) {
+-      logger.Debugf("ejectMount id: %q, mount: %v", id, mount)
+-      op := gio.NewMountOperation()
+-      mount.EjectWithOperation(gio.MountUnmountFlagsNone, op, nil, 
gio.AsyncReadyCallback(
+-              func(o *gobject.Object, ret *gio.AsyncResult) {
+-                      logger.Debug("mount.EjectWithOperation 
AsyncReadyCallback")
+-                      mount := gio.ToMount(o)
+-                      _, err := mount.EjectWithOperationFinish(ret)
+-                      if err != nil {
+-                              m.emitError(id, err.Error())
+-                      }
+-              }))
+-      op.Unref()
++func (m *Manager) mountVolume(info *DiskInfo) {
++      logger.Debugf("mountVolume info: %#v", info)
++      go func() {
++              err := doDiskOperation("mount", info.Path)
++              if err != nil {
++                      logger.Warning("[mountVolume] failed:", info.Path, err)
++                      m.emitError(info.Id, err.Error())
++              }
++      }()
+ }
+ 
+-func (m *Manager) mountVolume(id string, volume *gio.Volume) {
+-      logger.Debugf("mountVolume id: %q, volume: %v", id, volume)
+-      op := gio.NewMountOperation()
+-      volume.Mount(gio.MountMountFlagsNone, op, nil, gio.AsyncReadyCallback(
+-              func(o *gobject.Object, ret *gio.AsyncResult) {
+-                      volume := gio.ToVolume(o)
+-                      logger.Debug("Mount AsyncReadyCallback")
+-
+-                      _, err := volume.MountFinish(ret)
+-                      if err != nil {
+-                              m.emitError(id, err.Error())
+-                      }
+-              }))
+-      op.Unref()
++func (m *Manager) unmountMount(info *DiskInfo) {
++      logger.Debugf("unmountMount info: %#v", info)
++      go func() {
++              err := doDiskOperation("unmount", info.MountPoint)
++              if err != nil {
++                      logger.Warning("[unmountMount] failed:", 
info.MountPoint, err)
++                      m.emitError(info.Id, err.Error())
++                      return
++              }
++              go m.sendNotify(info.Icon, "",
++                      fmt.Sprintf(Tr("%s removed successfully"), 
info.MountPoint))
++      }()
+ }
+ 
+-func (m *Manager) unmountMount(id string, mount *gio.Mount) {
+-      logger.Debugf("unmountMount id: %q, mount: %v", id, mount)
+-      op := gio.NewMountOperation()
+-      mount.UnmountWithOperation(gio.MountUnmountFlagsNone, op, nil, 
gio.AsyncReadyCallback(
+-              func(o *gobject.Object, ret *gio.AsyncResult) {
+-                      mount := gio.ToMount(o)
+-                      logger.Debug("UnmountWithOperation AsyncReadyCallback")
+-
+-                      _, err := mount.UnmountWithOperationFinish(ret)
+-                      if err != nil {
+-                              m.emitError(id, err.Error())
+-                              return
+-                      }
+-                      name := mount.GetName()
+-                      gicon := mount.GetIcon()
+-                      icon := getIconFromGIcon(gicon)
+-                      gicon.Unref()
+-
+-                      go m.sendNotify(icon, "",
+-                              fmt.Sprintf(Tr("%s removed successfully"), 
name))
+-              }))
+-      op.Unref()
++func doDiskOperation(ty, path string) error {
++      var args []string
++      switch ty {
++      case "eject":
++              args = append(args, "-e")
++      case "mount":
++              args = append(args, []string{"-m", "-d"}...)
++      case "unmount":
++              args = append(args, "-u")
++      }
++      args = append(args, path)
++      out, err := exec.Command("gvfs-mount", args...).CombinedOutput()
++      if err != nil {
++              if len(out) != 0 {
++                      return fmt.Errorf("%s", string(out))
++              }
++              return err
++      }
++      return nil
+ }
+diff --git a/mounts/monitor.go b/mounts/monitor.go
+index 2dafff7..19501e9 100644
+--- a/mounts/monitor.go
++++ b/mounts/monitor.go
+@@ -25,11 +25,9 @@ func (m *Manager) handleEvent() {
+               info := newDiskInfoFromVolume(volume)
+               logger.Debug("[Event] volume added:", info.Name, info.Type, 
info.Id)
+               if volume.ShouldAutomount() && m.isAutoMount() {
+-                      m.mountVolume(info.Id, volume)
+-                      volume.Unref()
++                      m.mountVolume(info)
+                       return
+               }
+-              volume.Unref()
+               m.refreshDiskList()
+               dbus.Emit(m, "Changed", EventTypeVolumeAdded, info.Id)
+       })
+@@ -37,7 +35,6 @@ func (m *Manager) handleEvent() {
+       m.monitor.Connect("volume-removed", func(monitor *gio.VolumeMonitor,
+               volume *gio.Volume) {
+               logger.Debug("[Event] volume removed:", getVolumeId(volume))
+-              volume.Unref()
+               soundutils.PlaySystemSound(soundutils.EventDeviceUnplug,
+                       "", false)
+               oldInfos := m.DiskList.duplicate()
+@@ -51,7 +48,6 @@ func (m *Manager) handleEvent() {
+               volume *gio.Volume) {
+               id := getVolumeId(volume)
+               logger.Debug("[Event] volume changed:", id)
+-              volume.Unref()
+               oldInfos := m.DiskList.duplicate()
+               m.refreshDiskList()
+               added, removed := compareDiskList(oldInfos, m.DiskList)
+@@ -67,19 +63,16 @@ func (m *Manager) handleEvent() {
+               mount *gio.Mount) {
+               info := newDiskInfoFromMount(mount)
+               if info == nil {
+-                      mount.Unref()
+                       return
+               }
+               logger.Debug("[Event] mount added:", info.Name, info.Id, 
info.CanEject)
+ 
+               volume := mount.GetVolume()
+-              mount.Unref()
+               var autoOpen bool = false
+               if volume != nil && volume.Object.C != nil {
+                       if volume.ShouldAutomount() && m.isAutoOpen() {
+                               autoOpen = true
+                       }
+-                      volume.Unref()
+               }
+ 
+               m.refreshDiskList()
+@@ -108,11 +101,9 @@ func (m *Manager) handleEvent() {
+                       // fixed phone device
+                       m.refreshDiskList()
+                       dbus.Emit(m, "Changed", EventTypeMountRemoved, 
getMountId(mount))
+-                      mount.Unref()
+                       logger.Warning(err)
+                       return
+               }
+-              mount.Unref()
+               oldLen := len(m.DiskList)
+               m.refreshDiskList()
+               if oldLen != len(m.DiskList) {

Reply via email to