[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Debian/sparc64 now as popular as arm64!



John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de> writes:

> On 01/25/2016 11:59 AM, John Paul Adrian Glaubitz wrote:
>> Great. Pick anything from the list of packages that failed to build
>> from source. Interesting candidates are gegl [1] and pdl [2], for
>> example. For gegl, I already filed a bug report [3].
>
> Oh, and opencv would be very important to fix:
>
>>
> https://buildd.debian.org/status/fetch.php?pkg=opencv&arch=sparc64&ver=2.4.9.1%2Bdfsg-1.2&stamp=1452934608
>
> Adrian

Hey Adrian

opencv has the same _Atomic_word issue we've seen before. In a few
places it assumes _Atomic_word is int whereas on sparc64 it's
long. There's actually already a patch in the opencv package that fixes
this issue in several places called
"change_type_from_int_to_Atomic_word". It was submitted by Aurelien
Jarno in bug #714923:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=714923

I've added two more line changes to that diff and it fixed the build for
me. Should I update that old bug above or make a new one? Here's my
updated "change_type_from_int_to_Atomic_word" patch:

Description: Fix FTBFS on sparc64
Author: Aurelien Jarno <aurel32@debian.org>, David Mattli <dmm@mattli.us>
Forwarded: not yet
Debian-Bug: 714923
Last-Update: <2016-01-26>

Index: opencv-2.4.9.1+dfsg/modules/core/include/opencv2/core/core.hpp
===================================================================
--- opencv-2.4.9.1+dfsg.orig/modules/core/include/opencv2/core/core.hpp
+++ opencv-2.4.9.1+dfsg/modules/core/include/opencv2/core/core.hpp
@@ -1300,7 +1300,7 @@ public:
     operator const _Tp*() const;
 
     _Tp* obj; //< the object pointer.
-    int* refcount; //< the associated reference counter
+    _Atomic_word* refcount; //< the associated reference counter
 };
 
 
@@ -1468,9 +1468,9 @@ class CV_EXPORTS MatAllocator
 public:
     MatAllocator() {}
     virtual ~MatAllocator() {}
-    virtual void allocate(int dims, const int* sizes, int type, int*& refcount,
+    virtual void allocate(int dims, const int* sizes, int type, _Atomic_word*& refcount,
                           uchar*& datastart, uchar*& data, size_t* step) = 0;
-    virtual void deallocate(int* refcount, uchar* datastart, uchar* data) = 0;
+    virtual void deallocate(_Atomic_word* refcount, uchar* datastart, uchar* data) = 0;
 };
 
 /*!
@@ -1965,7 +1965,7 @@ public:
 
     //! pointer to the reference counter;
     // when matrix points to user-allocated data, the pointer is NULL
-    int* refcount;
+    _Atomic_word* refcount;
 
     //! helper fields used in locateROI and adjustROI
     uchar* datastart;
@@ -3384,7 +3384,7 @@ public:
     {
         Hdr(int _dims, const int* _sizes, int _type);
         void clear();
-        int refcount;
+        _Atomic_word refcount;
         int dims;
         int valueOffset;
         size_t nodeSize;
Index: opencv-2.4.9.1+dfsg/modules/core/include/opencv2/core/gpumat.hpp
===================================================================
--- opencv-2.4.9.1+dfsg.orig/modules/core/include/opencv2/core/gpumat.hpp
+++ opencv-2.4.9.1+dfsg/modules/core/include/opencv2/core/gpumat.hpp
@@ -301,7 +301,7 @@ namespace cv { namespace gpu
 
         //! pointer to the reference counter;
         // when GpuMatrix points to user-allocated data, the pointer is NULL
-        int* refcount;
+        _Atomic_word* refcount;
 
         //! helper fields used in locateROI and adjustROI
         uchar* datastart;
Index: opencv-2.4.9.1+dfsg/modules/core/include/opencv2/core/operations.hpp
===================================================================
--- opencv-2.4.9.1+dfsg.orig/modules/core/include/opencv2/core/operations.hpp
+++ opencv-2.4.9.1+dfsg/modules/core/include/opencv2/core/operations.hpp
@@ -2281,7 +2281,7 @@ public:
         Hdr() : data(0), datastart(0), refcount(0), size(0), capacity(0) {};
         _Tp* data;
         _Tp* datastart;
-        int* refcount;
+        _Atomic_word* refcount;
         size_t size;
         size_t capacity;
     };
@@ -2588,7 +2588,7 @@ template<typename _Tp> inline Ptr<_Tp>::
 {
     if(obj)
     {
-        refcount = (int*)fastMalloc(sizeof(*refcount));
+        refcount = (_Atomic_word*)fastMalloc(sizeof(*refcount));
         *refcount = 1;
     }
     else
@@ -2625,7 +2625,7 @@ template<typename _Tp> inline Ptr<_Tp>::
 
 template<typename _Tp> inline Ptr<_Tp>& Ptr<_Tp>::operator = (const Ptr<_Tp>& _ptr)
 {
-    int* _refcount = _ptr.refcount;
+    _Atomic_word* _refcount = _ptr.refcount;
     if( _refcount )
         CV_XADD(_refcount, 1);
     release();
Index: opencv-2.4.9.1+dfsg/modules/core/src/gpumat.cpp
===================================================================
--- opencv-2.4.9.1+dfsg.orig/modules/core/src/gpumat.cpp
+++ opencv-2.4.9.1+dfsg/modules/core/src/gpumat.cpp
@@ -716,7 +716,7 @@ void cv::gpu::GpuMat::create(int _rows,
         datastart = data = static_cast<uchar*>(devPtr);
         dataend = data + nettosize;
 
-        refcount = static_cast<int*>(fastMalloc(sizeof(*refcount)));
+        refcount = static_cast<_Atomic_word*>(fastMalloc(sizeof(*refcount)));
         *refcount = 1;
     }
 }
Index: opencv-2.4.9.1+dfsg/modules/core/src/matrix.cpp
===================================================================
--- opencv-2.4.9.1+dfsg.orig/modules/core/src/matrix.cpp
+++ opencv-2.4.9.1+dfsg/modules/core/src/matrix.cpp
@@ -213,7 +213,7 @@ void Mat::create(int d, const int* _size
         {
             size_t totalsize = alignSize(step.p[0]*size.p[0], (int)sizeof(*refcount));
             data = datastart = (uchar*)fastMalloc(totalsize + (int)sizeof(*refcount));
-            refcount = (int*)(data + totalsize);
+            refcount = (_Atomic_word*)(data + totalsize);
             *refcount = 1;
         }
         else
Index: opencv-2.4.9.1+dfsg/modules/core/src/system.cpp
===================================================================
--- opencv-2.4.9.1+dfsg.orig/modules/core/src/system.cpp
+++ opencv-2.4.9.1+dfsg/modules/core/src/system.cpp
@@ -903,7 +903,7 @@ struct Mutex::Impl
     void unlock() { pthread_spin_unlock(&sl); }
 
     pthread_spinlock_t sl;
-    int refcount;
+    _Atomic_word refcount;
 };
 
 #else
Index: opencv-2.4.9.1+dfsg/modules/gpu/include/opencv2/gpu/gpu.hpp
===================================================================
--- opencv-2.4.9.1+dfsg.orig/modules/gpu/include/opencv2/gpu/gpu.hpp
+++ opencv-2.4.9.1+dfsg/modules/gpu/include/opencv2/gpu/gpu.hpp
@@ -125,7 +125,7 @@ public:
     size_t step;
 
     uchar* data;
-    int* refcount;
+    _Atomic_word* refcount;
 
     uchar* datastart;
     uchar* dataend;
Index: opencv-2.4.9.1+dfsg/modules/python/src2/cv2.cpp
===================================================================
--- opencv-2.4.9.1+dfsg.orig/modules/python/src2/cv2.cpp
+++ opencv-2.4.9.1+dfsg/modules/python/src2/cv2.cpp
@@ -157,14 +157,14 @@ static PyObject* failmsgp(const char *fm
 static size_t REFCOUNT_OFFSET = (size_t)&(((PyObject*)0)->ob_refcnt) +
     (0x12345678 != *(const size_t*)"\x78\x56\x34\x12\0\0\0\0\0")*sizeof(int);
 
-static inline PyObject* pyObjectFromRefcount(const int* refcount)
+static inline PyObject* pyObjectFromRefcount(const _Atomic_word* refcount)
 {
     return (PyObject*)((size_t)refcount - REFCOUNT_OFFSET);
 }
 
-static inline int* refcountFromPyObject(const PyObject* obj)
+static inline _Atomic_word* refcountFromPyObject(const PyObject* obj)
 {
-    return (int*)((size_t)obj + REFCOUNT_OFFSET);
+    return (_Atomic_word*)((size_t)obj + REFCOUNT_OFFSET);
 }
 
 class NumpyAllocator : public MatAllocator
@@ -173,7 +173,7 @@ public:
     NumpyAllocator() {}
     ~NumpyAllocator() {}
 
-    void allocate(int dims, const int* sizes, int type, int*& refcount,
+    void allocate(int dims, const int* sizes, int type, _Atomic_word*& refcount,
                   uchar*& datastart, uchar*& data, size_t* step)
     {
         PyEnsureGIL gil;
@@ -206,7 +206,7 @@ public:
         datastart = data = (uchar*)PyArray_DATA((PyArrayObject*) o);
     }
 
-    void deallocate(int* refcount, uchar*, uchar*)
+    void deallocate(_Atomic_word* refcount, uchar*, uchar*)
     {
         PyEnsureGIL gil;
         if( !refcount )
Index: opencv-2.4.9.1+dfsg/modules/ocl/include/opencv2/ocl/ocl.hpp
===================================================================
--- opencv-2.4.9.1+dfsg.orig/modules/ocl/include/opencv2/ocl/ocl.hpp
+++ opencv-2.4.9.1+dfsg/modules/ocl/include/opencv2/ocl/ocl.hpp
@@ -404,7 +404,7 @@ namespace cv
 
             //! pointer to the reference counter;
             // when oclMatrix points to user-allocated data, the pointer is NULL
-            int *refcount;
+            _Atomic_word *refcount;
 
             //! helper fields used in locateROI and adjustROI
             //datastart and dataend are not used in current version
Index: opencv-2.4.9.1+dfsg/modules/ocl/src/matrix_operations.cpp
===================================================================
--- opencv-2.4.9.1+dfsg.orig/modules/ocl/src/matrix_operations.cpp
+++ opencv-2.4.9.1+dfsg/modules/ocl/src/matrix_operations.cpp
@@ -591,7 +591,7 @@ void cv::ocl::oclMat::createEx(int _rows
         datastart = data = (uchar *)dev_ptr;
         dataend = data + nettosize;
 
-        refcount = (int *)fastMalloc(sizeof(*refcount));
+        refcount = (_Atomic_word *)fastMalloc(sizeof(*refcount));
         *refcount = 1;
     }
 }


Reply to: