[arch-commits] Commit in deepin-daemon/trunk (PKGBUILD cgo-pointer.patch)

Felix Yan felixonmars at archlinux.org
Thu Sep 8 03:43:54 UTC 2016


    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 <jouyouwen717 at gmail.com>
+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) {



More information about the arch-commits mailing list