精华帖 (4) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-08-07
再贴一个函数:
00029 { 00030 HANDLE CompletionPort = NULL; 00031 NTSTATUS errCode; 00032 FILE_COMPLETION_INFORMATION CompletionInformation; 00033 IO_STATUS_BLOCK IoStatusBlock; 00034 00035 if ( ExistingCompletionPort == NULL && FileHandle == INVALID_HANDLE_VALUE ) 00036 { 00037 SetLastError(ERROR_INVALID_PARAMETER); 00038 return FALSE; 00039 } 00040 00041 if ( ExistingCompletionPort != NULL ) 00042 { 00043 CompletionPort = ExistingCompletionPort; 00044 } 00045 else 00046 { 00047 //这个地方就是创建一个内核对象,没错,IOCP是内核对象。 00048 errCode = NtCreateIoCompletion(&CompletionPort, 00049 IO_COMPLETION_ALL_ACCESS, 00050 NULL,//ObjectAttributes 00051 NumberOfConcurrentThreads); 00052 00053 if (!NT_SUCCESS(errCode) ) 00054 { 00055 SetLastErrorByStatus (errCode); 00056 return FALSE; 00057 } 00058 00059 } 00060 00061 if ( FileHandle != INVALID_HANDLE_VALUE ) 00062 { 00063 CompletionInformation.Port = CompletionPort; 00064 CompletionInformation.Key = (PVOID)CompletionKey; 00065 //从这里我们可以看出,这个调用仅仅是对filehandle进行调用,根本不关iocp的事情。 00066 errCode = NtSetInformationFile(FileHandle, 00067 &IoStatusBlock, 00068 &CompletionInformation, 00069 sizeof(FILE_COMPLETION_INFORMATION), 00070 FileCompletionInformation); 00071 00072 if ( !NT_SUCCESS(errCode) ) 00073 { 00074 if ( ExistingCompletionPort == NULL ) 00075 { 00076 NtClose(CompletionPort); 00077 } 00078 00079 SetLastErrorByStatus (errCode); 00080 return FALSE; 00081 } 00082 } 00083 00084 return CompletionPort; 00085 } kqueue在内核和驱动中运用很广,说他是整个任务机制的核心估计也不为过。kqueue为了不产生过多的线程,所以才会限制线程个数。这个整个系统的表现才会比较平稳。 |
|
返回顶楼 | |
发表时间:2007-08-07
00021 HANDLE
00022 STDCALL 00023 CreateIoCompletionPort( 00024 HANDLE FileHandle, 00025 HANDLE ExistingCompletionPort, 00026 ULONG_PTR CompletionKey, 00027 DWORD NumberOfConcurrentThreads 00028 ) |
|
返回顶楼 | |