| 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; + } } |


