Revision
14563
Author
mrene
Date
2009-08-18 22:37:19 -0500 (Tue, 18 Aug 2009)

Log Message

contrib: some c++ wrappers

Added Paths

Diff

Added: freeswitch/trunk/contrib/mrene/cpp/object_support.h (0 => 14563)


--- freeswitch/trunk/contrib/mrene/cpp/object_support.h	                        (rev 0)
+++ freeswitch/trunk/contrib/mrene/cpp/object_support.h	2009-08-19 03:37:19 UTC (rev 14563)
@@ -0,0 +1,185 @@
+#ifndef OBJECT_SUPPORT_H
+#define OBJECT_SUPPORT_H
+
+#include <switch.h>
+
+class Mutex 
+{
+private:
+	bool m_owned;
+	switch_mutex_t *m_mutex;
+	
+	Mutex(const Mutex &p)
+	{
+	}
+	
+public:
+	Mutex(switch_mutex_t *m) 
+	{
+		m_owned = false;
+		m_mutex = m;
+	}
+	
+	Mutex(switch_memory_pool_t *pool)
+	{
+		m_owned = true;
+		switch_mutex_init(&m_mutex, SWITCH_MUTEX_NESTED, pool);
+	}
+	
+	~Mutex()
+	{
+		if (m_owned) {
+			switch_mutex_destroy(m_mutex);
+		}
+	}
+	
+	void lock()
+	{
+		switch_mutex_lock(m_mutex);
+	}
+	
+	void unlock()
+	{
+		switch_mutex_unlock(m_mutex);	}
+	
+	class scoped_lock 
+	{
+		
+	private:
+		Mutex &m_mutex;
+		scoped_lock(const scoped_lock &p) : m_mutex(p.m_mutex) { };
+		
+	public:
+		scoped_lock(Mutex &m) : m_mutex(m)
+		{
+			m_mutex.lock();
+		}
+		
+		~scoped_lock()
+		{
+			m_mutex.unlock();
+		}
+	};
+};
+
+class RWLock
+{
+private:
+	bool m_owned;
+	switch_thread_rwlock_t *m_rwlock;
+	
+	RWLock(const RWLock& p)
+	{
+		
+	}
+public:
+	RWLock(switch_thread_rwlock_t *rw)
+	{
+		m_owned = false;
+		m_rwlock = rw;
+	}
+	RWLock(switch_memory_pool_t *pool)
+	{
+		m_owned = true;
+		switch_thread_rwlock_create(&m_rwlock, pool);
+	}
+	
+	void rdlock() 
+	{
+		switch_thread_rwlock_rdlock(m_rwlock);
+	}
+	
+	switch_status_t tryrdlock()
+	{
+		return switch_thread_rwlock_tryrdlock(m_rwlock);
+	}
+	
+	void wrlock()
+	{
+		switch_thread_rwlock_wrlock(m_rwlock);
+	}
+	
+	switch_status_t trywrlock()
+	{
+		return switch_thread_rwlock_trywrlock(m_rwlock);
+	}
+	
+	switch_status_t trywrlock_timeout(int timeout)
+	{
+		return switch_thread_rwlock_trywrlock_timeout(m_rwlock, timeout);
+	}
+	
+	void unlock()
+	{
+		switch_thread_rwlock_unlock(m_rwlock);
+	}
+	
+	class scoped_lock 
+	{
+	private:
+		RWLock &m_rwlock;
+		scoped_lock(const scoped_lock &p) : m_rwlock(p.m_rwlock) { }
+	public:
+		scoped_lock(RWLock &rwlock, switch_bool_t write = SWITCH_FALSE) : m_rwlock(rwlock)
+		{
+			if (write) {
+				m_rwlock.rdlock();
+			} else {
+				m_rwlock.wrlock();
+			}
+		}
+		~scoped_lock()
+		{
+			m_rwlock.unlock();
+		}
+	};
+};
+
+class MemoryPool
+{
+private:
+	bool m_owned;
+	switch_memory_pool_t *m_pool;
+	MemoryPool(const MemoryPool &p) { }
+public:
+	MemoryPool(switch_memory_pool_t *pool)
+	{
+		if (pool) {
+			m_owned = false;
+			m_pool = pool;	
+		} else {
+			m_owned = true;
+			switch_core_new_memory_pool(&m_pool);
+		}
+	}
+	
+	MemoryPool()
+	{
+		switch_core_new_memory_pool(&m_pool);
+		m_owned = true;
+	}
+	
+	~MemoryPool()
+	{
+		if (m_owned) {
+			switch_core_destroy_memory_pool(&m_pool);
+		}
+	}
+	
+	void *alloc(switch_size_t n) 
+	{
+		return switch_core_alloc(m_pool, n);
+	}
+	
+	switch_memory_pool_t *get_pool() 
+	{
+		return m_pool;
+	}
+	
+	char *strdup(const char *s)
+	{
+		return switch_core_strdup(m_pool, s);
+	}
+};
+
+#endif /* OBJECT_SUPPORT_H */
\ No newline at end of file