[pypy-commit] stmgc queue: Clarify the return value of join()
arigo
noreply at buildbot.pypy.org
Thu Jun 18 18:35:50 CEST 2015
Author: Armin Rigo <arigo at tunes.org>
Branch: queue
Changeset: r1860:d083e426a17d
Date: 2015-06-18 14:45 +0200
http://bitbucket.org/pypy/stmgc/changeset/d083e426a17d/
Log: Clarify the return value of join()
diff --git a/c8/stm/queue.c b/c8/stm/queue.c
--- a/c8/stm/queue.c
+++ b/c8/stm/queue.c
@@ -309,7 +309,7 @@
seg->unfinished_tasks_in_this_transaction--;
}
-int stm_queue_join(object_t *qobj, stm_queue_t *queue, stm_thread_local_t *tl)
+long stm_queue_join(object_t *qobj, stm_queue_t *queue, stm_thread_local_t *tl)
{
int64_t result;
@@ -317,8 +317,7 @@
result = queue->unfinished_tasks; /* can't wait in tests */
result += (queue->segs[STM_SEGMENT->segment_num - 1]
.unfinished_tasks_in_this_transaction);
- if (result > 0)
- return 42;
+ return result;
#else
STM_PUSH_ROOT(*tl, qobj);
_stm_commit_transaction();
@@ -333,8 +332,9 @@
STM_POP_ROOT(*tl, qobj); /* 'queue' should stay alive until here */
#endif
- /* returns 1 for 'ok', or 0 for error: negative 'unfinished_tasks' */
- return (result == 0);
+ /* returns 0 for 'ok', or negative if there was more task_done()
+ than put() so far */
+ return result;
}
static void queue_trace_list(queue_entry_t *entry, void trace(object_t **),
diff --git a/c8/stmgc.h b/c8/stmgc.h
--- a/c8/stmgc.h
+++ b/c8/stmgc.h
@@ -751,7 +751,7 @@
void stm_queue_task_done(stm_queue_t *queue);
/* join() commits and waits outside a transaction (so push roots).
Unsuitable if the current transaction is atomic! */
-int stm_queue_join(object_t *qobj, stm_queue_t *queue, stm_thread_local_t *tl);
+long stm_queue_join(object_t *qobj, stm_queue_t *queue, stm_thread_local_t *tl);
void stm_queue_tracefn(stm_queue_t *queue, void trace(object_t **));
diff --git a/c8/test/test_queue.py b/c8/test/test_queue.py
--- a/c8/test/test_queue.py
+++ b/c8/test/test_queue.py
@@ -59,12 +59,12 @@
def join(self, obj):
q = get_queue(obj)
res = lib.stm_queue_join(obj, q, self.tls[self.current_thread]);
- if res == 1:
+ if res == 0:
return
- elif res == 42:
+ elif res > 0:
raise Conflict("join() cannot wait in tests")
else:
- raise AssertionError("stm_queue_join error")
+ raise AssertionError("too much task_done()!")
class TestQueue(BaseTestQueue):
More information about the pypy-commit
mailing list