diff packages/kernel/current/include/thread.inl @ 182:f62680ef1804

Merge from eCos master repository on 2001-09-07-06:43:02-BST
author jlarmour
date Wed, 12 Sep 2001 00:59:17 +0000
parents 4c750ce71ae3
children 9160a8005d76
line wrap: on
line diff
--- a/packages/kernel/current/include/thread.inl
+++ b/packages/kernel/current/include/thread.inl
@@ -453,7 +453,7 @@ inline void Cyg_Thread::clear_timer()
 
 #ifdef CYGVAR_KERNEL_THREADS_DATA
 
-inline CYG_ADDRWORD Cyg_Thread::get_data( cyg_ucount32 index )
+inline CYG_ADDRWORD Cyg_Thread::get_data( Cyg_Thread::cyg_data_index index )
 {
     CYG_ASSERT( index < CYGNUM_KERNEL_THREADS_DATA_MAX,
                 "Per thread data index out of bounds");
@@ -463,7 +463,7 @@ inline CYG_ADDRWORD Cyg_Thread::get_data
     return self()->thread_data[index];
 }
 
-inline CYG_ADDRWORD *Cyg_Thread::get_data_ptr( cyg_ucount32 index )
+inline CYG_ADDRWORD *Cyg_Thread::get_data_ptr( Cyg_Thread::cyg_data_index index )
 {
     CYG_ASSERT( index < CYGNUM_KERNEL_THREADS_DATA_MAX,
                 "Per thread data index out of bounds");
@@ -473,7 +473,8 @@ inline CYG_ADDRWORD *Cyg_Thread::get_dat
     return &(self()->thread_data[index]);
 }
 
-inline void Cyg_Thread::set_data( cyg_ucount32 index, CYG_ADDRWORD data )
+inline void Cyg_Thread::set_data( Cyg_Thread::cyg_data_index index,
+                                  CYG_ADDRWORD data )
 {
     CYG_ASSERT( index < CYGNUM_KERNEL_THREADS_DATA_MAX,
                 "Per thread data index out of bounds");
@@ -487,6 +488,46 @@ inline void Cyg_Thread::set_data( cyg_uc
 
 // -------------------------------------------------------------------------
 
+#ifdef CYGPKG_KERNEL_THREADS_DESTRUCTORS
+
+    // Add and remove destructors. Returns true on success, false on failure.
+inline cyg_bool
+Cyg_Thread::add_destructor( destructor_fn fn, CYG_ADDRWORD data )
+{
+    cyg_ucount16 i;
+    Cyg_Scheduler::lock();
+    for (i=0; i<CYGNUM_KERNEL_THREADS_DESTRUCTORS; i++) {
+        if (NULL == destructors[i].fn) {
+            destructors[i].data = data;
+            destructors[i].fn = fn;
+            Cyg_Scheduler::unlock();
+            return true;
+        }
+    }
+    Cyg_Scheduler::unlock();
+    return false;
+}
+
+inline cyg_bool
+Cyg_Thread::rem_destructor( destructor_fn fn, CYG_ADDRWORD data )
+{
+    cyg_ucount16 i;
+    Cyg_Scheduler::lock();
+    for (i=0; i<CYGNUM_KERNEL_THREADS_DESTRUCTORS; i++) {
+        if (destructors[i].fn == fn && destructors[i].data == data) {
+            destructors[i].fn = NULL;
+            Cyg_Scheduler::unlock();
+            return true;
+        }
+    }
+    Cyg_Scheduler::unlock();
+    return false;
+}
+
+#endif
+
+// -------------------------------------------------------------------------
+
 #ifdef CYGVAR_KERNEL_THREADS_NAME
 
 inline char *Cyg_Thread::get_name()