implement reader_cancel_thread using __thread thread-local storage

This commit is contained in:
Jan Kanis 2013-01-23 00:19:29 +01:00
parent b6bd6e399d
commit 70a75dc88a
3 changed files with 21 additions and 2 deletions

View file

@ -181,7 +181,10 @@ commence.
#define SEARCH_FORWARD 1
/* Any time the contents of a buffer changes, we update the generation count. This allows for our background highlighting thread to notice it and skip doing work that it would otherwise have to do. */
static unsigned int s_generation_count;
static volatile unsigned int s_generation_count;
/* This threadlocal generation count is set when an autosuggestion background thread starts up, so it can easily check if the work it is doing is no longer useful. */
static __thread unsigned int thread_generation_count;
/* A color is an int */
typedef int color_t;
@ -667,6 +670,12 @@ int reader_reading_interrupted()
return res;
}
bool reader_cancel_thread()
{
ASSERT_IS_BACKGROUND_THREAD();
return s_generation_count != thread_generation_count;
}
void reader_write_title()
{
const wchar_t *title;
@ -1225,6 +1234,8 @@ struct autosuggestion_context_t
return 0;
}
thread_generation_count = generation_count;
/* Let's make sure we aren't using the empty string */
if (search_string.empty())
{

View file

@ -132,6 +132,14 @@ void reader_reset_interrupted();
*/
int reader_reading_interrupted();
/**
Returns true if the current reader generation count does not equal the
generation count the current thread was started with.
Note: currently only valid for autocompletion threads! Other threads don't
set the threadlocal generation count when they start up.
*/
bool reader_cancel_thread();
/**
Read one line of input. Before calling this function, reader_push()
must have been called in order to set up a valid reader

View file

@ -728,7 +728,7 @@ static int wildcard_expand_internal(const wchar_t *wc,
// debug( 3, L"WILDCARD_EXPAND %ls in %ls", wc, base_dir );
if (is_main_thread() && reader_interrupted())
if (is_main_thread() ? reader_interrupted() : reader_cancel_thread())
{
return -1;
}