diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2016-02-19 01:08:00 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2016-02-19 01:08:00 +0100 |
commit | 608170b9d6a8b63c4c2915f9f1d98f18a4db07a4 (patch) | |
tree | afa9029f04c5f9846fb347010508972cb88f32ab /lib | |
parent | 8ec5c01cae61a727159ddfd0ea7c781d10be9f83 (diff) | |
parent | 12b5c0985d7e7449d98a6f80a77369368698b0a3 (diff) | |
download | Nim-608170b9d6a8b63c4c2915f9f1d98f18a4db07a4.tar.gz |
Merge branch 'devel' of github.com:nim-lang/Nim into devel
Diffstat (limited to 'lib')
-rw-r--r-- | lib/core/macros.nim | 2 | ||||
-rw-r--r-- | lib/core/rlocks.nim | 50 | ||||
-rw-r--r-- | lib/impure/rdstdin.nim | 2 | ||||
-rw-r--r-- | lib/nimbase.h | 25 | ||||
-rw-r--r-- | lib/system/excpt.nim | 2 | ||||
-rw-r--r-- | lib/system/repr.nim | 1 | ||||
-rw-r--r-- | lib/system/syslocks.nim | 16 | ||||
-rw-r--r-- | lib/windows/winlean.nim | 10 |
8 files changed, 98 insertions, 10 deletions
diff --git a/lib/core/macros.nim b/lib/core/macros.nim index 872d4848d..eda793620 100644 --- a/lib/core/macros.nim +++ b/lib/core/macros.nim @@ -601,7 +601,7 @@ proc last*(node: NimNode): NimNode {.compileTime.} = node[<node.len] const - RoutineNodes* = {nnkProcDef, nnkMethodDef, nnkDo, nnkLambda, nnkIteratorDef} + RoutineNodes* = {nnkProcDef, nnkMethodDef, nnkDo, nnkLambda, nnkIteratorDef, nnkTemplateDef, nnkConverterDef} AtomicNodes* = {nnkNone..nnkNilLit} CallNodes* = {nnkCall, nnkInfix, nnkPrefix, nnkPostfix, nnkCommand, nnkCallStrLit, nnkHiddenCallConv} diff --git a/lib/core/rlocks.nim b/lib/core/rlocks.nim new file mode 100644 index 000000000..14f04592b --- /dev/null +++ b/lib/core/rlocks.nim @@ -0,0 +1,50 @@ +# +# +# Nim's Runtime Library +# (c) Copyright 2016 Anatoly Galiulin +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +## This module contains Nim's support for reentrant locks. + +include "system/syslocks" + +type + RLock* = SysLock ## Nim lock, re-entrant + +proc initRLock*(lock: var RLock) {.inline.} = + ## Initializes the given lock. + when defined(posix): + var a: SysLockAttr + initSysLockAttr(a) + setSysLockType(a, SysLockType_Reentrant()) + initSysLock(lock, a.addr) + else: + initSysLock(lock) + +proc deinitRLock*(lock: var RLock) {.inline.} = + ## Frees the resources associated with the lock. + deinitSys(lock) + +proc tryAcquire*(lock: var RLock): bool = + ## Tries to acquire the given lock. Returns `true` on success. + result = tryAcquireSys(lock) + +proc acquire*(lock: var RLock) = + ## Acquires the given lock. + acquireSys(lock) + +proc release*(lock: var RLock) = + ## Releases the given lock. + releaseSys(lock) + +template withRLock*(lock: var RLock, code: untyped): untyped = + ## Acquires the given lock and then executes the code. + block: + acquire(lock) + defer: + release(lock) + {.locks: [lock].}: + code diff --git a/lib/impure/rdstdin.nim b/lib/impure/rdstdin.nim index 15137b436..469bb69c5 100644 --- a/lib/impure/rdstdin.nim +++ b/lib/impure/rdstdin.nim @@ -55,7 +55,7 @@ when defined(Windows): event*: KEY_EVENT_RECORD safetyBuffer: array[0..5, DWORD] - proc readConsoleInputW*(hConsoleInput: THANDLE, lpBuffer: var INPUTRECORD, + proc readConsoleInputW*(hConsoleInput: HANDLE, lpBuffer: var INPUTRECORD, nLength: uint32, lpNumberOfEventsRead: var uint32): WINBOOL{. stdcall, dynlib: "kernel32", importc: "ReadConsoleInputW".} diff --git a/lib/nimbase.h b/lib/nimbase.h index bba5ac023..40ea6c66a 100644 --- a/lib/nimbase.h +++ b/lib/nimbase.h @@ -23,6 +23,31 @@ __clang__ #ifndef NIMBASE_H #define NIMBASE_H +/* ------------ ignore typical warnings in Nim-generated files ------------- */ +#if defined(__GNUC__) || defined(__clang__) +# pragma GCC diagnostic ignored "-Wpragmas" +# pragma GCC diagnostic ignored "-Wwritable-strings" +# pragma GCC diagnostic ignored "-Winvalid-noreturn" +# pragma GCC diagnostic ignored "-Wformat" +# pragma GCC diagnostic ignored "-Wlogical-not-parentheses" +# pragma GCC diagnostic ignored "-Wlogical-op-parentheses" +# pragma GCC diagnostic ignored "-Wshadow" +# pragma GCC diagnostic ignored "-Wunused-function" +# pragma GCC diagnostic ignored "-Wunused-variable" +# pragma GCC diagnostic ignored "-Winvalid-offsetof" +# pragma GCC diagnostic ignored "-Wtautological-compare" +# pragma GCC diagnostic ignored "-Wswitch-bool" +# pragma GCC diagnostic ignored "-Wmacro-redefined" +# pragma GCC diagnostic ignored "-Wincompatible-pointer-types-discards-qualifiers" +#endif + +#if defined(_MSC_VER) +# pragma warning(disable: 4005 4100 4101 4189 4191 4200 4244 4293 4296 4309) +# pragma warning(disable: 4310 4365 4456 4477 4514 4574 4611 4668 4702 4706) +# pragma warning(disable: 4710 4711 4774 4800 4820 4996) +#endif +/* ------------------------------------------------------------------------- */ + #if defined(__GNUC__) # define _GNU_SOURCE 1 #endif diff --git a/lib/system/excpt.nim b/lib/system/excpt.nim index df28c1493..8d1e04b8d 100644 --- a/lib/system/excpt.nim +++ b/lib/system/excpt.nim @@ -216,7 +216,7 @@ proc raiseExceptionAux(e: ref Exception) = if not localRaiseHook(e): return if globalRaiseHook != nil: if not globalRaiseHook(e): return - when defined(cpp): + when defined(cpp) and not defined(noCppExceptions): if e[] of OutOfMemError: showErrorMessage(e.name) quitOrDebug() diff --git a/lib/system/repr.nim b/lib/system/repr.nim index 986994203..7f18ed31c 100644 --- a/lib/system/repr.nim +++ b/lib/system/repr.nim @@ -76,6 +76,7 @@ proc reprEnum(e: int, typ: PNimType): string {.compilerRtl.} = # we read an 'int' but this may have been too large, so mask the other bits: let e = if typ.size == 1: e and 0xff elif typ.size == 2: e and 0xffff + elif typ.size == 4: e and 0xffffffff else: e # XXX we need a proper narrowing based on signedness here #e and ((1 shl (typ.size*8)) - 1) diff --git a/lib/system/syslocks.nim b/lib/system/syslocks.nim index 7a113b9d4..a91a5e7d4 100644 --- a/lib/system/syslocks.nim +++ b/lib/system/syslocks.nim @@ -7,7 +7,7 @@ # distribution, for details about the copyright. # -## Low level system locks and condition vars. +# Low level system locks and condition vars. when defined(Windows): type @@ -75,12 +75,24 @@ else: type SysLock {.importc: "pthread_mutex_t", pure, final, header: "<sys/types.h>".} = object + SysLockAttr {.importc: "pthread_mutexattr_t", pure, final + header: "<sys/types.h>".} = object SysCond {.importc: "pthread_cond_t", pure, final, header: "<sys/types.h>".} = object + SysLockType = distinct cint + + proc SysLockType_Reentrant: SysLockType = + {.emit: "`result` = PTHREAD_MUTEX_RECURSIVE;".} - proc initSysLock(L: var SysLock, attr: pointer = nil) {. + proc initSysLock(L: var SysLock, attr: ptr SysLockAttr = nil) {. importc: "pthread_mutex_init", header: "<pthread.h>", noSideEffect.} + proc initSysLockAttr(a: var SysLockAttr) {. + importc: "pthread_mutexattr_init", header: "<pthread.h>", noSideEffect.} + + proc setSysLockType(a: var SysLockAttr, t: SysLockType) {. + importc: "pthread_mutexattr_settype", header: "<pthread.h>", noSideEffect.} + proc acquireSys(L: var SysLock) {.noSideEffect, importc: "pthread_mutex_lock", header: "<pthread.h>".} proc tryAcquireSysAux(L: var SysLock): cint {.noSideEffect, diff --git a/lib/windows/winlean.nim b/lib/windows/winlean.nim index d12c661d6..d00964a6d 100644 --- a/lib/windows/winlean.nim +++ b/lib/windows/winlean.nim @@ -309,9 +309,9 @@ when useWinUnicode: stdcall, dynlib: "kernel32", importc: "FindNextFileW".} else: proc findFirstFileA*(lpFileName: cstring, - lpFindFileData: var WIN32_FIND_DATA): THANDLE {. + lpFindFileData: var WIN32_FIND_DATA): Handle {. stdcall, dynlib: "kernel32", importc: "FindFirstFileA".} - proc findNextFileA*(hFindFile: THANDLE, + proc findNextFileA*(hFindFile: Handle, lpFindFileData: var WIN32_FIND_DATA): int32 {. stdcall, dynlib: "kernel32", importc: "FindNextFileA".} @@ -685,7 +685,7 @@ else: proc createFileA*(lpFileName: cstring, dwDesiredAccess, dwShareMode: DWORD, lpSecurityAttributes: pointer, dwCreationDisposition, dwFlagsAndAttributes: DWORD, - hTemplateFile: THANDLE): THANDLE {. + hTemplateFile: Handle): Handle {. stdcall, dynlib: "kernel32", importc: "CreateFileA".} proc deleteFileA*(pathName: cstring): int32 {. importc: "DeleteFileA", dynlib: "kernel32", stdcall.} @@ -715,10 +715,10 @@ proc createFileMappingW*(hFile: Handle, stdcall, dynlib: "kernel32", importc: "CreateFileMappingW".} when not useWinUnicode: - proc createFileMappingA*(hFile: THANDLE, + proc createFileMappingA*(hFile: Handle, lpFileMappingAttributes: pointer, flProtect, dwMaximumSizeHigh: DWORD, - dwMaximumSizeLow: DWORD, lpName: cstring): THANDLE {. + dwMaximumSizeLow: DWORD, lpName: cstring): Handle {. stdcall, dynlib: "kernel32", importc: "CreateFileMappingA".} proc unmapViewOfFile*(lpBaseAddress: pointer): WINBOOL {.stdcall, |