diff options
author | Robin Watts <Robin.Watts@artifex.com> | 2021-10-27 15:18:58 +0100 |
---|---|---|
committer | Robin Watts <Robin.Watts@artifex.com> | 2021-10-27 15:49:27 +0100 |
commit | fb05cea482a6e0f2c346812811d0e62404e2d566 (patch) | |
tree | 01f4d72e586e45c6589421aa902adb48e0dfcab1 /contrib | |
parent | 81a053f31f4e25ae205c614d6cc5c5bdd7c2bdeb (diff) | |
download | ghostpdl-fb05cea482a6e0f2c346812811d0e62404e2d566.tar.gz |
Tweak eprn and pcl3 devices to remove non const statics.
This should make the devices threadsafe.
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/pcl3/eprn/eprnparm.c | 6 | ||||
-rw-r--r-- | contrib/pcl3/eprn/gdeveprn.h | 4 | ||||
-rw-r--r-- | contrib/pcl3/eprn/mediasize.c | 27 | ||||
-rw-r--r-- | contrib/pcl3/eprn/mediasize.h | 12 | ||||
-rw-r--r-- | contrib/pcl3/src/gdevpcl3.c | 5 | ||||
-rw-r--r-- | contrib/pcl3/src/pcl3opts.c | 3 | ||||
-rw-r--r-- | contrib/pcl3/src/pclsize.c | 51 | ||||
-rw-r--r-- | contrib/pcl3/src/pclsize.h | 25 |
8 files changed, 84 insertions, 49 deletions
diff --git a/contrib/pcl3/eprn/eprnparm.c b/contrib/pcl3/eprn/eprnparm.c index 1d989c402..34e47d674 100644 --- a/contrib/pcl3/eprn/eprnparm.c +++ b/contrib/pcl3/eprn/eprnparm.c @@ -390,7 +390,7 @@ static char *next_word(char *s) #define cleanup() (free(list), gp_fclose(f)) -static int eprn_read_media_data(eprn_Eprn *eprn, gs_memory_t *memory) +static int eprn_read_media_data(mediasize_table *tables, eprn_Eprn *eprn, gs_memory_t *memory) { char buffer[BUFFER_SIZE]; const char @@ -502,7 +502,7 @@ static int eprn_read_media_data(eprn_Eprn *eprn, gs_memory_t *memory) t++; } { - ms_MediaCode code = ms_find_code_from_name(s, eprn->flag_desc); + ms_MediaCode code = ms_find_code_from_name(tables, s, eprn->flag_desc); if (code == ms_none) { eprintf5("%s" ERRPREF "Unknown media name (%s) in " "media configuration file\n%s %s, line %d.\n", @@ -664,7 +664,7 @@ int eprn_set_media_data(eprn_Device *dev, const char *media_file, size_t length) else { strncpy(eprn->media_file, media_file, length); eprn->media_file[length] = '\0'; - if ((rc = eprn_read_media_data(eprn, dev->memory->non_gc_memory)) != 0) { + if ((rc = eprn_read_media_data(&dev->eprn.table, eprn, dev->memory->non_gc_memory)) != 0) { gs_free(dev->memory->non_gc_memory, eprn->media_file, length + 1, sizeof(char), "eprn_set_media_data"); eprn->media_file = NULL; diff --git a/contrib/pcl3/eprn/gdeveprn.h b/contrib/pcl3/eprn/gdeveprn.h index b079d002d..bc221db5a 100644 --- a/contrib/pcl3/eprn/gdeveprn.h +++ b/contrib/pcl3/eprn/gdeveprn.h @@ -528,6 +528,7 @@ typedef struct s_eprn_Device { present in 'next_scan_line' with its device coordinate being "next_y - 1", unless 'next_y' is zero in which case we have finished. */ gs_gstate * pgs; + mediasize_table table; } eprn_Eprn; /* Macro for device structure type definitions. Note that in contrast to @@ -625,7 +626,8 @@ typedef struct { 0, /* octets_per_line */ \ 0, /* output_planes */ \ 0, /* next_y */ \ - NULL /* pgs */ \ + NULL, /* pgs */ \ + { 0 } /* table */ \ } /* For the calling conventions of the following functions consult the comments diff --git a/contrib/pcl3/eprn/mediasize.c b/contrib/pcl3/eprn/mediasize.c index 21c6a26fc..c9e3d41f7 100644 --- a/contrib/pcl3/eprn/mediasize.c +++ b/contrib/pcl3/eprn/mediasize.c @@ -243,15 +243,21 @@ static const ms_Flag substrings[] = { {0, NULL} }; +/* If you get an error when compiling the following, then MAX_MEDIASIZES + * (defined in pcltables.h) must be increased. */ +typedef struct +{ + char compile_time_assert[array_size(list) <= MAX_MEDIASIZES ? 1 : -1]; +} compile_time_assert_for_list_length; + /*****************************************************************************/ -ms_MediaCode ms_find_code_from_name(const char *name, - const ms_Flag *user_flag_list) +ms_MediaCode ms_find_code_from_name(mediasize_table *tables, + const char *name, + const ms_Flag *user_flag_list) { const char *end; char stripped_name[LONGER_THAN_NAMES]; - static const ms_SizeDescription *sorted_list[array_size(list) - 1]; - static unsigned int entries = 0; ms_SizeDescription keydata, *key = &keydata; @@ -261,13 +267,14 @@ ms_MediaCode ms_find_code_from_name(const char *name, /* On the first use of this function, compile a table of pointers into the list which is sorted by the names of the sizes. */ - if (entries == 0) { - while (entries < array_size(sorted_list)) { - sorted_list[entries] = list + entries + 1; /* ignore 'ms_none' */ + if (tables->mediasize_list_inited == 0) { + int entries = 1; /* ignore 'ms_none' */ + while (entries < array_size(list)) { + tables->mediasize_list[entries] = list + entries; entries++; } - qsort(sorted_list, array_size(sorted_list), sizeof(ms_SizeDescription *), - &cmp_by_name); + qsort(tables->mediasize_list, array_size(list) - 1, sizeof(ms_SizeDescription *), &cmp_by_name); + tables->mediasize_list_inited = 1; } /* Prevent idiots (like myself) from crashing the routine */ @@ -325,7 +332,7 @@ ms_MediaCode ms_find_code_from_name(const char *name, keydata.name = stripped_name; /* Search */ - found = (const ms_SizeDescription **)bsearch(&key, sorted_list, entries, + found = (const ms_SizeDescription **)bsearch(&key, tables->mediasize_list, array_size(list) - 1, sizeof(ms_SizeDescription *), &cmp_by_name); return found == NULL? ms_none: ((*found)->size | flags); diff --git a/contrib/pcl3/eprn/mediasize.h b/contrib/pcl3/eprn/mediasize.h index 4033ad218..0599f9277 100644 --- a/contrib/pcl3/eprn/mediasize.h +++ b/contrib/pcl3/eprn/mediasize.h @@ -150,6 +150,13 @@ typedef struct { */ } ms_SizeDescription; +#define MAX_MEDIASIZES 128 + +typedef struct { + int mediasize_list_inited; + const ms_SizeDescription *mediasize_list[MAX_MEDIASIZES]; +} mediasize_table; + /****************************************************************************** Media codes @@ -254,8 +261,9 @@ extern const ms_SizeDescription *ms_find_size_from_code(ms_MediaCode code); and appearance as a qualifier or consider the order of appearance. - There is no support for serialization qualifiers. */ -extern ms_MediaCode ms_find_code_from_name(const char *name, - const ms_Flag *user_flag_list); +extern ms_MediaCode ms_find_code_from_name(mediasize_table *tables, + const char *name, + const ms_Flag *user_flag_list); /*===========================================================================*/ diff --git a/contrib/pcl3/src/gdevpcl3.c b/contrib/pcl3/src/gdevpcl3.c index 5e3e8f802..eaf603c14 100644 --- a/contrib/pcl3/src/gdevpcl3.c +++ b/contrib/pcl3/src/gdevpcl3.c @@ -82,6 +82,7 @@ typedef struct { configured, /* Has the output file been configured? */ configure_every_page; /* Repeat the configuration for every page? */ pcl_FileData file_data; + pcl3_sizetable table; } pcl3_Device; /*****************************************************************************/ @@ -305,7 +306,7 @@ static void get_string_for_int(int in_value, const eprn_StringAndInt *table, out_value->persistent = true; } else { - static char buffer[22]; /* Must be sufficient for an 'int' */ + char buffer[22]; /* Must be sufficient for an 'int' */ gs_sprintf(buffer, "%d", in_value); assert(strlen(buffer) < sizeof(buffer)); @@ -1326,7 +1327,7 @@ static int pcl3_open_device(gx_device *device) unsigned int j; /* Media handling */ - data->size = pcl3_page_size(dev->eprn.code); + data->size = pcl3_page_size(&dev->table, dev->eprn.code); if (data->size == pcl_ps_default) { /* This is due to a media description using a media size code for which there is no PCL Page Size code. This is either an error in a builtin diff --git a/contrib/pcl3/src/pcl3opts.c b/contrib/pcl3/src/pcl3opts.c index 51e9cce3a..9b3b261c1 100644 --- a/contrib/pcl3/src/pcl3opts.c +++ b/contrib/pcl3/src/pcl3opts.c @@ -144,6 +144,7 @@ static void print_result(CollectedInfo *ip) /* NLS: 10, 70 */ int j; int ll; /* line length */ unsigned int min_hres, min_vres, black_levels, non_black_levels, start; + pcl3_sizetable sizetable = { 0 }; if (ip->number_of_outputs > 0) imessage(ip->out, 10, @@ -373,7 +374,7 @@ static void print_result(CollectedInfo *ip) /* NLS: 10, 70 */ } if (ip->fdata.size != 0) { - ms_MediaCode media_code = pcl3_media_code(ip->fdata.size); + ms_MediaCode media_code = pcl3_media_code(&sizetable, ip->fdata.size); const ms_SizeDescription *size = ms_find_size_from_code(media_code); if (size == NULL) imessage(ip->out, 14, diff --git a/contrib/pcl3/src/pclsize.c b/contrib/pcl3/src/pclsize.c index 831b82bc8..6400f813a 100644 --- a/contrib/pcl3/src/pclsize.c +++ b/contrib/pcl3/src/pclsize.c @@ -36,16 +36,8 @@ This list is used to find a PCL Page Size code for a particular media code. It will be sorted by media code before the first use. - This structure is based on the assumption that one needs only a single - Page Size code for each supported media code. See the discussion in - pclgen.h. */ -typedef struct { - ms_MediaCode mc; - pcl_PageSize ps; -} CodeEntry; - #define me(keyword) {ms_##keyword, pcl_ps_##keyword} static CodeEntry code_map[] = { @@ -84,6 +76,13 @@ static CodeEntry code_map[] = { #undef me +/* If the following gives a compile error, then MAX_CODEENTRIES in pclsize.h + * must be increased. */ +typedef struct +{ + char compile_time_assert[array_size(code_map) <= MAX_CODEENTRIES ? 1 : -1]; +} compile_time_assert_for_codeentry; + /****************************************************************************** Function: cmp_by_size @@ -108,20 +107,20 @@ static int cmp_by_size(const void *a, const void *b) ******************************************************************************/ -pcl_PageSize pcl3_page_size(ms_MediaCode code) +pcl_PageSize pcl3_page_size(pcl3_sizetable *table, ms_MediaCode code) { - static pcl_bool initialized = FALSE; CodeEntry key; const CodeEntry *result; /* Sort the table if necessary */ - if (!initialized) { - qsort(code_map, array_size(code_map), sizeof(CodeEntry), cmp_by_size); - initialized = TRUE; + if (!table->inited_code_map) { + memcpy(table->code_map, code_map, array_size(code_map) * sizeof(CodeEntry)); + qsort(table->code_map, array_size(code_map), sizeof(CodeEntry), cmp_by_size); + table->inited_code_map = TRUE; } key.mc = ms_without_flags(code) |( code & PCL_CARD_FLAG); - result = (const CodeEntry *)bsearch(&key, code_map, array_size(code_map), + result = (const CodeEntry *)bsearch(&key, table->code_map, array_size(code_map), sizeof(CodeEntry), cmp_by_size); return result == NULL? pcl_ps_default: result->ps; @@ -149,23 +148,21 @@ static int cmp_by_code(const void *a, const void *b) ******************************************************************************/ -ms_MediaCode pcl3_media_code(pcl_PageSize code) +ms_MediaCode pcl3_media_code(pcl3_sizetable *table, pcl_PageSize code) { - static CodeEntry inverse_map[array_size(code_map)]; - static pcl_bool initialized = FALSE; CodeEntry key; const CodeEntry *result; /* Construct the table if necessary */ - if (!initialized) { - memcpy(&inverse_map, &code_map, sizeof(inverse_map)); - qsort(inverse_map, array_size(inverse_map), sizeof(CodeEntry), cmp_by_code); - initialized = TRUE; + if (!table->inited_inverse_map) { + memcpy(&table->inverse_map, &code_map, sizeof(code_map)); + qsort(table->inverse_map, array_size(code_map), sizeof(CodeEntry), cmp_by_code); + table->inited_inverse_map = TRUE; } key.ps = code; - result = (const CodeEntry *)bsearch(&key, inverse_map, - array_size(inverse_map), sizeof(CodeEntry), cmp_by_code); + result = (const CodeEntry *)bsearch(&key, table->inverse_map, + array_size(code_map), sizeof(CodeEntry), cmp_by_code); if (result == NULL) { key.ps = -code; /* Actually, this is a generalization on my part: I am assuming that any @@ -173,8 +170,8 @@ ms_MediaCode pcl3_media_code(pcl_PageSize code) same media extension irrespective of sheet orientation in raster space. I have found negative Page Size codes in HP documentation only for Env10 and EnvDL. */ - result = (const CodeEntry *)bsearch(&key, inverse_map, - array_size(inverse_map), sizeof(CodeEntry), cmp_by_code); + result = (const CodeEntry *)bsearch(&key, table->inverse_map, + array_size(code_map), sizeof(CodeEntry), cmp_by_code); } return result == NULL? ms_none: result->mc; @@ -189,7 +186,7 @@ ms_MediaCode pcl3_media_code(pcl_PageSize code) ******************************************************************************/ -const ms_SizeDescription *pcl3_size_description(pcl_PageSize code) +const ms_SizeDescription *pcl3_size_description(pcl3_sizetable *table, pcl_PageSize code) { - return ms_find_size_from_code(pcl3_media_code(code)); + return ms_find_size_from_code(pcl3_media_code(table, code)); } diff --git a/contrib/pcl3/src/pclsize.h b/contrib/pcl3/src/pclsize.h index 90a5320ef..760dd4c6d 100644 --- a/contrib/pcl3/src/pclsize.h +++ b/contrib/pcl3/src/pclsize.h @@ -24,9 +24,28 @@ #define PCL_CARD_FLAG MS_USER_FLAG_1 #define PCL_CARD_STRING "Card" -extern pcl_PageSize pcl3_page_size(ms_MediaCode code); -extern ms_MediaCode pcl3_media_code(pcl_PageSize code); -extern const ms_SizeDescription *pcl3_size_description(pcl_PageSize size); +/* + This structure is based on the assumption that one needs only a single + Page Size code for each supported media code. See the discussion in + pclgen.h. +*/ +typedef struct { + ms_MediaCode mc; + pcl_PageSize ps; +} CodeEntry; + +#define MAX_CODEENTRIES 64 + +typedef struct { + int inited_code_map; + CodeEntry code_map[MAX_CODEENTRIES]; + int inited_inverse_map; + CodeEntry inverse_map[MAX_CODEENTRIES]; +} pcl3_sizetable; + +extern pcl_PageSize pcl3_page_size(pcl3_sizetable *table, ms_MediaCode code); +extern ms_MediaCode pcl3_media_code(pcl3_sizetable *table, pcl_PageSize code); +extern const ms_SizeDescription *pcl3_size_description(pcl3_sizetable *table, pcl_PageSize size); /*****************************************************************************/ |