| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2017-06-29 15:20:24 +0200 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2017-06-29 15:20:24 +0200 | 
| commit | 8d5c996aef28fae9f848e1fab419b4d2821e8862 (patch) | |
| tree | a2b5fac4ee5b3e21711fe80c273f300541d16844 /src/knowledge/knowledge_learn_markov_sequence.c | |
| parent | f7c5db9a32bb0082b59e73fa01656cd083756c3d (diff) | |
First shot at finer mutexes.
Diffstat (limited to 'src/knowledge/knowledge_learn_markov_sequence.c')
| -rw-r--r-- | src/knowledge/knowledge_learn_markov_sequence.c | 62 | 
1 files changed, 59 insertions, 3 deletions
| diff --git a/src/knowledge/knowledge_learn_markov_sequence.c b/src/knowledge/knowledge_learn_markov_sequence.c index 4a770e2..74e29a7 100644 --- a/src/knowledge/knowledge_learn_markov_sequence.c +++ b/src/knowledge/knowledge_learn_markov_sequence.c @@ -380,6 +380,8 @@ int JH_knowledge_learn_markov_sequence        }     } +   JH_knowledge_readlock_sequences(k, io); +     if     (        JH_knowledge_find_sequence @@ -388,9 +390,49 @@ int JH_knowledge_learn_markov_sequence           sequence,           markov_order,           sequence_id -      ) == 0 +      ) +      == 0     )     { +      JH_knowledge_readunlock_sequences(k, io); + +      JH_DEBUG +      ( +         io, +         JH_DEBUG_KNOWLEDGE_LEARN_SEQUENCE, +         "Markov sequence is known. ID: %u", +         *sequence_id +      ); + +      return 0; +   } + +   /* +    * We need to write, but we currently have reading access. +    * We can't get the writing access while someone (even us) has the reading +    * access, so we release the reading access. +    */ +   JH_knowledge_readunlock_sequences(k, io); + +   JH_knowledge_writelock_sequences(k, io); +   /* +    * Now we have writer access, but someone else might have modified 'k' before +    * we did, so we need to find the sequence's location again. +    */ +   if +   ( +      JH_knowledge_find_sequence +      ( +         k, +         sequence, +         markov_order, +         sequence_id +      ) +      == 0 +   ) +   { +      JH_knowledge_writeunlock_sequences(k, io); +        JH_DEBUG        (           io, @@ -405,7 +447,8 @@ int JH_knowledge_learn_markov_sequence     sorted_id = *sequence_id;     *sequence_id = k->sequences_length; -   return +   if +   (        add_sequence        (           k, @@ -414,5 +457,18 @@ int JH_knowledge_learn_markov_sequence           *sequence_id,           sorted_id,           io -      ); +      ) +      < 0 +   ) +   { +      JH_knowledge_writeunlock_sequences(k, io); + +      return -1; +   } +   else +   { +      JH_knowledge_writeunlock_sequences(k, io); + +      return 0; +   }  } | 


