* 64-bit compatibility fixes (for problems revealed by building on an Athlon
64 running 64-bit SUSE). A patched ATerm library is required to run Nix succesfully.
This commit is contained in:
		
							parent
							
								
									e3c07782d1
								
							
						
					
					
						commit
						9d72bf8835
					
				
					 10 changed files with 21 additions and 20 deletions
				
			
		|  | @ -488,9 +488,9 @@ static string relativise(Path pivot, Path p) | ||||||
|     /* Otherwise, `p' is in a parent of `pivot'.  Find up till which
 |     /* Otherwise, `p' is in a parent of `pivot'.  Find up till which
 | ||||||
|        path component `p' and `pivot' match, and add an appropriate |        path component `p' and `pivot' match, and add an appropriate | ||||||
|        number of `..' components. */ |        number of `..' components. */ | ||||||
|     unsigned int i = 1; |     string::size_type i = 1; | ||||||
|     while (1) { |     while (1) { | ||||||
|         unsigned int j = pivot.find('/', i); |         string::size_type j = pivot.find('/', i); | ||||||
|         if (j == string::npos) break; |         if (j == string::npos) break; | ||||||
|         j++; |         j++; | ||||||
|         if (pivot.substr(0, j) != p.substr(0, j)) break; |         if (pivot.substr(0, j) != p.substr(0, j)) break; | ||||||
|  |  | ||||||
|  | @ -212,7 +212,7 @@ static void readTempRoots(PathSet & tempRoots, FDs & fds) | ||||||
|         string contents = readFile(*fd); |         string contents = readFile(*fd); | ||||||
| 
 | 
 | ||||||
|         /* Extract the roots. */ |         /* Extract the roots. */ | ||||||
|         unsigned int pos = 0, end; |         string::size_type pos = 0, end; | ||||||
| 
 | 
 | ||||||
|         while ((end = contents.find((char) 0, pos)) != string::npos) { |         while ((end = contents.find((char) 0, pos)) != string::npos) { | ||||||
|             Path root(contents, pos, end - pos); |             Path root(contents, pos, end - pos); | ||||||
|  |  | ||||||
|  | @ -46,7 +46,7 @@ static void readSettings() | ||||||
|             line += contents[pos++]; |             line += contents[pos++]; | ||||||
|         pos++; |         pos++; | ||||||
| 
 | 
 | ||||||
|         unsigned int hash = line.find('#'); |         string::size_type hash = line.find('#'); | ||||||
|         if (hash != string::npos) |         if (hash != string::npos) | ||||||
|             line = string(line, 0, hash); |             line = string(line, 0, hash); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -99,7 +99,7 @@ PathSet scanForReferences(const string & path, const PathSet & paths) | ||||||
|        have the form `HASH-bla'). */ |        have the form `HASH-bla'). */ | ||||||
|     for (PathSet::const_iterator i = paths.begin(); i != paths.end(); i++) { |     for (PathSet::const_iterator i = paths.begin(); i != paths.end(); i++) { | ||||||
|         string baseName = baseNameOf(*i); |         string baseName = baseNameOf(*i); | ||||||
|         unsigned int pos = baseName.find('-'); |         string::size_type pos = baseName.find('-'); | ||||||
|         if (pos == string::npos) |         if (pos == string::npos) | ||||||
|             throw Error(format("bad reference `%1%'") % *i); |             throw Error(format("bad reference `%1%'") % *i); | ||||||
|         string s = string(baseName, 0, pos); |         string s = string(baseName, 0, pos); | ||||||
|  |  | ||||||
|  | @ -243,7 +243,7 @@ Path toStorePath(const Path & path) | ||||||
| { | { | ||||||
|     if (!isInStore(path)) |     if (!isInStore(path)) | ||||||
|         throw Error(format("path `%1%' is not in the Nix store") % path); |         throw Error(format("path `%1%' is not in the Nix store") % path); | ||||||
|     unsigned int slash = path.find('/', nixStore.size() + 1); |     Path::size_type slash = path.find('/', nixStore.size() + 1); | ||||||
|     if (slash == Path::npos) |     if (slash == Path::npos) | ||||||
|         return path; |         return path; | ||||||
|     else |     else | ||||||
|  | @ -563,7 +563,7 @@ static Hash queryHash(const Transaction & txn, const Path & storePath) | ||||||
| { | { | ||||||
|     string s; |     string s; | ||||||
|     nixDB.queryString(txn, dbValidPaths, storePath, s); |     nixDB.queryString(txn, dbValidPaths, storePath, s); | ||||||
|     unsigned int colon = s.find(':'); |     string::size_type colon = s.find(':'); | ||||||
|     if (colon == string::npos) |     if (colon == string::npos) | ||||||
|         throw Error(format("corrupt hash `%1%' in valid-path entry for `%2%'") |         throw Error(format("corrupt hash `%1%' in valid-path entry for `%2%'") | ||||||
|             % s % storePath); |             % s % storePath); | ||||||
|  |  | ||||||
|  | @ -111,34 +111,35 @@ void ATermMap::copy(KeyValue * elements, unsigned int capacity) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | /* !!! use a bigger shift for 64-bit platforms? */ | ||||||
| static const unsigned int shift = 16; | static const unsigned int shift = 16; | ||||||
| static const unsigned int knuth = (unsigned int) (0.6180339887 * (1 << shift)); | static const unsigned long knuth = (unsigned long) (0.6180339887 * (1 << shift)); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| unsigned int ATermMap::hash1(ATerm key) const | unsigned long ATermMap::hash1(ATerm key) const | ||||||
| { | { | ||||||
|     /* Don't care about the least significant bits of the ATerm
 |     /* Don't care about the least significant bits of the ATerm
 | ||||||
|        pointer since they're always 0. */ |        pointer since they're always 0. */ | ||||||
|     unsigned int key2 = ((unsigned int) key) >> 2; |     unsigned long key2 = ((unsigned long) key) >> 2; | ||||||
| 
 | 
 | ||||||
|     /* Approximately equal to:
 |     /* Approximately equal to:
 | ||||||
|     double d = key2 * 0.6180339887; |     double d = key2 * 0.6180339887; | ||||||
|     unsigned int h = (int) (capacity * (d - floor(d))); |     unsigned int h = (int) (capacity * (d - floor(d))); | ||||||
|     */ |     */ | ||||||
|   |   | ||||||
|     unsigned int h = (capacity * ((key2 * knuth) & ((1 << shift) - 1))) >> shift; |     unsigned long h = (capacity * ((key2 * knuth) & ((1 << shift) - 1))) >> shift; | ||||||
| 
 | 
 | ||||||
|     return h; |     return h; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| unsigned int ATermMap::hash2(ATerm key) const | unsigned long ATermMap::hash2(ATerm key) const | ||||||
| { | { | ||||||
|     unsigned int key2 = ((unsigned int) key) >> 2; |     unsigned long key2 = ((unsigned long) key) >> 2; | ||||||
|     /* Note: the result must be relatively prime to `capacity' (which
 |     /* Note: the result must be relatively prime to `capacity' (which
 | ||||||
|        is a power of 2), so we make sure that the result is always |        is a power of 2), so we make sure that the result is always | ||||||
|        odd. */ |        odd. */ | ||||||
|     unsigned int h = ((key2 * 134217689) & (capacity - 1)) | 1; |     unsigned long h = ((key2 * 134217689) & (capacity - 1)) | 1; | ||||||
|     return h; |     return h; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -113,8 +113,8 @@ private: | ||||||
| 
 | 
 | ||||||
|     void copy(KeyValue * elements, unsigned int capacity); |     void copy(KeyValue * elements, unsigned int capacity); | ||||||
|      |      | ||||||
|     inline unsigned int hash1(ATerm key) const; |     inline unsigned long hash1(ATerm key) const; | ||||||
|     inline unsigned int hash2(ATerm key) const; |     inline unsigned long hash2(ATerm key) const; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -119,7 +119,7 @@ Path canonPath(const Path & path, bool resolveSymlinks) | ||||||
| 
 | 
 | ||||||
| Path dirOf(const Path & path) | Path dirOf(const Path & path) | ||||||
| { | { | ||||||
|     unsigned int pos = path.rfind('/'); |     Path::size_type pos = path.rfind('/'); | ||||||
|     if (pos == string::npos) |     if (pos == string::npos) | ||||||
|         throw Error(format("invalid file name: %1%") % path); |         throw Error(format("invalid file name: %1%") % path); | ||||||
|     return pos == 0 ? "/" : Path(path, 0, pos); |     return pos == 0 ? "/" : Path(path, 0, pos); | ||||||
|  | @ -128,7 +128,7 @@ Path dirOf(const Path & path) | ||||||
| 
 | 
 | ||||||
| string baseNameOf(const Path & path) | string baseNameOf(const Path & path) | ||||||
| { | { | ||||||
|     unsigned int pos = path.rfind('/'); |     Path::size_type pos = path.rfind('/'); | ||||||
|     if (pos == string::npos) |     if (pos == string::npos) | ||||||
|         throw Error(format("invalid file name %1% ") % path); |         throw Error(format("invalid file name %1% ") % path); | ||||||
|     return string(path, pos + 1); |     return string(path, pos + 1); | ||||||
|  |  | ||||||
|  | @ -350,7 +350,7 @@ static void queryInstSources(EvalState & state, | ||||||
|                 DrvInfo elem; |                 DrvInfo elem; | ||||||
|                 elem.attrs = shared_ptr<ATermMap>(new ATermMap(0)); /* ugh... */ |                 elem.attrs = shared_ptr<ATermMap>(new ATermMap(0)); /* ugh... */ | ||||||
|                 string name = baseNameOf(*i); |                 string name = baseNameOf(*i); | ||||||
|                 unsigned int dash = name.find('-'); |                 string::size_type dash = name.find('-'); | ||||||
|                 if (dash != string::npos) |                 if (dash != string::npos) | ||||||
|                     name = string(name, dash + 1); |                     name = string(name, dash + 1); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -19,7 +19,7 @@ static int parseName(const string & profileName, const string & name) | ||||||
| { | { | ||||||
|     if (string(name, 0, profileName.size() + 1) != profileName + "-") return -1; |     if (string(name, 0, profileName.size() + 1) != profileName + "-") return -1; | ||||||
|     string s = string(name, profileName.size() + 1); |     string s = string(name, profileName.size() + 1); | ||||||
|     unsigned int p = s.find("-link"); |     string::size_type p = s.find("-link"); | ||||||
|     if (p == string::npos) return -1; |     if (p == string::npos) return -1; | ||||||
|     int n; |     int n; | ||||||
|     if (string2Int(string(s, 0, p), n) && n >= 0) |     if (string2Int(string(s, 0, p), n) && n >= 0) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue