-
Notifications
You must be signed in to change notification settings - Fork 242
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add tests for, and fix, some assertion errors/failures of re-entrant …
…switches. Here we produce this circumstance using a trace function.
- Loading branch information
Showing
8 changed files
with
197 additions
and
19 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
""" | ||
Uses a trace function to switch greenlets at unexpected times. | ||
In the trace function, we switch from the current greenlet to another | ||
greenlet, which switches | ||
""" | ||
import greenlet | ||
|
||
g1 = None | ||
g2 = None | ||
|
||
switch_to_g2 = False | ||
|
||
def tracefunc(*args): | ||
print('TRACE', *args) | ||
global switch_to_g2 | ||
if switch_to_g2: | ||
switch_to_g2 = False | ||
g2.switch() | ||
print('\tLEAVE TRACE', *args) | ||
|
||
def g1_run(): | ||
print('In g1_run') | ||
global switch_to_g2 | ||
switch_to_g2 = True | ||
from_parent = greenlet.getcurrent().parent.switch() | ||
print('Return to g1_run') | ||
print('From parent', from_parent) | ||
|
||
def g2_run(): | ||
#g1.switch() | ||
greenlet.getcurrent().parent.switch() | ||
|
||
greenlet.settrace(tracefunc) | ||
|
||
g1 = greenlet.greenlet(g1_run) | ||
g2 = greenlet.greenlet(g2_run) | ||
|
||
# This switch didn't actually finish! | ||
# And if it did, it would raise TypeError | ||
# because g1_run() doesn't take any arguments. | ||
g1.switch(1) | ||
print('Back in main') | ||
g1.switch(2) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
""" | ||
Like fail_switch_three_greenlets, but the call into g1_run would actually be | ||
valid. | ||
""" | ||
import greenlet | ||
|
||
g1 = None | ||
g2 = None | ||
|
||
switch_to_g2 = False | ||
|
||
def tracefunc(*args): | ||
print('TRACE', *args) | ||
global switch_to_g2 | ||
if switch_to_g2: | ||
switch_to_g2 = False | ||
g2.switch() | ||
print('\tLEAVE TRACE', *args) | ||
|
||
def g1_run(): | ||
print('In g1_run') | ||
global switch_to_g2 | ||
switch_to_g2 = True | ||
from_parent = greenlet.getcurrent().parent.switch() | ||
print('Return to g1_run') | ||
print('From parent', from_parent) | ||
|
||
def g2_run(): | ||
#g1.switch() | ||
greenlet.getcurrent().parent.switch() | ||
|
||
greenlet.settrace(tracefunc) | ||
|
||
g1 = greenlet.greenlet(g1_run) | ||
g2 = greenlet.greenlet(g2_run) | ||
|
||
g1.switch() | ||
print('Back in main') | ||
g1.switch(2) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
""" | ||
Uses a trace function to switch greenlets at unexpected times. | ||
In the trace function, we switch from the current greenlet to another | ||
greenlet, which switches | ||
""" | ||
import greenlet | ||
|
||
g1 = None | ||
g2 = None | ||
|
||
switch_to_g2 = False | ||
|
||
def tracefunc(*args): | ||
print('TRACE', *args) | ||
global switch_to_g2 | ||
if switch_to_g2: | ||
switch_to_g2 = False | ||
g2.switch() | ||
print('\tLEAVE TRACE', *args) | ||
|
||
def g1_run(): | ||
print('In g1_run') | ||
global switch_to_g2 | ||
switch_to_g2 = True | ||
greenlet.getcurrent().parent.switch() | ||
print('Return to g1_run') | ||
print('Falling off end of g1_run') | ||
|
||
def g2_run(): | ||
g1.switch() | ||
print('Falling off end of g2') | ||
|
||
greenlet.settrace(tracefunc) | ||
|
||
g1 = greenlet.greenlet(g1_run) | ||
g2 = greenlet.greenlet(g2_run) | ||
|
||
g1.switch() | ||
print('Falling off end of main') | ||
g2.switch() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters