]> Kevux Git Server - fll/commitdiff
Update: Finish implementing the thread condition functions.
authorKevin Day <thekevinday@gmail.com>
Sun, 11 Apr 2021 04:57:05 +0000 (23:57 -0500)
committerKevin Day <thekevinday@gmail.com>
Sun, 11 Apr 2021 05:01:09 +0000 (00:01 -0500)
It looks like the f_thread_condition_wait() f_thread_condition_wait_timed() functions were not fully written.
Add missing handlers.
The f_thread_condition_wait_timed() was even missing the return case of F_time!

Update the comments as the "time" value is relative to the absolute system clock time.

Add F_dead, F_live, and related.

level_0/f_status/c/status.h
level_0/f_thread/c/thread.c
level_0/f_thread/c/thread.h
level_1/fl_status/c/status.c
level_1/fl_status/c/status.h
level_2/fll_status/c/status.c

index f1e47a8a8cfa94baf74572789541eb43bc7d7f27..a3e2745c21fdaa4ef18a6e4949a850ddf9e61a8e 100644 (file)
@@ -169,6 +169,8 @@ extern "C" {
       F_control_group_not,
       F_critical,
       F_critical_not,
+      F_dead,
+      F_dead_not,
       F_deadlock,
       F_deadlock_not,
       F_descriptor,
@@ -218,6 +220,8 @@ extern "C" {
       F_limit_not,
       F_link,
       F_link_not,
+      F_live,
+      F_live_not,
       F_lock,
       F_lock_not,
       F_loop,
index 3b553cc6fcc4b04df04ec958cfe2415d17ab7930..be58bd87a9df10101c049be223ebc109bc581b0c 100644 (file)
@@ -1183,6 +1183,8 @@ extern "C" {
 
     if (error) {
       if (error == EINVAL) return F_status_set_error(F_parameter);
+      if (error == ENOTRECOVERABLE) return F_status_set_error(F_recover_not);
+      if (error == EOWNERDEAD) return F_status_set_error(F_dead);
       if (error == EPERM) return F_status_set_error(F_prohibited);
 
       return F_status_set_error(F_failure);
@@ -1203,7 +1205,10 @@ extern "C" {
 
     if (error) {
       if (error == EINVAL) return F_status_set_error(F_parameter);
+      if (error == ENOTRECOVERABLE) return F_status_set_error(F_recover_not);
+      if (error == EOWNERDEAD) return F_status_set_error(F_dead);
       if (error == EPERM) return F_status_set_error(F_prohibited);
+      if (error == ETIMEDOUT) return F_time;
 
       return F_status_set_error(F_failure);
     }
@@ -2304,7 +2309,7 @@ extern "C" {
       if (error == EDEADLK) return F_status_set_error(F_deadlock);
       if (error == EINVAL) return F_status_set_error(F_parameter);
       if (error == ENOTRECOVERABLE) return F_status_set_error(F_recover_not);
-      if (error == EOWNERDEAD) return F_status_set_error(F_thread_not);
+      if (error == EOWNERDEAD) return F_status_set_error(F_dead);
       if (error == ETIMEDOUT) return F_time;
 
       return F_status_set_error(F_failure);
@@ -2544,7 +2549,7 @@ extern "C" {
       if (error == EDEADLK) return F_status_set_error(F_deadlock);
       if (error == EINVAL) return F_status_set_error(F_parameter);
       if (error == ENOTRECOVERABLE) return F_status_set_error(F_recover_not);
-      if (error == EOWNERDEAD) return F_status_set_error(F_thread_not);
+      if (error == EOWNERDEAD) return F_status_set_error(F_dead);
       if (error == EPERM) return F_status_set_error(F_prohibited);
 
       return F_status_set_error(F_failure);
index 65ba7ba4dfee3748f336b93cf5875e402f81b24e..65003e698b6515919c2288f9bb6483d9b4c3cb30 100644 (file)
@@ -1583,7 +1583,10 @@ extern "C" {
  * @return
  *   F_none on success.
  *
+ *   F_dead (with error bit) if the owning thread terminated while holding the mutex lock (thread is dead).
  *   F_parameter (with error bit) if a parameter is invalid.
+ *   F_prohibited (with error bit) if not allowed to perform the operation (possibly because mutex is not owned by current thread).
+ *   F_recover_not (with error bit) if the state protected by the mutex is not recoverable.
  *
  *   F_failure (with error bit) on any other error.
  *
@@ -1601,7 +1604,7 @@ extern "C" {
  *
  * @param wait
  *   The amount of time to wait for.
- *   The wait time is relative to the clock, so consider calling clock_gettime() and then adding the amount of wait time.
+ *   The wait time is relative to the clock, so consider calling clock_gettime() or gettimeofday() and then adding the amount of wait time.
  * @param condition
  *   The condition to wait on.
  * @param mutex
@@ -1611,8 +1614,10 @@ extern "C" {
  *   F_none on success.
  *   F_time on success, and wait timeout was reached before condition was triggered.
  *
+ *   F_dead (with error bit) if the owning thread terminated while holding the mutex lock (thread is dead).
  *   F_parameter (with error bit) if a parameter is invalid.
  *   F_prohibited (with error bit) if not allowed to perform the operation (possibly because mutex is not owned by current thread).
+ *   F_recover_not (with error bit) if the state protected by the mutex is not recoverable.
  *
  *   F_failure (with error bit) on any other error.
  *
@@ -1887,7 +1892,7 @@ extern "C" {
  *   The ID of the thread to wait for.
  * @param wait
  *   The amount of time to wait for.
- *   The wait time is relative to the clock, so consider calling clock_gettime() and then adding the amount of wait time.
+ *   The wait time is relative to the clock, so consider calling clock_gettime() or gettimeofday() and then adding the amount of wait time.
  * @param result
  *   (optional) The data returned by the terminated thread (usually the exist status).
  *   If the terminated thread is cancelled, then this holds PTHREAD_CANCELED.
@@ -3085,7 +3090,7 @@ extern "C" {
  *   F_prohibited (with error bit) if not allowed to perform the operation.
  *   F_recover_not (with error bit) if the state protected by the mutex is not recoverable.
  *   F_resource_not (with error bit) if max mutex locks is reached.
- *   F_thread_not (with error bit) if the owning thread terminated while holding the mutex lock (thread is dead).
+ *   F_dead (with error bit) if the owning thread terminated while holding the mutex lock (thread is dead).
  *
  *   F_failure (with error bit) on any other error.
  *
@@ -3161,7 +3166,7 @@ extern "C" {
  *   F_prohibited (with error bit) if not allowed to perform the operation.
  *   F_recover_not (with error bit) if the state protected by the mutex is not recoverable (for a "robust" mutex).
  *   F_resource_not (with error bit) if max mutex locks is reached.
- *   F_thread_not (with error bit) if the owning thread terminated while holding the mutex lock (thread is dead).
+ *   F_dead (with error bit) if the owning thread terminated while holding the mutex lock (thread is dead).
  *
  *   F_failure (with error bit) on any other error.
  *
index 6810feadf6491804da2cc222c19acd84236dcb6d..6dfeb6f136980643a70d38511e3a3688b5d5e8c2 100644 (file)
@@ -290,6 +290,12 @@ extern "C" {
         case F_critical_not:
           *string = FL_status_string_critical_not;
           break;
+        case F_dead:
+          *string = FL_status_string_dead;
+          break;
+        case F_dead_not:
+          *string = FL_status_string_dead_not;
+          break;
         case F_deadlock:
           *string = FL_status_string_deadlock;
           break;
@@ -431,6 +437,12 @@ extern "C" {
         case F_link_not:
           *string = FL_status_string_link_not;
           break;
+        case F_live:
+          *string = FL_status_string_live;
+          break;
+        case F_live_not:
+          *string = FL_status_string_live_not;
+          break;
         case F_lock:
           *string = FL_status_string_lock;
           break;
index a4ace1265b7a16e041a8efbb336dd997a8d463f3..4f2de20f98aa47a2d234195fce536084188f4ff1 100644 (file)
@@ -189,6 +189,8 @@ extern "C" {
     #define FL_status_string_control_group_not "F_control_group_not"
     #define FL_status_string_critical          "F_critical"
     #define FL_status_string_critical_not      "F_critical_not"
+    #define FL_status_string_dead              "F_dead"
+    #define FL_status_string_dead_not          "F_dead_not"
     #define FL_status_string_deadlock          "F_deadlock"
     #define FL_status_string_deadlock_not      "F_deadlock_not"
     #define FL_status_string_descriptor        "F_descriptor"
@@ -238,6 +240,8 @@ extern "C" {
     #define FL_status_string_limit_not         "F_limit_not"
     #define FL_status_string_link              "F_link"
     #define FL_status_string_link_not          "F_link_not"
+    #define FL_status_string_live              "F_live"
+    #define FL_status_string_live_not          "F_live_not"
     #define FL_status_string_lock              "F_lock"
     #define FL_status_string_lock_not          "F_lock_not"
     #define FL_status_string_loop              "F_loop"
@@ -354,6 +358,8 @@ extern "C" {
     #define FL_status_string_control_group_not_length 19
     #define FL_status_string_critical_length          10
     #define FL_status_string_critical_not_length      14
+    #define FL_status_string_dead_length              6
+    #define FL_status_string_dead_not_length          10
     #define FL_status_string_deadlock_length          10
     #define FL_status_string_deadlock_not_length      14
     #define FL_status_string_descriptor_length        12
@@ -403,6 +409,8 @@ extern "C" {
     #define FL_status_string_limit_not_length         11
     #define FL_status_string_link_length              6
     #define FL_status_string_link_not_length          10
+    #define FL_status_string_live_length              6
+    #define FL_status_string_live_not_length          10
     #define FL_status_string_lock_length              6
     #define FL_status_string_lock_not_length          10
     #define FL_status_string_loop_length              6
index 2b9c0c2fe3ebf6969bafb626a2a26d10ea759595..6d9fd8d298cc48b88932b6f3d587805a405f10a0 100644 (file)
@@ -486,6 +486,16 @@ extern "C" {
         return F_none;
       }
 
+      if (fl_string_compare(string, FL_status_string_dead, length, FL_status_string_dead_length) == F_equal_to) {
+        *code = F_dead;
+        return F_none;
+      }
+
+      if (fl_string_compare(string, FL_status_string_dead_not, length, FL_status_string_dead_not_length) == F_equal_to) {
+        *code = F_dead_not;
+        return F_none;
+      }
+
       if (fl_string_compare(string, FL_status_string_deadlock, length, FL_status_string_deadlock_length) == F_equal_to) {
         *code = F_deadlock;
         return F_none;
@@ -731,6 +741,16 @@ extern "C" {
         return F_none;
       }
 
+      if (fl_string_compare(string, FL_status_string_live, length, FL_status_string_live_length) == F_equal_to) {
+        *code = F_live;
+        return F_none;
+      }
+
+      if (fl_string_compare(string, FL_status_string_live_not, length, FL_status_string_live_not_length) == F_equal_to) {
+        *code = F_live_not;
+        return F_none;
+      }
+
       if (fl_string_compare(string, FL_status_string_lock, length, FL_status_string_lock_length) == F_equal_to) {
         *code = F_lock;
         return F_none;