also use refcounting for eTimers
[enigma2.git] / lib / base / ebase.h
index 10b46120a3e7737033f2756d468e36c8eb597e8f..c86c177ddd08e79e592143bbe7956620b041c556 100644 (file)
@@ -142,8 +142,9 @@ class eMainloop;
  * This class emits the signal \c eSocketNotifier::activate whenever the
  * event specified by \c req is available.
  */
-class eSocketNotifier
+class eSocketNotifier: iObject
 {
+       DECLARE_REF(eSocketNotifier);
        friend class eMainloop;
 public:
        enum { Read=POLLIN, Write=POLLOUT, Priority=POLLPRI, Error=POLLERR, Hungup=POLLHUP };
@@ -153,6 +154,8 @@ private:
        int state;
        int requested;          // requested events (POLLIN, ...)
        void activate(int what) { /*emit*/ activated(what); }
+       eSocketNotifier(eMainloop *context, int fd, int req, bool startnow);
+       void operator delete(void *pmem) { ::operator delete(pmem); }
 public:
        /**
         * \brief Constructs a eSocketNotifier.
@@ -161,7 +164,7 @@ public:
         * \param req The events to watch to, normally either \c Read or \c Write. You can specify any events that \c poll supports.
         * \param startnow Specifies if the socketnotifier should start immediately.
         */
-       eSocketNotifier(eMainloop *context, int fd, int req, bool startnow=true);
+       static eSocketNotifier* create(eMainloop *context, int fd, int req, bool startnow=true) { return new eSocketNotifier(context, fd, req, startnow); }
        ~eSocketNotifier();
 
        PSignal1<void, int> activated;
@@ -173,6 +176,8 @@ public:
        int getFD() { return fd; }
        int getRequested() { return requested; }
        void setRequested(int req) { requested=req; }
+
+       eSmartPtrList<iObject> m_clients;
 };
 
 #endif
@@ -264,8 +269,9 @@ public:
  *
  * This class emits the signal \c eTimer::timeout after the specified timeout.
  */
-class eTimer
+class eTimer: iObject
 {
+       DECLARE_REF(eTimer);
        friend class eMainloop;
        eMainloop &context;
        timespec nextActivation;
@@ -273,6 +279,9 @@ class eTimer
        bool bSingleShot;
        bool bActive;
        void activate();
+
+       eTimer(eMainloop *context): context(*context), bActive(false) { }
+       void operator delete(void *pmem) { ::operator delete(pmem); }
 public:
        /**
         * \brief Constructs a timer.
@@ -280,7 +289,7 @@ public:
         * The timer is not yet active, it has to be started with \c start.
         * \param context The thread from which the signal should be emitted.
         */
-       eTimer(eMainloop *context=eApp): context(*context), bActive(false) { }
+       static eTimer *create(eMainloop *context=eApp) { return new eTimer(context); }
        ~eTimer() { if (bActive) stop(); }
 
        PSignal0<void> timeout;
@@ -294,6 +303,7 @@ public:
        void changeInterval(long msek);
        void startLongTimer( int seconds );
        bool operator<(const eTimer& t) const { return nextActivation < t.nextActivation; }
+       eSmartPtrList<iObject> m_clients;
 };
 #endif  // SWIG